Game Developers Conference 2009現地レポート

西川善司の3DゲームファンのためのIntel・Larrabee講座
3Dグラフィックス大革命。Intel・LarrabeeはDirectXとGPUをぶちこわすのか

セッションの様子

3月23~27日開催(現地時間)

会場:サンフランシスコ Moscone Center



 「なにやら凄いプロセッサらしい」と、開発者の間でも話題もちきりのIntel、Larrabee。しかしこのLarrabee、開発していることはIntelも明らかにしているし、2008年から技術的なドキュメントもたくさんリリースされ始め、オフィシャルサイト的なものも立ち上がりかなりのイケイケムードなのだが、リリース時期は去年から一貫して「未定、もうすぐ」の一点張り。

 そんな謎の多いLarrabeeだが、徐々にそのベールははがされてきている。今年のGDC2009では、「Rasterization on Larrabee:A First Look at the Larrabee New Instructions(LRBni)in Action」、「SIMD Programming with Larrabee:A Second Look at the Larrabee New Instructions(LRBni)in Action」の2セッションにてIntelは、Larrabeeの命令セットについての情報開示を行なった。

 PC Watchでは幾度となく話題に上っているLarrabeeだが、GAME Watchではあまり取り上げられたことがない。そんなわけで、GDC2009で行なわれた上記2セッションの内容をまとめると共に、Larrabeeの基本情報も整理しておくことにしたい。



■ Larrabee登場の時代背景

Intel、Michael Abrash氏
CPUの進化の方向性
CPUの進化は、これまでとは違った方向へ
CPUはマルチコア化の道を選ぶ

 コンピュータープログラムとしてのソフトウェアを動作させるのがCPUであり、20世紀ではこのCPUの高クロック化こそがソフトウェア実行のための最もシンプルなCPUの進化の方向性だった。

 またCPUは、1クロック当たりの処理内容を増やす方向性で命令の同時発行、非依存関係命令の順不同実行を行なうための進化に明け暮れ、この進化を実現するために製造プロセスを微細化していき、同じ面積内により多くのトランジスタを高集積させていく。こうしてCPUがどんどん高速化していく中で、CPUとシステムメインメモリとの速度差が開いていき、この速度差の解消というかメインメモリへのアクセス低減のためにキャッシュメモリの増大を推し進めていく。

 こうして進化してきたのが、IntelのCPUでいけば初代PentiumからPentium 4くらいまで。この辺りでCPUメーカーは、熱密度の問題やらリーク電流問題やらで、これまでCPUを進化させてきた常套手段に限界が近づいてきたことを知る。そこでCPUメーカーは新しい進化の方向性として、なるべく多くの複数のCPUコアを1チップに詰め込み、できるだけそれらを多く同時に動作させて性能を引き出すような、マルチコアCPU化の道を選ぶ。

 このマルチコアCPUで最大性能を得るためには、マルチコアCPUに搭載されている複数のCPUコアを同時に稼働させるように、ソフトウェア構造の方を改めなければならなくなる。マルチコアをフル活用できるソフトウェア構造とは、つまりいわゆる「ソフトウェアのマルチスレッド化」のこと。この頃から、ソフトウェア技術者は「マルチスレッド化」を半ば強要される形になる。

 この時代の潮流に生まれたのが、IntelでいうところのCore DUOとそれ以降のCPUに相当する。この「マルチコアCPU大前提、ソフトウェアはマルチスレッド化大前提」という21世紀のビッグトレンドは、Intel以外にも必然的に波及することとなり、2005年以降発売されたPS3、Xbox 360といった今世代ゲーム機がこぞってマルチコアCPUを採用し出したことは、偶然ではなく完全な必然だ。

 一方、20世紀最後の10年に新興プロセッサとして突如台頭したGPUは、もともと3Dグラフィックスの描画アクセラレータとして最初姿を現わしている。最初期のGPUは頂点データ、ないしは描画するピクセルデータに対して、決まり切ったベクトル公式演算からなる陰影処理を行なうことを生業としていた。ただし、頂点データもピクセルデータも量が膨大で、高速にこれらを処理するためには、GPU内のベクトル演算器を増やしていく必要があった。これが最初期のGPUの進化の方向性だ。

 代わり映えのしない3Dグラフィックスを高速に描画するだけの進化に一段落したGPUは、表現力向上の方向へ進化を始めるのだが、その際に新しい3Dグラフィックス表現機能を1つ1つ追加していくことが非効率であることにふと気がつく。そこで「3Dグラフィックス表現機能はソフトウェアの形で実装していこう」という革命的発想が生まれ、これがいわゆる「プログラマブルシェーダーアーキテクチャー」の誕生へとつながる。

 21世紀のGPUは、プログラマブルアーキテクチャーの発展とともに進化していき、最初期のGPUではシンプルなベクトル演算器だったGPUコアは、だんだんと高度なロジックをこなせるようなCPU的なプロセッサへと姿を変えていく。

 CPUはマルチコアへ進化し、高度なロジックをマルチに走らせる方向に。GPUはプログラマビリティを向上させ、マルチに走らせていたロジックをより高度化させる方向に。

 CPUとGPUは、元々自分の得意分野が相手の不得意分野という補間関係にあり、課された進化の方向性とは、それぞれの自身の不得意分野の強化であり、それはお互いを似せていくこととなっていった。この進化の方向性に気がつくのは簡単だったが、「この進化の方向性に何を見たか」の部分では各社に違いがあった。

 CPUメーカーAMDは、2006年にATIを買収。AMDはこの進化の先に「CPUとGPUの統合」という姿を見る。GPUメーカーのNVIDIAは、この高度化したGPUを、GPUのままの姿でそれまでCPUに独占されていたHPC(High Performance Computing)分野への応用を目指す。CPUメーカーのIntelは、この両者が互いに近づいていく進化の様子を見て、この進化を一足飛びに加速させた姿を思い描く。これがLarrabeeだ。

