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

GeForce FXの秘密
~Vertex Shaderは完全に新アーキテクチャに




●他のGPUと大きく異なるShaderの構造や機能

NVIDIA, Product Line Manager Geoff Ballew氏

 DirectX 9世代のGPUの中核をなすのはProgrammable Shader群、つまり、ジオメトリ処理を担当する演算ユニット「Vertex Shader」と、ピクセル処理を担当する演算ユニット「Pixel Shader」だ。これらのユニットの処理性能が、DirectX 9/OpenGL2.0世代のGPUの性能を決める。DirectX 9/OpenGL2.0では、シェーダプログラム(グラフィックス処理向けのプログラム)の実行性能が鍵となるからだ。

 そのため、CPUメーカーが、CPUの内部アーキテクチャを改良、命令の処理効率を上げようとするように、GPUメーカーもShaderのアーキテクチャ開発に力を注いでいる。今回、NVIDIAはGeForce FX(NV30)で、このShaderのアーキテクチャを従来と大きく変えた。


●(ロジカルには)単一の巨大なVertex Shaderを備える

 まず、Vertex Shaderから見てみよう。

 GeForce3/4系が備えるVertex Shaderは、32bit短精度浮動小数点データ4個に同時に同じ処理を行なうことができる「128bit SIMD(Single Instruction, Multiple Data)型演算ユニット」だった。Pentium 4のSSE/SSE2ユニットと同じようなものだ。GeForce3はVertex Shaderを1個、GeForce4 Tiは2個備えていた。

Vertex Shaderアーキテクチャの比較

 だが、GeForce FXアーキテクチャではVertex Shaderの姿は大きく変わった。GeForce FXの担当者のGeoff Ballew氏(NVIDIA, Product Line Manager)は次のように説明する。

 「従来の手法では、小さなVertex Shaderを1個、2個と増やして来た。GeForce4 Tiは2個の小さなVertex Shaderを備えていた。我々がGeForce FXの性能は2倍になると説明していたため、GeForce FXではVertex Shaderが4個になると、巷ではウワサされていた。だが、それは間違いだ。我々は、完全に再アーキテクチャした。

 GeForce FXでは、複数個の小型のVertex Shaderを実装する代わりに、非常にパワフルな1個のVertex Shaderを実装した。このVertex Shaderは内部に、多くの演算ユニットを持っていて、フロントエンドが命令をスケジューリングして効率よく動作させている。Vertexシェーダ命令は、シンプルなものもあれば複雑なものもある。我々のアーキテクチャでは、そのどちらも高速に処理できる。生パフォーマンスでは、VertexプロセッシングパフォーマンスはGeForce4 Tiの約3倍になっている」

 NVIDIAの開発部門を束ねるChief ScientistのDavid B. Kirk(デビッド・B・カーク)氏も同様の説明をする。「GeForce FXのVertex Shaderは、マルチスレッド対応の複数の浮動小数点演算プロセッサで構成されている。つまり、Vertex Shaderは、個別のパイプラインに分離されているわけではない。多くの頂点処理を同時に同じパイプライン群の中でできるようになっている。従来とは、パイプラインアーキテクチャを大きく変えたため、Vertex Shaderが何個あるといった数え方はできない」、「私の見積もりでは、12~20頂点程度の処理を同時にできる」

