後藤弘茂のWeekly海外ニュース

DirectX 11世代のGPUはShaderのアレイになる




●3~4世代後のGPUの姿

 3D世代以降のGPUは、3Dグラフィックスパイプラインの流れに沿って処理を行なう、いってみれば“縦型”のアーキテクチャだった。しかし、近未来(おそらく2006~7年頃)のGPUは、均質なプロセッシングユニットを多数並列に並べる“横型”のアーキテクチャになるだろう。

 具体的には、32bitデータ×4個を処理できる128bit SIMD演算ユニット(Programmable Shader)を十数個から二十数個、アレイのように並べた構造になると推測される。その時点では、現在のGPUに存在するジオメトリ部とピクセル部の、構造上の明確な区別はなくなっているだろう。また、各ユニットは、一般的な命令は全て揃え、自由なメモリアクセスや、無制限な長さのプログラムの実行など、CPUが当たり前に備える機能を全て持つようになるだろう。

 こうした、単一パイプラインから並列型のアーキテクチャへの変化は、x86 CPUが単一パイプラインから、スーパースカラ構造へ進化したのと似ている。しかし、GPUの方がより横に広い=並列度が高い形態になる。これは、ひと昔前に流行ったメディアプロセッサと似ている。しかし、グラフィックスに特化した専用ハードワイヤド回路を多く残す点が、メディアプロセッサとは決定的に異なるだろう。

 前回、GPUが科学技術演算を含めた汎用プロセッシングへ向かっているというレポート「5年後に“GPUスパコン”の時代がやってくる!?」を書いた。こうした動きの背景には、こうした方向へ向かうGPUアーキテクチャの進化がある。GPU自身が汎用性をどんどん高めているから、伝統的なグラフィックス用途以外への適用が可能になりつつある。おそらく、あと数世代でGPUは汎用的な利用ができるプロセッサに発展、その時には、GPUは冒頭に書いたような構造になっているだろう。

 GPUが急速に汎用性を高め始めたのは、シェーダプログラムによってグラフィックス品質を高めるという、GPUの本来の目的のためだ。しかし、2004年の動きを見ていると、GPU業界とソフトウェア業界からは、GPUをグラフィックス用途以上の汎用的な処理に利用できるように誘導しようという思惑が見える。おそらく、2004年以降の焦点は、GPUハード自体をグラフィックスプロセッサを超えた、汎用のセカンドプロセッサに進化させるという点になるだろう。

 そして、こうした流れはゲーム機ハードウェアにも当てはまる。プログラム性が今後のグラフィックス品質向上のカギとなったため、ゲーム機に搭載されるグラフィックスプロセッサも当然プログラム性を持つようになるだろう。実際、すでにPlayStation 2はプログラマブルなベクトルプロセッシングユニットを備えたEmotion Engineでジオメトリ処理を行なうアーキテクチャを採っている。そして、PlayStation 3はより汎用的なCellプロセッサを搭載し、おそらくレンダリングパイプもプログラマブルになる。ゲーム機も、汎用的に使える強力なプログラマブルプロセッサを備えるようになりつつあると推測される。

