M7では、色々な新機能のサポートがあるが、その中の1つが細粒度のメモリのマイグレーション機能である。メモリの取得、解放を繰り返すと使っているメモリ領域がバラバラになり使用効率が悪くなる。このため、Javaなどではガーベッジコレクションを行うのであるが、このためには通常の動作を止めてガーベッジコレクションに専念する必要があるし、OSのページ保護機構も操作する必要が出たりしてオーバヘッドが大きい。M7のこの新機能は、OSのページ保護機能をバイパスして、そのメモリ領域を使っているプログラムが動作している状態で、実メモリアドレスを移動することができる。これはJavaなどの実行には威力がありそうである。

M7ではプログラムの実行中にメモリ番地を移動する細粒度のメモリマイグレーション機能がサポートされた

また、M7ではクエリ用のアクセラレータが追加された。インメモリの行形式のデータベースのデータを列形式に並べ替えたり、データのデコンプレッションと列データに対して各種のクエリを実行する。メモリコントローラと同じインタフェースに接続されており、メモリとL3キャッシュに高バンド幅のアクセスができる設計になっており、高いスループットを持っている。

M7では、データベースの列-行の並べ替え、デコンプレッション、各種クエリを実行するアクセラレータが搭載された

このクエリアクセラレータは8台あり、それぞれが4本のパイプを持っているので、M7チップ全体では32系統のクエリを並列に実行できるようになっている。

大規模システムを構成するため、M7はチップ間のSMP接続リンクを持っており、8チップまでグルーレス(直結)で接続できるようになっており、ディレクトリベースのキャッシュのコヒーレンスプロトコルを使って、SMPを構成することができる。これはM6とおなじである。

グルーレスで8チップのSMPを構成できるのは、M6と同じ

さらに大規模なシステムに対しては、次の図のように、スイッチASICを使って最大32チップのシステムまで拡張することができる。これもM6と同じであるが、プロセサチップのコア数が増えたので、M7では32チップ×32コア×8スレッドで、最大8192スレッドの実行ができるようになった。そして、SMPのメモリは最大64TBまで接続できる。SMPネットワークのバイセクションバンド幅は5.2TB/sとなり、これはM6の4倍となっている。

最大32チップのSMPが構成できるのはM6と同じであるが、チップのコア数が増え、1024コア、8192スレッドのシステムが作れるようになった

Ram Sivaramakrishnan氏とSumit Jairath氏によるM7のキャッシュ階層の発表では、M7で新規に採用されたL3キャッシュアーキテクチャの考え方が詳しく説明された。

次の図のように、2コアで256KBのL2 Dキャッシュをシェアし、それを2ユニット並べて、共用の256KBのL2 Iキャッシュと、8MBのL3キャッシュを接続している。これがパーティションという単位である。

パーティション内のL3キャッシュのロードユースレーテンシ(おおよそアクセスタイム)は41サイクルとなっている。64MBの単一のL3キャッシュとすれば、もっとアクセス時間は長くなってしまう。従って、分割して使える場合は、分割した方が性能を上げられるという判断である。

コアクラスタとパーティションの構成

そして、8つのパーティションと4つのSMPとIOのゲートウェイ、左右のそれぞれ4つのスケジューラとDAX(アクセラレータ)がOCNで接続されている。OCNへの接続ポートは片方向64GB/sのバンド幅を持っている。

M7チップの構成

L3キャッシュのアクセスはPeer-to-Peer Requestと呼ぶ、L3キャッシュ全体をひとまとめに扱うプロトコルと、Mediated Requestと呼ぶプロトコルをサポートしており、Peer-to-Peerの場合は、自パーティションのL3キャッシュをミスするとOCNのリングにスヌープを出し、それぞれのパーティションはミスしたアドレスのデータの有無を返す。そして、ミスしたアドレスのデータを持っているパーティションがメッシュネットワークを使ってデータを送るという流れになる。

Peer-to-Peer Requestの処理フロー

一方、Mediated Requestの場合は、ミスが発生したパーティションはSMPゲートウェイにリクエストを送り、ゲートウェイはディレクトリを見てどのMCUが担当かを判断してRead Requestを送る。そしてMCUはメモリを読んで、ミスが発生した要求元にデータを送る。この場合は8MBのL3キャッシュパーティションは独立して動くことになる。

Mediated Requestの処理フロー

また、実行すべきスレッドがたくさんある場合は、それぞれのパーティションが独立して処理を行えばよいが、順次実行の部分では1つのパーティションしか実行するスレッドがなく、他のパーティションは遊んでしまう。仕事が無いのでコアが遊ぶのはやむを得ないが、L3キャッシュまで遊ばしておくのは勿体ない。ということで、この場合はアイドルのパーティションのL3キャッシュをビクティムキャッシュとして、アクティブなパーティションのL3キャッシュを追い出されたキャッシュラインを格納するのに使う。そうすると、アクティブなパーティションで実行するスレッドのビクティムキャッシュを含めたL3キャッシュ全体のミス率が減り、アクティブなスレッドの実行性能が、その分、向上する。

このようなL3キャッシュパーティションの使い方はワークロードの振舞いに応じてダイナミックに切り替えられる。

ダイナミックにL3キャッシュのパーティションを変更する例

ということで、SPARC M7は、巨大L3キャッシュをどのように使えば効率的かということを良く考えて作られたプロセサという感じである。

また、Oracleは、小規模ノードのクラスタでは性能を出しにくいデータベースなどを効率よく処理する大規模SMPにこだわり、今回のM7ではクエリのアクセラレータをつけるなど、Oracle DBを始めとするビジネスソフトを社内にもつ強みをうまく発揮したサーバ作りを行っていると言える。