●3Dlabsと似たようなアプローチの可能性

 これらの説明から、GeForce FXのVertex Shaderのアーキテクチャはある程度は推定できる。それは、おそらく3DlabsのP10/P9(Wildcatシリーズ)系アーキテクチャと似通ったものだ。3Dlabsのアーキテクチャも、同様にマルチスレッドで効率のよい演算ユニット構成が可能なジオメトリエンジンを備えている。

 従来の多くのGPUのVertex Shaderは、4個のデータに対して同じ演算を行なえる128bit SIMD演算ユニットで構成されている。しかし、この構成の場合は、Vertex Shaderの実効効率が高くなかった。「4プロセッサがセットになっている形式(SIMD型演算ユニット)だと、3プロセスの処理では1つのプロセッサがアイドルになってしまう。さらに、1つのスカラ演算だけを実行する場合には、3プロセッサがアイドルになってしまう」(3Dlabs Brian C. Duckering氏 Senior Product Manager)からだ。この問題を軽減するために128bit SIMD演算ユニットに加えて32bitのスカラ演算ユニットをVertex Shaderに備えたGPUもあるが、その方法ではトランジスタ当たりの実効率は高くできない。

 そこで、3DlabsはP10アーキテクチャでは、16個の32bit短精度浮動小数点のスカラ演算ユニット群で、Vertex Shaderの処理を行なわせることにした。このスカラ演算ユニットを、3DlabsではVertex Processor(VP)と呼んでおり、VPを組み合わせることで、SIMD演算を行なえるようにしている。例えば、4データのSIMD演算を行なう場合には4個のVPをバインドして仮想的にSIMD演算ユニットにし、3データのSIMD演算を行なう場合には3個のVPをバインドし、スカラ演算を行なう場合にはVPを単独で動作させる仕組みになっている。それによって、演算ユニットの無駄をなくすわけだ。これは、メディアプロセッサなどに取り入れられていた手法だ。

 また、3DlabsではVP群をマルチスレッドで動作させるためのスケジューリングユニットも備える。複数のスレッドから命令を抽出することで、より並列性を高めてVP群の利用効率を上げる仕組みだ。考え方の基本は、IntelのHyper-Threadingを同じだが、GPUの場合、CPUより個々のプログラムの規模がずっと小さく、基本はストリーミング処理であるため、マルチスレッドといってもCPUより制御が容易だと思われる。この、マルチスレッドスケジューリングを、GeForce FXもVertex Shaderに備えているようだ。

 NVIDIAは、GeForce FXのVertex Shaderの詳細を明かしていない。しかし、Vertex Shaderの効率を上げようとしたら、3Dlabsの解はもっともリーズナブルな方法だ。そのため、NVIDIAの取った手法も3Dlabsと似通ったものである可能性が高いと思われる。

●独特なディスプレイスメントマッピングの手法

 DirectX 9アーキテクチャでは、ハイヤーオーダー(高次)サーフェスのためにアダプティブテッセレータ(適用型平面分割ユニット:Adaptive Tessellator)を搭載し、ディスプレイスメントマッピング(Displacement Mapping)もサポートすることになっている。ディスプレイスメントマッピングは、少ない頂点データから複雑なオブジェクトを作り出すことを可能にする技術だ。RADEON 9700やParhelia-512は、これを素直にインプリメントした仕様となっている。しかし、GeForce FXはこの機能もShaderで実行できるようになっている。

 通常のGPUは、Vertex Shaderの前にアダプティブテッセレータを備える。そして、基本的にはVertex ShaderでのVertexシェーダプログラムの実行前にディスプレイスメントマップ処理を行なうようになっている。しかし、GeForce FXでは、「Geometry Displacement Mapping(ジオメトリディスプレイスメントマッピング)」という手法で、Vertexシェーダプログラムの実行のあとにディスプレイスメントマップをかけることも可能になる。これは、Kirk氏の説明などを元に推定すると、次のような方法を取ると見られる。