Larrabeeは、Intelが出した「CPUとGPUの進化の先にあるもの」

■ Larrabeeとはなにか?

 「Larrabeeは○○である」という言い切り方は、その見方によっていろいろできるのだが、本連載の読者にイメージしやすい例えをするならば、「GPUの中のシェーダーユニットがすべてPentiumになってしまったもの」といい表すのが1番わかりやすいことだろう。下図は、Intelが公開しているLarrabeeのブロックダイアグラムだ。

Larrabeeの全体ブロック図

 図中の黄色いマスの1つ1つが、x86コアになる。そして各x86コアのベースとなっているのは、初代Pentium(P54C)コア。最新CPUのような、非依存関係の命令を順不同実行するアウトオブオーダーには対応していない。Larrabeeの各x86コアは、順次実行方式のインオーダー型の短いパイプラインアーキテクチャを採用しており、「例え」としてではなく本当にPentiumコアライクだ。

 図には黄色いマスの数がわからないような略図になっているが、実際にx86コアが何個になるのかは非公開となっている。ここは最終段階の量産型Larrabeeの製造で使用される製造プロセスに深く関係する部分なので、本当にまだ決めかねているのだろう。ただ業界関係者達の下馬評では、「少なく見積もっても10個以上」というのが定説となっている。

 さて、上で「Larrabeeは、シェーダーがPentiumになったようなもの」という例え話をしたが、本当に各x86コアはPentium CPUとしてフルポテンシャルが与えられている。

 GPUのシェーダーユニットとは違い、キャッシュメモリも有しているし、仮想メモリもサポートされるし、当然ページスワップもサポートされる。割り込み処理が入ればコンテクストスイッチングもなされる。つまりOSだって、ゲームだって1コアだけで動かせるのだ。

 ただし、まったく当時の初代Pentiumというわけではなく、21世紀型のデータ並列コンピューティングに適応させた拡張仕様が盛り込まれている(後述)。

 初代Pentiumとの違いは結構多い。初代PentiumにはL1キャッシュが命令8KB、データ8KBという構成だったが、Larrabeeの各x86コアではそれぞれが32KBずつと容量が増量されている。

 初代PentiumにはL2キャッシュがなかったが、Larrabeeの各x86コア内にはL2キャッシュとして256KBが実装される。各x86コア内L1キャッシュとコア内L2キャッシュ向けのプリフェッチ命令も提供され、256KBのキャッシュメモリをストリーミングバッファやスクラッチパッドメモリ(多目的ワークエリア)として利用することも可能だ。

 このL2キャッシュの使い方は、CELLプロセッサのSPE(Synergistic Processor Element)の仕組みとよく似ている。ただし、各x86コア内L2キャッシュはコヒーレンシー(一貫性)が完全に維持されるタイプのキャッシュメモリとしても利用できるため、実行させるアプリケーションの種類に応じて自在に使い分けられる。このあたりのコンセプトは、CELLプロセッサのSPEのあり方を改善したものといえるかもしれない。

 各x86コアが時計回り、反時計回りがそれぞれ512ビット幅ずつ、合計1,024ビット幅のリングバスで接続される構造もCELLプロセッサのSPEとそっくりだ。

 こうしてみてくると、なんだかコア数の多いマルチコアCPU(あるいはシェーダーユニットの数が少ないGPU?)のように思えるが、マルチコアCPUにはあり得ないユニットがブロック図中にある。それは緑色のマス「Texture Logic」だ。これはLarrabeeをGPU的に活用したときに活躍するもので、一般的なGPUでいうところのテクスチャユニットに相当する。Laarrabeeでもフィルタリング処理付きのテクセル参照などを行なう際には、こちらの専用ユニットを利用することになるのだ。

 逆に専用ユニットは、このテクスチャユニットだけ。GPU的にLarrabeeを使う場合、テクスチャユニット以外の他の3Dグラフィックス系処理はすべてソフトウェアで書かなければならない。

すべての処理をソフトウェアで書かなければならないが、逆に言えばできないことはなにもない。そこにLarrabeeの強みがあるLarrabeeに内蔵されるテクスチャ専任ユニットの構造

■ Larrabeeの内部構造とLarrabeeの特徴

 下図左は、各x86コアに対してクローズアップしたブロックダイアグラムだ。さらに、この図に含まれている「ベクトルユニット」をクローズアップした物が下図右になる。これを見ながら、x86コアに拡張されている「21世紀的仕様」を見ていくこにとする。

Larrabeeに含まれるx86コアのクローズアップx86コア内のベクトルユニットをさらにクローズアップした図

x86コアあたりハードウェアスレッドは4つ
16ワイド・ベクトルユニット

 まずx86コアは、ハードウェアレベルのマルチスレッディングに対応している。これは、最近のIntelのCPUでいうところのHyperThreadingに相当するもので、実体はプロセッサが1個でも見かけは複数の論理プロセッサに見せて、同時に複数スレッドを走らせて命令実行ユニットを高効率に回したり、あるいはメモリアクセスレイテンシーを隠蔽する役割を果たす。

 スカラユニットは、P54CのようにUパイプライン、Vパイプラインの2元構成。Vパイプラインがメインで、Uパイプラインがサブな関係はまさしくP54Cそのまんまだが、64ビット整数(int64)に対応し、いわゆる64ビット化拡張が図られている。

 そして、スカラパイプラインからお裾分けされるされるような形で接続されるベクトルユニットは32ビット整数(int32)、32ビット浮動小数点(FP32)、64ビット浮動小数点(FP64)に対応している。

 ベクトルユニットは16ワイド・ベクトルユニットであり、すなわち16個のint32ないしはFP32のデータを1クロックで演算できるポテンシャルがある。なお、FP64を取り扱った場合はスループットは半分になる。

 x、y、zの3D計算でも3要素ベクトル。Larrabeeの取り扱える16要素のベクトルという物自体に想像が付きにくいが、これはかみ砕いて言うと「16個の異なるアドレスからデータを読み出して、演算して、これを書き出す」(Gather処理/採集処理)、「読み出したデータを演算して、これを16個の異なるアドレスへ書き出す」(Scatter処理/拡散処理)が行なえることを意味している。

■ Larrabeeってビデオカードなの?