●制約の大きなGPUのShader

 もっとも、実際には、GPUに汎用的な処理をやらせるのは、まだまだ難しい。それは、GPUのプロセッシングユニットであるProgrammable Shaderに様々な制約があるからだ。命令セットや各種リソース、実行できるプログラムサイズ(命令ステップ数)、メモリアクセス、演算精度、スケジューリングなど、様々な面で、まだ大きな制約がある。加えて、プログラミングインターフェイスもまだ整備途上で、AGPではI/Oインターフェイスの帯域も不十分だ。そして、根元的な問題として、汎用性を高めれば高めるほどトランジスタ効率が落ちる=トランジスタ数当たりの性能が下がるという問題も抱えている。これは、パフォーマンス命のグラフィックスでは、なかなか解決が難しい問題だ。

 GPU業界では、GPUのこうした制約を数世代かけて徐々に取り去ってゆくつもりだ。現状で、GPUのプログラマブル化の動きを誘導するもっとも強力な要素は、MicrosoftのAPIセット「DirectX」で、DirectXの世代毎にGPUは進化してきた。

 1ステップ目のDirectX 8(Shader 1.x)でGPUに初歩的なプログラム性を付加、2ステップ目のDirectX 9(Shader 2.x/3.x)でGPUに本格的なプログラム性を加えて汎用的な利用をスタートさせ、3ステップ目のDirectX 10(Shader 4.x?)で汎用的なプロセッシングに耐えられる機能を充実させる。そして、おそらくは4ステップ目(DirectX 11?)あたりで冒頭のような汎用プロセッサが完成すると想像される。

 まず、今年前半にハードが登場するハーフステップのShader 3.0では、それほど実装コストのかからない範囲で一部の制約が取り払われる。Shader 3.0の最大のポイントは、頂点処理を行なうVertex Shaderにテクスチャアクセス機能が加わることと、ピクセル処理を行なうPixel Shaderに動的なフローコントロール系命令(if/then/else)が加わること。実行できるプログラムの命令ステップ数はPixel Shaderが512命令へと大きく増え、テンポラリレジスタなども拡張される。

 これまで、Vertex Shaderは直接ビデオメモリにアクセスができなかったが、それが構造上可能になる。また、Pixel Shaderは分岐命令などのプログラムのフローを制御する命令を持たなかったのが、Shader 3.0からは備えるようになる。つまり、CPUの演算ユニットなら当然備える機能を、Shaderも備えるようになり始める。メモリアクセスとフロー制御は、汎用プロセッサ化では欠かせない要素だ。

●必須の32bit精度は2004年に到達

 Shader 3.0とほぼ同じタイミングで、Pixel Shaderの演算精度も32bitに上がると見られる。現在、NVIDIA以外のGPUベンダーは、Vertex Shaderに32bit精度(SIMDなので実際には128bit)、Pixel Shaderに24bit精度(SIMDなので96bit)の演算ユニットを備えている。24bitに端折ったのは実装コストを節約するためだが、そのため、Pixel Shaderでは32bit精度を必要とする本格的な汎用処理をさせることができなかった。汎用プロセッサ化では、標準的な単精度(32bit)浮動小数点のサポートは、必須要素だと考えていい。

 こうしたGPUのトレンドを考えると、NVIDIAのアーキテクチャに先進性があることは理解できる。NVIDIAは、GeForce FXシリーズに、フロー制御命令も備える32bit精度のPixel Shaderを備えた。また、Pixel Shaderの対応するシェーダプログラムも、最初から1,000命令もあった。Vertex Shaderにも三角関数などの多くの命令を付加した。また、Pixel Shaderの構成をダイナミックに変更して仮想パイプを作れるようにしたとも主張している。

 こうしたNVIDIAの独自拡張の背景には、GPUをより汎用プロセッサに近いものにしようという意図が見える。つまり、NVIDIAは、DirectX 9世代の最初から明確に汎用プロセッサへの道を強く意識していたわけだ。その意味では最も先進的だったと言える。

 問題は、こうしたアーキテクチャ拡張は、グラフィックス性能の向上に単純には結びつかないことだ。特に、32bit化で1世代先行したことは、NVIDIAにとって性能面では大きな痛手となった。24bitの演算ユニットの方が32bitの演算ユニットよりトランジスタ数を食わないため、より多くのユニット数を搭載できるからだ。その結果、NVIDIAはハイエンドからメインストリームの市場で、ATIに追いまくられることになった。

 NVIDIAが、こうした痛みを伴うアーキテクチャで、GPU汎用化のリードを奪うことができたかどうか、その結論はまだ出ていない。

●PCI Express x16が汎用処理への応用を加速する

 GPU内部アーキテクチャではないが、汎用処理を行なう上での大きなボトルネックとなっているI/Oの革新も重要だ。

 「PCI Expressによって、データの移動については、より均質(homogeneous)なシステムアーキテクチャになる。これまで、グラフィックスデバイスが抱えていたのはI/O問題ではなく、出力(Out)問題だけだった。全ては、画面に出力するから、データの流れは一方方向だった。しかし、今後、GPUにイメージプロセッシングやシグナルプロセッシングをやらせるようになるなら、I/Oが問題となる。おそらく、PCI Expressはこうした処理の時に役に立つだろう。

