イベント
[GDC 2009#30]ついにソフト開発者向け情報も出てきた「Larrabee」
そもそも,Larrabeeとはなんなのかを含め,おさらいなどを兼ねて軽くまとめておきたい。
まず,LarrabeeはメニーコアのCPUないしGPUである。Core 2 DuoやQuadが2コアや4コアをまとめた構成になっているのに対し,Larrabeeはコアを数十個詰め込んだ感じのCPUになる見込みだ。実際の製品で何個詰め込まれるかは不明だが,以前1TFLOPSを達成したとされたときの構成では,80コアを集積したということなので,製品が出てくるときには同じくらいのコアが載ったものになっていても不思議はない。
多くのコアは256KBずつのL2キャッシュを介してリングバスでつながれている。あってもおかしくなさそうな共有メモリ部分や3次キャッシュまでは用意されてないようだ。
Larrabeeには,1コアあたり,x86命令を普通に実行するスカラ演算ユニットが1個あり,512ビット幅(32ビット×16)のベクトル演算ユニットがセットになっている。ベクトル演算というのは,複数の演算処理をまとめて行うことだ。さらに,それぞれの演算ユニットでは同時に最大2スレッドずつ実行可能で,コアあたりでは最大4スレッドの同時発行が可能とされている。
さて,Intel のx86 CPUでベクトル型演算器を初めて搭載したMMXでは,64ビットレジスタに複数のデータを詰め込んで一気に演算することができた。当時は,音声データ処理が中心であったので16ビット整数演算を4個同時に行うことが想定されていた。
続くSSEでは,128ビットレジスタが採用され,浮動小数点演算に対応したものになった。ビット数が倍になると,一気に演算できる量が増えるので,単純に演算能力も倍になると考えていいのだが,SSEでは,従来1クロックで演算されていたものが最低2クロックを要することになったのは残念だった。
今後登場するとされているAVXでは,256ビットレジスタで同様のことを行うのだが,Larrabeeではいきなり512ビットである。しかもほとんどの命令を1クロックのスループットで実行するという。単純に考えて,非常に高速な演算器に違いない。
Intelのx86コア+ベクトル演算ユニットという流れで見ると正常進化の流れが急に早まったという感じなのだが,内容的には従来のものとはかなり違い,多分にGPUを意識した内容となっている。
GPUと比べて性能はどうなんだと気にする向きも多いと思うので,演算部分だけを取り出して模式的な計算もしておこう。
Larrabeeが80コア×16ベクトル×2命令で1TFLOPSを達成したとすると,だいたい500MHz弱くらいで動いていたことになる。
GPUの代表として,240SP×3命令×1296MHzで933MFLOPS(ワークステーション用では1TFLOPSの製品もある)のGeForce GTX 280が,だいたい同じくらいの演算性能であると考えていいだろう。
80個もCPUを詰め込んで値段はいくらになるのかとか,そんなものを量産できるのかとか,そもそも80個なのかといった問題はとりあえず置いておこう。
1コアあたりに目を向けると,それぞれが普段使っているCore 2 Duoなどと同様に,x86アーキテクチャのCPUになっている。単にx86のCPUなのであれば,100個つなごうが200個つなごうがゲームにはほとんどメリットがないのだが,それぞれで新しい命令が追加されている。そのLarrabee New Instructionがいかに強力なものであるのかというのが,本日の主題だ。
単純な演算能力以外に,そもそもなぜ512ビットなのか。16個の演算を同時に行うことができるようにすることがいかに重要であるのかなどが,今回の講演で語られたので紹介しておく。
ちなみに講演を行ったMichael Abrash氏は,id Softwareで「Quake」の開発に参画したり,MicrosoftでXbox事業に関わったりとゲーム開発を熟知したプログラマーである。
Larrabeeに搭載された新命令は,グラフィックス処理を強く意識したものとなっている。フォーマットの変換命令や,複数の点のデータをまとめてもってこられるGatherや,データを複数の点に分けて書き込めるScatterなど,一度でたくさんのことができる便利な命令群が多い。Gatherは,DirectX 10.1対応のGPU以降でサポートされているものだが,それが4点をまとめて取ってこられる仕様なのに対して,16点の一括サンプリングが可能なものになっている。
ベクトル部分は基本命令形態自体も,x86とは別物で,MIPS CPUのようなニーモニックに続いて3オペランドのものとなっており,
VMADPS V0,V1,V2 ;V0=V1×V2
のように,計算結果を格納するレジスタを真っ先に指定するような仕様の命令体系が採用されている。いうまでもなく,演算結果をどこかに保存する際には1命令少なくて済む。
また,新しく追加されたマスクレジスタをうまく使えば,いろいろな部分が効率化できる。
実際,ほとんどのものが非常にうまく並列化できたという……ラスタライズ以外は。
座標数値としてのポリゴン(三角形)を画面に表示するピクセル単位に変換していく処理をラスタライズというが,この部分を効率よく並列化させることが非常に難しく,性能がまったく上がらなかったのだという。
そこでAbrash氏らは,画面を4×4に分割して端から走査していく手法を考え出した。(いまとなっては懐かしき)タイルベースの処理に近い。4×4のエリアに分割し,小区間ごとにラスタライズを進めていくのだ。
Larrabeeでは,画面を4×4の16個に分割して処理を進めていくなど,16個単位で処理を進めると効率がよい。16に分割されたそれぞれのエリア内にポリゴンはあるか,あった場合は領域をさらに16に分割して,どこにポリゴンがあるかを1ピクセル単位になるまで繰り返していく。この方式では,たとえば,4096×4096ドットのディスプレイを使っていた場合でも6回で1ピクセル単位にまで限定できる。
この場合,その区間がポリゴンにまったく無関係か,一部だけ含んでいるか,ポリゴン全体が入っているか,逆にポリゴンの中にその区間が入っているかなど,場合分けして処理を行っているという。
とりあえず重要なことは,難関であったラスタライズの並列化が解決され(まだパフォーマンスに満足してないようだが),Larrabeeの実用化にも十分なめどが立ったらしいということだ。いつ発表されるのか,いくらくらいになるのかなど,興味は尽きないが,今後Intelがグラフィックス分野で大きな動きを見せるのは間違いないだろう。
まあ,なんとなくPS2やCellのVPUでのプログラミングを思い起こさせる談話だが,Larrabeeの場合は,あそこまで非人間的なプログラム管理は要求されないとは思う。しかし,一般のプログラマーは,アセンブラコードを駆使するより,C++言語なりでプロセッサのパワーが引き出せれば満足するだろう。それについてはすでにIntelによってLarrabee用のプロトタイプライブラリが用意されている。
次のプレステはLarrabeeを使うんじゃないかとかいう噂も流れるくらい注目されている製品である。Intelの動きと他社の対応が,今後のゲームに与える影響も大きなものが予想されるので,今後も注目しておきたい技術である。
- 関連タイトル:
Xeon Phi
- この記事のURL: