Hot Chips 28においてOracleは、これまでソフトウェアで実現されていたデータベースの処理機能をハードウェア化し、Software in Siliconと称する「SPARC M7」プロセサを発表した。発表者は、プロセサのアーキテクチャ関係は、Kathirgamar Aingaran氏が発表し、ソフトウェア関係はDavid Lutz氏が発表を行った。

Oracle M7プロセサを発表するOracleのKathirgamar Aingaran氏(左)とDavid Lutz氏(右)

SPARC M7は32コアを集積する巨大チップで、クロックは4.1GHzと相当に速い。消費電力は膨大と思われるが、チップサイズや消費電力は発表されていない。なお、この発表は、データベースの実行を高速化するためにどのような機能をハードウェア化したのか、性能改善はどの程度かという発表で、プロセサの発表ではないので、プロセサチップの話はほとんど出てこない。

Oracle M7プロセサのダイ写真と概要。32コアを集積し、4.1GHzクロックで動く (このレポートのすべての図は、Hot Chips 28でのOracleの発表スライドのコピーである)

クロックは上がらないし、消費電力の制約から、同時には動かせないダークシリコンも問題となって来ており、さらなる性能向上のためには、別の道を探さなければならない。一方、プロセサの使われ方を見ると、トランザクション処理からアナリティックに重点が移っており、データ並列の処理が中心になって来ている。この分野で、ハードウェアとソフトウェアのコデザインで最適化を志向する。つまり、シリコンの中にソフトウェアを組み込むというアプローチである。

シリコンに組み込むソフトウェアとしては、アナリティックに使われる簡単なデータ並列のSQLプリミティブが候補となる。次の図に見られるように、Decode values、Sum Aggregation、Hash Join、Bloom Filter Join、Simple Filter、Range Filterなどの機能である。また、データのInline Decompressionもコストを掛けないで実現できる。

ただし、データベース全体をDRAMやNVMに載せるためにメモリフットプリントの削減やセキュリティの強化が必要になるという。

シリコンの中に組み込む機能の候補

インメモリのデータベースの場合、セキュリティは非常に重要である。SPARC M7では、暗号化のアクセラレータを持ち、メモリデータを暗号化する。それに加えて、メモリに14色の色を付け、同じ色のポインタでなければメモリをアクセスできないようにするという方法で保護を強化している。メモリの色付けは64バイト単位で行っている。このやり方をOracleは「Silicon Secured Memory」と呼んでいる。

SPARC M7では、暗号化とメモリの14色の色分けでメモリの保護を行っている

Silicon Secured Memoryを使うと、正常なプログラムはメモリをアクセスできるが、マルウェアに乗っ取られたプログラムが、メモリをアクセスしようとしてもポインタの色とメモリの色が異なっているとアクセス違反となってブロックされてしまう。この機能をつけてもOLTPの性能は変わらず、性能影響はないという。

ポインタの色とアクセスするメモリブロックの色が違うとアクセスがブロックされる

SPARC M7は、SQLのシリコン化を行うData Analytics Accelerator(DAX)というユニットを8個搭載している。DAXは、Decompress、Unpack/Align、Predicate評価、結果のFormat/Encodeのパイプラインとなっている。DAXは、このようなストリームで処理できるものだけを担当し、より複雑な処理は汎用CPUコアに任せる。

DAXは、Decompress、Unpack/Align、Predicate評価、結果のFormat/Encodeのパイプラインでストリーム的な処理を行う。SPARC M7は、8台のDAXを持つ

DAXは、次の図のScan、Translate、Select、Extractなどのコマンドを実行し、これらの組み合わせで必要な処理を実現する。そして、DAXの手におえない処理は汎用コアに任せてしまう。

DAXはScanやTranslateなどのストリーム的に実行できる処理を受け持つ

DAXの呼び出しはシステムコールと類似のやり方で行う。普通のforkシステムコールと違って、DAXで動くスレッドが生成され、呼び出し元のスレッドと並列に走ることになる。パラメタの受け渡しや、DAXの処理結果は共有メモリを使ってやり取りされる。

DAX呼び出しが行われると、DAXスレッドが作られて、元のスレッドと並列に走る。データの受け渡しには共有メモリが使われる