Hot Chipsは企業からの製品技術の発表が多いが、一部は大学からの発表もある。その中で興味を引かれたのはMITが発表した110コアプロセサのスレッドマイグレーションという論文である。

110コアプロセサのスレッドマイグレーションに関して発表を行うMITのMieszko Lis氏

大学であるから、110コアの製品を作ろうというわけではなく、 多コアのプロセサを実現する上で問題となるチップ内の通信量を減らす方法を研究するのが目的である。

MITのRAWプロセサでは全体の39%の電力がインタコネクトの消費電力で、Intelの80コアの実験チップでも28%がインタコネクトの消費電力と発表されている。これが、コア数が増えると、インタコネクトの電力の比率がもっと大きくなってしまう。

多コアのシステムでは、各コアは高速小容量のL1キャッシュと、全コアで共有されるL2キャッシュを持ち、これをノードとして、多数のノードを2次元メッシュなどのインタコネクトで結合するという構成が一般的で、MITのAgarwal教授のTileraのプロセサもこのような構成になっている。

この構成では、使用するデータがL1キャッシュに収まっている場合は良いが、L1キャッシュがミスすると、そのデータを持っているノードのL2キャッシュをアクセスすることになる。これがチップ内インタコネクトに大量のトラフィックを発生させる。

各コアが高速小容量のL1キャッシュと、全コアでシェアする速度の遅いL2キャッシュをもつマルチコアプロセサで、L1キャッシュでデータが入りきらないと、そのデータを持つコアのL2キャッシュをアクセスする

結局、これは局所性(Locality)の問題で、遠くのノードのL2キャッシュのアクセスはインタコネクトを多く使い、エネルギーも多く使ってしまう。これが、近くのL2キャッシュのアクセスであれば負担は小さい。

これを、遠くのキャッシュをアクセスする替わりに、実行するスレッドをデータを持っているL2キャッシュの近くのコアに持っていけば、遠くのL2キャッシュのアクセスが近くのL2キャッシュのアクセスになり、負担が小さくなるというのが、この研究の基本的アイデアである。しかし、実行中のスレッドを他のコアに移動するには効率的なサポートハードウェアが必要になる。

リモートのL2キャッシュのアクセスは負担が重く、ローカルのL2キャッシュのアクセスが望ましい。そのためには、データのあるL2キャッシュのところのコアに処理を移せばよい

スレッドの移動は頻繁に行われるので、高速に移動できることが望ましく、OSが介在するとか、往復のトラフィックが発生するような方法は望ましくない。また、移動するスレッドは細粒度とし、移動するコンテキストも小さくすることが望ましい。

しかし、現実的な評価をするためには、多数のコアを持つシステムが必要になる。

スレッド移動の要件

ということで、簡単なコアとスケーラブルなメモリモデルを持つ110コアのチップを開発したという。チップは45nmプロセスで作られ、チップサイズは10mm×10mmで、2つメモリインタフェースを持っている。各コアは32KBのL1データキャッシュと8KBの命令キャッシュを持ち、2次キャッシュは持っていない。そしてコア間は2次元メッシュで結合されている。

110コアを搭載するチップを45nmプロセスで開発。1レベルのキャッシュを持ち、2次元メッシュでコア間を結合する

次のスライドの中の拡大図のように、キャッシュがプロセサタイルの半分の面積を占めているという。コアは独自アーキのスタックベースの構造で、命令ごとの粒度で移動ができ、コンテキストも最低128bitという小さい単位で移動できるようになっている。また、2スレッドのSMTをサポートし、移動によってデッドロックに陥らないようにしているという。

2次元メッシュのノード間の接続は、6本の接続があり、6個のルータが存在する。ルータは64bitのフリットを次元オーダでワームホールルーティングする。混雑がない場合は、ルータの通過時間は1サイクルである。

インタコネクトの6つのルータを持ち、コアは独自アーキのスタックベースの構造になっている

スレッドの移動は、次の図のIのステップでPCをパケットのヘッダに入れ、引き続きスタックから移動するコンテキストをパケットに入れる。PCを入れるとパケットの転送が始まるので、Iのステップの遅延は1サイクルである。

そして、IIで目的のノードまでH個のルータを経由して到着するのにHサイクル掛かる。そして、IIIで目的のノードのコアにPCを入れるのに1サイクル、IVでコンテキストをスタックに入れるのにBサイクルかかる。

I~IVのステップで超高速でスレッドの移動を行う

製品であれば、各コアは専用のL1キャッシュと全コア共用の2次キャッシュをもつというのが普通の設計であるが、この実験チップではL2キャッシュが搭載できないので、L1データキャシュを全コア共用のキャッシュとし、それぞれが32KB分のメモリアドレスを分担している。つまり、メモリアドレスの上位7ビットがどのコアのキャッシュにデータがあるかを示している。このように、L1キャッシュは共用キャッシュとして使われるので、他のコアのキャッシュから読んできたデータを格納することはできないようになっている。

他のコアのキャッシュからデータを読んでくるためには、要求を送り、データを受け取るという往復のトラフィックが必要であるが、PCとコンテキストを送るという方法は片方向の通信だけで済むので、実行移動のほうがリモートアクセスより効率が良い。

各コアのL1データキャッシュは、全コア共用のキャッシュで、32KB分のアドレスを分担する

実行コアを移動するかどうかは、プログラムに移動命令を書いて指示する、コンパイラが解析して静的に指示するという方法もあるが、自動的に行う場合は予測機構を使う。次の図のように、メモリアクセスがコアA、A、B、Aとなっている場合は、Bのアクセスは1回だけでAに戻るので、Bに移動するより、RA(Remote Access:リモートアクセス)としたほうが効率がよい。しかし、その次にC、C、C、CとコアCのアクセスが続くので、ここはEM(Execution Migration:実行移動)するほうが良い。このようなパターンをテーブルに記憶して学習して、移動すべきかどうかを決定する。

実行コアを移動するかどうかを予測機構で判断する