3DグラフィックスパイプラインをLarrabeeで実装すると、ほぼすべてのフェーズがソフトウェアで構成されることに。図中のマスが固定機能ユニット、雲のようなモヤモヤがソフトウェアで構築されるもの

 このようにLarrabee内の各x86コアは64ビット拡張化され、データ並列コンピューティングのポテンシャルを与えられた、一基で64ビットOSを動かせるポテンシャルがあるほどのCPUとなっていることがわかる。

 では一体、Larrabeeはどのような形でユーザーに提供されるのだろうか。これは、当初はビデオカード(グラフィックスカード)のようなPCI-Expressバス・スロット接続の周辺機器ボードとして提供されると見られている。Larrabeeプロセッサ本体とそれに数GB程度のメモリが組み合わされ、さらにはディスプレイコネクタなどが配された、当初はビデオカードとして使えるような提供形態になると見られる。

 Larrabeeは、ここまで解説してきたようにCPU/GPUハイブリッドプロセッサなので、CPU的なポテンシャルが高いことは明白。よって、マザーボードにLarrabeeだけを搭載して、CPU的な汎用処理もGPU的な3Dグラフィックス処理も1基だけでこなしてしまうPCシステムが実現できなくはないだろうが、パフォーマンス的な側面から短期的にいきなりそこに行き着くことはないと思われる(第1世代のLarrabeeは、CPUとGPUの双方の仕事を兼任できるほど高速ではないと目されているため)。

 PC Watchの後藤弘茂氏の連載記事にもあったような、次期プレイステーションへのLarrabee採用検討がなされている噂が話題となっているが、こちらもメインプロセッサとしてではなく、GPU専任プロセッサとしてLarrabeeを評価しているという説が有力だ。

 ただ、困ったことに、Larrabeeは、単体ではただのプロセッサであり、ハードウェアとしては3Dグラフィックスの処理機能がない。Larrabeeで3Dグラフィックス処理をやらせるには、3Dグラフィックスパイプラインをソフトウェアで実装する必要があるのだ。

 3Dグラフィックスパイプラインは、極力簡略化して言い表すと各種プログラマブルシェーダー(頂点シェーダー、ピクセルシェーダーなど)、ラスタライザユニット、レンダーバックエンドといった機能が必要になる。

 プログラマブルシェーダーは、まさにLarrabeeのx86コアのCPUとしての本領が発揮できる部分なので問題はない。ラスタライザユニットは、データ上では1次元的な頂点情報の羅列でしかないポリゴンを画面上のピクセルに割り当てる処理だが、これはLarrabeeには搭載されていない。

 レンダリング結果をメモリシステムに書き込む際に深度バッファを検証更新したり、アンチエイリアス処理を行なったりする、レンダーバックエンドもLarrabeeには存在しない。こうした機能はソフトウェアで構築するしかないのだ。

■ GDCで一般初公開となったLarrabeeの命令体系

Intel Larrabee Architect Tom Forsyth氏

 今回のGDCでは、一般向けとしては初めてLarrabeeの命令体系が公開された。ここまで述べてきたようにLarrabee内の演算プロセッサはx86コア、もっといえば初代Pentiumベースだが、データ並列コンピューティング向けの命令、あるいはGPU的な処理を支援するため命令、3Dグラフィックスレンダリングパイプラインを構築するのに適した命令が拡張実装されている。

 主にベクトルユニット向けの命令が主体で、その数は100以上。新設された命令群は世界中の開発者からの意見を元にした物で、「Larrabee New Instructions」の頭文字を取ってLRBniと命名された。

 ベクトルレジスタは、v0-v31の32個。1個あたりは512ビット幅。32ビット幅のデータならば16個入る幅で、当たり前だが16ワイド・ベクトルユニットに適合するレジスタ幅だ。

 四則演算、積和算、論理計算、各種演算命令があるのは当然として、LRBniならではの特徴的なベクトル比較命令、Gather、Scatter命令なども用意される。主なニーモニック命令は3つの因数からなる。

 マスクレジスタと呼ばれるRLBni特有のレジスタは8個用意される。幅は16ビット。これは16ビットのビットマスクレジスタで、16個の各ビットがRLBniで取り扱える16個のベクトルデータに対応する。各種ベクトル演算やベクトル比較命令を実行後の状態値が格納される。具体的に言うと、演算結果に応じて16個の各ベクトルに対応するマスクレジスタの各ビットが1になったり0になったりする。結果をレジスタやメモリに書き出す、いわゆる述語命令のための支援レジスタだ。

 LarrabeeがGPU的に活用されることが最初からわかっているので、DirectX、OpenGLで登場する16ビット浮動小数点(FP16)やUnsigned linear normalized(unorm8などの)データ形式は、すべてサポートされている。ただ意外にも、グラフィックス処理支援命令はLRBniの全体の10%未満程度だとのこと。