GeForce FXのGeometry Displacement Mappingの仕組み

 (1)まず、Vertex Shaderは通常通り頂点データを取り込みその頂点に対してシェーダの処理を行なう。(2)次に、処理が終わった頂点データを、ラスタライズしないでそのままPixel Shaderに送る。(3)GeForce FXのPixel Shaderは、完全にVertex Shaderと同じデータ精度(128bit浮動小数点)なので、データをロスすることなくVertex Shaderと同じ処理を行なうことができる。ここで、Pixel Shaderはテクスチャメモリからディスプレイスメントテクスチャ、つまり高低情報のテクスチャを取り込み頂点データを変位(ディスプレイス)させる。これは明確ではないが、おそらくテッセレータが行なっている処理もここで行なうと思われる。(4)次に、変位させた頂点データを頂点バッファに書き込む。(5)それを、再びVertex Shaderに取り込んで座標転換など基本的な処理を行なう。(6)そのデータを今度はラスタライズしてPixel Shaderに送り込み、ピクセル処理を行なう。

 この方式を取る利点は2つある。ディスプレイスメントマップを行なう前に、Vertexシェーディング処理を行なうことができる。ディスプレイスメントマッピングのための専用のユニットを不要にすることもできる。

●DirectX 9ではディスプレイスメントマッピングをサポートせず

 実際、NVIDIAは「アダプティブテッセレータをGeForce FXが備えているか」という質問に対しては、決して“持っている”とは答えない。「NV30はディスプレイスメントマッピングとテッセレーションをハードウェアで行なうことができる。面白いのはプログラマブルアーキテクチャでは、人が考えないようなことができることだ」(Kirk氏)、「(アダプティブテッセレータ)については詳細は語れない」(Ballew氏)といった答えが返ってくる。

 そうしたことから、NVIDIAはジオメトリディスプレイスメントマッピングだけでなく、通常のディスプレイスメントマッピング(NVIDIAではVertex Displacement Mappingと呼ぶ)も、この手法で実行している可能性が高い。つまり、ATIやMatroxのようなアダプティブテッセレータを備えていないと推測される。

 また、もうひとつ興味深いのは、NVIDIAはDirectX 9ではディスプレイスメントマッピングをサポートしないことだ。NVIDIAのBallew氏は、NV30のホワイトペーパーにあったディスプレイスメントマッピングの機能について次のように語った。

「これはホワイトペーパーのミスだ。我々はこの機能(ディスプレイスメントマッピング)については公開しない方針にするからだ。(GeForce FXはディスプレイスメントマッピングを)ハードウェア的にはサポートしているが、DirectX 9経由では見えないようになる。開発者が使うかどうかに疑問があるからだ。ディスプレイスメントマッピングは、OpenGLからはエクステンションを通じてサポートできるようにする」

 このことは、NVIDIAがディスプレイスメントマッピングやハイヤーオーダーサーフェイスをどう見ているかを示していて面白い。おそらく、NVIDIAとATI/Matroxとのアーキテクチャ上の分かれ目は、ここにある。

□関連記事
【12月18日】【海外】製造コストが非常に高い? GeForce FXの勝算
http://pc.watch.impress.co.jp/docs/2002/1218/kaigai01.htm
【12月11日】【海外】NVIDIAインタビュー(上)
~GeForce FXの高クロックと高パフォーマンスの秘密
http://pc.watch.impress.co.jp/docs/2002/1211/kaigai01.htm
【12月11日】【海外】NVIDIAインタビュー(下)
~プログラム性と性能の両立を重視するGeForce FX
http://pc.watch.impress.co.jp/docs/2002/1211/kaigai02.htm
【11月21日】【海外】ATIの勝算とNVIDIAの勝算
~GPU戦争の次のフェイズ
http://pc.watch.impress.co.jp/docs/2002/1121/kaigai01.htm
【11月20日】【海外】ついにベールを脱いだNVIDIAの次世代GPU「GeForce FX(NV30)」
http://pc.watch.impress.co.jp/docs/2002/1120/kaigai01.htm
【11月19日】NVIDIAが次世代GPUのNV30をGeForce FXとして正式発表
http://pc.watch.impress.co.jp/docs/2002/1119/comdex04.htm

バックナンバー

(2002年12月20日)

[Reported by 後藤 弘茂]


【PC Watchホームページ】


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

Copyright (c) 2002 Impress Corporation All rights reserved.