ATI Technologies David E. Orton社長兼COO
 PCI Expressによって、データアウト(CPU→GPU)だけでなく、データイン(GPU→CPU)が高速になる。そうすると、(データをCPUに戻さなければならない)イメージやシグナルのプロセッシングといった処理も、グラフィックスプロセッサで扱えるようになる。オフラインレンダリングも同様だ。つまり、PCI Expressによって、グラフィックスプロセッサがより汎用的なプロセッサになる」とATI TechnologiesのDavid E. Orton(デビッド・E・オートン)社長兼COOは語る。

 AGP 8xのピークデータ帯域は約2GB/sec、それに対してPCI Express x16の帯域は、片方向4GB/secで双方向8GB/secだ。つまり、従来のチップセット→GPUだけの使い方だと、帯域は2倍になるだけだが、データをGPUからCPU側に戻す場合には4倍の帯域になる。現在のCPUのFSB(フロントサイドバス)のピーク帯域は6.4GB/secなので、PCI Express x16ならGPUはCPUを超えるピーク帯域を手に入れることになる。

 そのため、PCI Express x16になると、処理したデータをCPU側に戻す必要があるグラフィックスレンダリング以外の処理がずっとやりやすくなる。AGPでは、データをCPUからGPUに送るので手一杯だが、PCI Express x16では逆方向の帯域も確保されているからだ。逆を言えば、PCI Express x16の帯域がない限り、汎用プロセッサ化は始まらないことになる。PCI Express x16のカギが双方向のデータ帯域にあることは、多くのGPU関係者が指摘している共通認識だ。

 2004年のGPUでは、Shader 3.0と32bit Shader、PCI Express x16と、汎用プロセッサへのステップに最低限必要なピースが揃う。そのため、2004年がGPUの汎用利用のスタート地点になることは間違いがない。

●汎用化の次の重要なカギとなるShader 4.0

 そして、次のShader 4.0ではさらに汎用プロセッサへと大きく発展する。最大のポイントは、Shaderアーキテクチャ上の様々な制約の削除と、Vertex ShaderとPixel Shaderのアーキテクチャ上の共通化だ。

 Shader 4.0では、プログラムの命令数やループ、テンポラリメモリストアなどについての制約は取り払われるらしい。「(ソフトウェアを)開発する側にとって、命令数のサポートが十分でないためシェーダ(プログラム)がロードできないということが起きないようにする」とMicrosoftのChas. Boyd氏(Graphics Architect, Windows Gaming & Graphics)は説明する。また、より柔軟なメモリアクセスも可能にし、パイプラインのどの段階からでもデータを自由に取り出せるようにもなるという。そして、Vertex ShaderとPixel Shader間のアーキテクチャの差異もなくなると言われる。

 「浮動小数点演算のために、Pixel ShaderとVertex Shaderは融合を始める。Shaderが向かうのは、コモンプロセッシングユニットだ。ユーザーはフロントエンド(Vertex Shader)からバックエンド(Pixel Shader)まで、同じ精度でドライブしたい。それに応える必要がある」。「バックエンド(ピクセルパイプ)まで一貫性を備え、一般的な意味でのプログラマビリティを得る。グラフィックスエンジンを、より汎用化すると言い換えてもいいかも知れない」とATIのOrton氏は説明する。

 Shader 4.0のこうした方向性は、明らかに次のステップへの布石となっている。それは統合Shaderだ。Programmable Shaderスペックの現在見ていている最終的なゴールは、冒頭で説明したような統合化されたShaderを搭載したプロセッサだと見られる。

□関連記事
【2003年12月26日】【海外】5年後に“GPUスパコン”の時代がやってくる!?
http://pc.watch.impress.co.jp/docs/2003/1226/kaigai054.htm
【2003年4月25日】【海外】RADEON 9800とGeForce FX 5800、正しい道はどちら?
http://pc.watch.impress.co.jp/docs/2003/0425/kaigai01.htm

バックナンバー

(2004年1月14日)

[Reported by 後藤 弘茂(Hiroshige Goto)]


【PC Watchホームページ】


PC Watch編集部 pc-watch-info@impress.co.jp 個別にご回答することはいたしかねます。

Copyright (c) 2004 Impress Corporation All rights reserved.