Larrabee用の新命令セットは「LRBni」レジスタは、512ビット幅のベクトルレジスタが32個
ニーモニックの引数は3つ特徴的なマスクレジスタデータ列のシリパラ変換も完備

LRBniでコーディングされたマンデルブロー集合生成のプログラムコードサンプル

 右の写真は、マンデルブロー集合生成のプログラムが、LRBniでコーディングされたプログラムのサンプルコード。

 前述したように命令は3引数で構成され、Intel系命令体系らしく左端が演算結果を格納レジスタ、その右側に演算に用いる引数レジスタを記述する。

 積和算命令のような引数レジスタだけで3つ必要な命令では結果格納レジスタ自身が3つ目の引数を兼任し、元の引数が破壊されつつ結果が格納される。

基本的に引数は最大3つ元の引数が破壊されつつ結果が格納される命令も

 特徴的なマスクレジスタを使った命令は、動作が複雑で面白い。マスクレジスタは結果出力用のベクトルレジスタの修飾子として用いられ、ビットが1で立っている箇所に対応する場所にのみ結果が出力され、0で寝ている箇所に対応する場所には結果が出力されない(元のレジスタ値が温存される)。

 引数データはインデックス修飾が可能。アドレッシング範囲は64ビットアドレスの全域だ。

 ところで、積和算の命令語に「213」とか「231」といった数字羅列があることに気づいた人もいるだろう。これは、Intelらしい汚い命令語命名規則の究極形とも言えるもので、積和算を行なう際の引数レジスタの処理順を指し示している。

 例えばvmadd231psでは、「2番目の引数レジスタ」×「3番目の引数レジスタ」+「1番目の引数レジスタ」の意味をなしている。言われてみればナルホドだが、命令語を見ただけではなかなか想像も難しい。ほかにも、引数レジスタに修飾子を付けるバリエーションもあるが、キリがないのでこの当たりで紹介は中断する。

 いずにせよ、ここまでの命令語の複雑さはさすがCISCアーキテクチャという感じだ。レンダリングエンジンなどの超リアルタイム形ソフトウェアは、コンパイラではなくアセンブリで組ませるような風情なので、プログラミング難易度は結構高そうという印象を持つ。

マスクレジスタは、結果出力レジスタの修飾子として使われるインデックス修飾も凝っている。死角無し命令語の末尾の213、231という数字羅列は積和算を行なう際の引数レジスタの順番を指し示している

■ Larrabeeの存在意義はどこにあるの?

 Larrabeeが誕生してきた経緯もわかった。内部構造もなんとなくわかってきた。でも根本的な2点がわからないかもしれない。

(1)LarrabeeってGPUとしての使い道しかないの?
 これはIntelがLarrabeeを、当初はわかりやすい形で訴求するためにGPU的な活用を前面に押し出すだけであり、Larrabeeの活用の本命はもう1つデータ並列コンピューティングをターゲットにしたHPC分野への進出だ。

 地質シミュレーション、医療シミュレーション、天候シミュレーションなどのデータ並列コンピューティング分野へはNVIDIAのGPGPU(CUDA)での進出が著しく、CPUメーカーとしてのIntelとしては、ここのシェア荒らしをLarrabeeで鎮めたい考えがあるのだ。Intelのx86ベースのアーキテクチャで、GPGPUライクなデータ並列コンピューティングができるというのであれば、業務分野、学術分野からの引き合いは強くなることだろう。

