x86マルチCPUのモデルが見え始めた

 マルチCPUプログラムといっても、スレッド同士が密接なものもあるし粗放なものもある。これはハードウェアの構造に強く依存する。スレッド同士が密接に出来ないのであれば、マルチCPUを多様な処理に適応することはできない。しかし、密接にすれば、幾つのメモリ空間とかCPU間のデータ移動にかかるレイテンシを意識してプログラムする必要が出てくる。このところIntelもアレイプロセッサも試作して方向性を模索していたが、最近の発表を聞くと結論がでたようだ。

 1つは共有メモリモデルをすてない事 http://pc.watch.impress.co.jp/docs/2007/1012/kaigai393.htm もう1つはL3キャッシュでCPU間のコンヒーレンシを保つ事 http://pc.watch.impress.co.jp/docs/2007/1018/kaigai394.htm

 共有メモリモデルは単一のメモリ空間を想定すれば良い一方、マルチCPUのメモリアクセス機構が複雑になってしまう。このため、あまり多くのCPUコアを経済的に載せるのが難しい。実際4-8コアを想定している次世代CPUでは、キャッシュの階層を増やしL3キャッシュでコア間のデータ共有をするらしい。AMDも同様だ。そのためCPU間でデータを共有するとレイテンシが40-50クロックにもなる。これはメモリへアクセスする半分の時間もかかるわけで、メモリアクセスのレイテンシを減らす効果は少なく、メモリ帯域を減らす効果の方が多いのじゃないだろうか。またアレイプロセッサが良く持つ共有レジスタも持たない。

つまり、現在のプログラムスタイルを変えずに比較的疎結合されたスレッドをつくる。10年くらいは現在のマルチスレッドプログラムでいけるだろう。Intelの想定するCPUに近いのはSUNのniagaraのようなCMTができる少数のCPUコアによるハイスループットCPUだ。これならば、キャッシュコンヒーレンシがとりやすく、レイテンシも隠蔽できて高効率だ。性能と保守的なプログラムスタイルを両立し汎用性がある。

 GPUは別のプログラムスタイルで演算能力に特化した形で残っていきそうだ。なにしろ次のGPUで2T flopsを超えるらしく、CPUでは到底おいつけない。少しでも演算力の必要な人ならプログラムスタイルも問題にならないだろう。