(2)Larrabeeって3Dグラフィックスパイプラインを全部ソフトウェアで構築しなくちゃならない面倒なものなのにその存在意義ってなに?
 DirectX 10世代GPUになり、プログラマブルシェーダーが統合型シェーダーアーキテクチャへと進化した。統合型シェーダーとは汎用のシェーダーユニットを、そのときの3Dグラフィックス処理の負荷状況に応じて臨機応変に頂点シェーダーに起用したり、ピクセルシェーダーに起用したりと動的に制御を行なう機構。つまり、シェーダーユニットと呼ばれる演算リソースを高効率に活用するための工夫だ。

 GeForceやRADEONのような一般的な専任GPUでは、ラスタライザ、レンダーバックエンドがハードウェアであり、これらの負荷バランスは制御できない。どんなにラスタライザとレンダーバックエンドが暇でも、ほかの忙しい箇所にその演算機能を回せないし、逆にどんなにラスタライザとレンダーバックエンドが忙しくても他の演算リソースに助けてもらえない。

 Larrabeeでは、3Dグラフィックスパイプラインのすべてがソフトウェア実装となるため、その瞬間瞬間の負荷状況に応じてx86コアが高負荷な処理に従事できる。上位モデルや後継の新モデルのLarrabeeにてx86コアを増加させれば、パフォーマンスを向上させることは容易だ。

EPIC GAMES CEO兼プログラマ、Tim Sweeney氏
Tim Sweeney氏がLarrabeeに寄せたコメント「Larrabeeはすげえぜ!」(Larrabee rocks!)

 半導体総面積に対しての「面積当たりのパフォーマンス効率」において、Larrabeeは優れているというのがIntelの主張だ。3Dグラフィックスレンダリングパイプラインを、Larrabeeにてすべてソフトウェアベースにした方がよいと主張する人はIntel以外にもいる。それは、「Unreal Engine3」のアーキテクトとして著名なEPIC GAMESのTim Sweeney氏だ。

 Tim Sweeney氏は、現状のプログラマブルシェーダーベースのGPUによる3Dゲームグラフィックスの見た目に代わり映えがしなくなりつつあるのは、現在の3DグラフィックスパイプラインがGPUによって規定されてしまっているためと主張する。つまりシェーダーがプログラマブルでも、みんなが使っているレンダリングパイプラインが同じなのだから似たり寄ったりになって当たり前というわけだ。

 まったく新しいビジュアル表現、あるいは今以上にリアルな3Dグラフィックスを実現するためには、まったく別なレンダリングパイプラインを構築する必要があるとし、それには現在のGPUやDirectXで採用されているレンダリングパイプラインとはまったく別なものを構成する必要があるというのがSweeney氏の論理だ。

 これには、「レンダリングパイプラインそのものがプログラマブル」であるLarrabeeはおあつらえ向きというわけだ。ちなみに、2008年9月に東京で行なわれたゲーム開発者会議のCEDECでもSweeney氏は、「次の3Dグラフィックス革命はレンダリングパイプラインがソフトウェアレンダリングに回帰したときだ」という内容の講演を行なっている。

 この講演の中で、現行のGPUが採用するポリゴン×プログラマブルシェーダーベースのレンダリングパイプライン以外のソリューションとしてSweeney氏は、「TOY STORY」のピクサーが考案した、ポリゴンをラスタライズしてピクセルに割り当てずにポリゴンを1ピクセル以下に分解してレンダリングする「REYESレンダリング」法などを例として挙げていた。

 Larrabeeの登場時期はまだ未定のまま。しかし2009年は、Windows環境が培ってきた3Dグラフィックスパイプラインの究極形に近いDirectX 11が登場するといわれる。

 LarrabeeはDirectX 11に対応する予定だといわれるが、LarrabeeはDirectX 11を超越した3Dグラフィックスレンダリングパイプラインを目指すという。

 現在の開発者たちは、両方が出そろったときに果たして発展形のDirectX 11をチョイスするのか、革命形のLarrabeeをチョイスするのか注目されるところだ。


(2009年3月30日)

[Reported by ]