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

Fermiバージョン2と言えるGF104の正体



●199ドルのビデオカードに最適なGPUアーキテクチャ

 NVIDIAは、199ドル価格帯をターゲットにしたパフォーマンスGPU「GeForce GTX 460(GF104)」を発表した。200ドル前後から200ドル台の価格帯は、PCゲーマーにとってのスイートスポットであり、GPUベンダーであるNVIDIAにとっては最重要の市場だ。GF104は、そこに向けた製品であるため、NVIDIAとしても力が入っている。グラフィックス向けとしての、Fermiアーキテクチャの評価を固める製品になるからだ。

 NVIDIAは、ゲーマーをターゲットにしたGF104を、どのようにハイエンドの「GeForce GTX 480(GF100)」アーキテクチャから派生させたのか。同社はいくつかの重要な決定を行なった。それは、Fermiアーキテクチャのプログラミングモデル上の一貫性を保ちつつ、グラフィックスのパフォーマンス効率を上げること。そして、そのために、グラフィックス負荷に合わせて内部マイクロアーキテクチャを再設計することだった。

G80からG100までの変遷(PDF版はこちら)
GF104ブロックダイヤグラム(推測)(PDF版はこちら)

 まずNVIDIAは、演算プロセッサ群の最小単位である「Streaming Mutliprocessor(SM)」の内部の演算ユニット群を、グラフィックス負荷に適した比率に再構成した。特に、演算プロセッサであるCUDAコアの数を増やして、GPUのプロセッシングパフォーマンスを拡張した。それに合わせて命令発行を拡張し、ピークのIPC(Instruction-per-Clock)を高めた。その一方で、ECCを省き、CUDAコアを単精度演算中心に変更するなどのグラフィックス最適化によって、SMの実装を軽くした。その結果、GF104は、上位のGF100よりグラフィックス時のパフォーマンス効率の高いGPUとなった。

 こうした拡張を行なう一方で、NVIDIAはFermiのアーキテクチャ上の特徴を保持した。まず、共有メモリの量や倍精度命令の有無など、プログラミングに関わる部分は全て上位のGF100と揃えた。また、キャッシュ階層のように、最適化で重要となる要素もGF100と共通化した。SM毎のテッセレータや複数個のラスタライザといった、Fermiの重要なグラフィックス機能も残された。その結果、GPUコンピューティングとグラフィックスの両面で、プログラミング上の互換性はほぼ完全に保たれた。

 NVIDIAの、このアーキテクチャ選択には、疑問が残る部分もあった。それは、SMの演算能力とIPCを高めたのに、スレッドスケジューリングを拡張しなかったことだ。NVIDIA GPUが従来行なってきた、マルチスレッディングによるメモリレイテンシ隠蔽の能力がGF104では低下している。しかし、これにも合理的な理由がある。それは、GPUが世代とともに、どんどんメモリ帯域によって制約されるようになっていることだ。これは、過去数世代のNVIDIA GPUの演算リソースとメモリ帯域の伸長比率を較べてみればよくわかる。メモリ帯域は、GPUというプロセッサにとって最大の壁であり、NVIDIAはそれに対して、データの局所性を積極的に利用するという、正統的な手法で対応しようとしている。

NVIDIA GPUのメモリ量とマルチスレッディング(PDF版はこちら)

●16 CUDAコアのクラスタを3個備えたSM

 NVIDIA GPUの最小単位であるSMのマイクロアーキテクチャを詳細にチェックすると、GF104の正体が見えてくる。GF104のSMをGF100と較べた時に、すぐに目につくのはユニット群の拡張だ。特に、演算プロセッサであるCUDAコアは、GF100の32個からGF104では48個に拡張されている。Fermiアーキテクチャでは、CUDAコアは16個ずつが1つの演算クラスタにバインドされており、GF104ではそれが3クラスタに増えている。このほか、Special Function Unit(SFU)は4個で1クラスタだったのが8個で1クラスタになっており、テクスチャユニットも同様だ。

GF104のSM構造(推測)(PDF版はこちら)
GF100のSM構造(PDF版はこちら)

 SMの内部構造を見てわかる通り、実行ユニットは全て32の約数でクラスタを構成している。命令実行が32スレッドのWARP単位で行なわれるからだ。WARPは「SIMT(Single Instruction, Multiple Thread)」実行、つまり同じ命令を実行するスレッドの束で、一般的なベクタマシンのベクタ長にあたる。そして、G80以来、NVIDIA GPUのWARPサイズは32スレッドで固定されている。

 各実行ユニットクラスタは、1個のWARPを数サイクルスループットで実行する。例えば、16個のCUDAコアは2サイクルスループットで1個のWARP(32スレッド)を実行する。同様に8個のクラスタは4サイクルスループット、4個のクラスタは8サイクルスループットで実行する。2個で16サイクル、1個で32サイクル、32個で1サイクルという構成も可能だ。

 逆を言えば、NVIDIAアーキテクチャでは、各実行ユニットクラスタは、32を割り切れる限り、スループットとユニットの並列度の間で自由な構成を取ることができる。実行ユニットクラスタの構成を4から8または16へと拡張しても、命令スループットが変わるだけで、基本的にはそれ以外の制約がない。

 そのため、NVIDIAは、比較的自由にクラスタのユニット構成を変えることができる。コンピュータアーキテクチャ的に言えば、論理ベクタ長は32に固定されているが、物理ベクタ長は自由に変更できるのがNVIDIAアーキテクチャの特徴だ。次回の記事で説明するWARPスケジューリングが柔軟性に富んでいるため、こうした自由な構成が可能になっている。

GF104でのWARPのスケジューリング(PDF版はこちら)

●実装上は大きく異なるGF104のCUDAコア

 GF104アーキテクチャでのCUDAコアは、実はGF100のCUDAコアと異なっている。GPUの演算ユニットは、浮動小数点積和演算(MAD)ユニットであり、整数演算パイプも備えている。従来のGPUの演算パイプは単精度浮動小数点演算専用だったが、GPUの汎用(General Purpose)利用が広がるにつれて変化してきた。

 NVIDIAは、前世代の「GeForce GTX 280(GT200)」では、8個の単精度ユニットに対して1個の割合で、倍精度演算専用のMADユニットを実装した。次のGF100のCUDAコアでは、32ユニット全てに倍精度演算機能を持たせた。GF100の倍精度演算は、Teslaバージョンの場合、ピークの演算能力が単精度の1/2となっている。データパスなどに制約があるため、倍精度演算命令を発行する際には、他の命令を発行できないためピーク性能が制約されている。その制約を除けば、GF100 CUDAコアはフルの倍精度演算能力を持つため、演算ユニット自体の実装コストはかなり高いと推測される。

 GF100ダイはHPC製品であるTeslaを重要ターゲットとしたため、この実装でよかった。しかし、グラフィックス市場をメインターゲットとするGF104では、そうした実装は重すぎる。倍精度演算にトランジスタを割いても、無駄になってしまうからだ。そこで、NVIDIAはGF104のCUDAコアでは、実装コストをかなり抑えた倍精度浮動小数点演算をサポートを行なった。

 まず、GF104 SMの3個のCUDAコアクラスタのうち、2クラスタは完全に単精度演算専用MADとなっている。そのため、この新CUDAコアの浮動小数点演算パイプについては、Fermi以前のNVIDIAアーキテクチャに近いと推測される。つまり、48個のCUDAコアの内、32個はグラフィックス向けの単精度MADだ。

 また、倍精度演算をサポートする1個のCUDAコアクラスタについても、実装はそれほど重くはないと推測される。GF104の倍精度演算サポートクラスタが、1/4の倍精度/単精度演算スループット比だからだ。つまり、16個のCUDAコアが、単精度の場合の1/4のスループットで倍精度演算を行なう。1個のWARPの実行スループットは8サイクルになる計算だ。

 1/4というスループット比は、AMD(旧ATI)アーキテクチャでの倍精度サポートと同じだ。AMDアーキテクチャでは、4個の単精度演算ユニットを使って1個の倍精度演算を行なう(AMDは1個のVLIWプロセッサ内に5個の単精度演算ユニットを備えるため、実際には1/5の比となる)。AMDは、そのアプローチでの実装上のコストは非常に軽いと説明していた。GF104の倍精度サポートCUDAコアも似たような手法を取っていると見られる。つまり、倍精度演算をサポートするものの、演算ユニットの実装コストはAMD同様に軽いと見られる。

ATI RV770 VLIWプロセッサの構造(PDF版はこちら)

●開発プラットフォームとしてのグラフィックス製品を考慮

 倍精度演算をサポートするCUDAコアクラスタは、単精度の1/4のスループットで倍精度演算を行なう。1/3のCUDAコアクラスタが、1/4のスループットで倍精度演算をサポートするため、SM全体での倍精度と単精度のピーク性能の比率は1:12となっている。つまり、各SM毎に、1サイクルに4個の倍精度浮動小数点演算が可能だ。

 そのため、倍精度パフォーマンスは、SM当たり同クロックのGF100の1/4となる。かなり低いように見えるが、それでも7 SMが有効になっているGF104なら、チップ全体で75.6GFLOPS(1.35GHz時)の倍精度演算パフォーマンスとなる。8 SMで1.35GHz時には86.4 GFLOPSだ。これは、従来のGeForce GTX 280(GT200)系とほぼ同レベルの倍精度演算性能だ。

 NVIDIAが1/12のパフォーマンス比であっても倍精度演算をサポートしたことは重要な意味を持っている。倍精度演算をサポートするため、GF104は実行可能命令種でも上位のGF100とほぼ100%の互換性を持つ。従来のパフォーマンスGPUから下のラインナップは、倍精度演算をサポートせず上位GPUとの互換性は100%ではなかった。しかし、GF104はGF100とフルの互換性を持つ。これは、GF104に、汎用的なプログラムの開発プラットフォームとして重要な意味を持たせる。

 NVIDIAでGeForce製品を統括するDrew Henry氏(General Manager, GeForce GPUs, NVIDIA)は次のように説明する。

 「倍精度演算機能を低価格の製品にももたらした理由は、開発プラットフォームとして重要になるからだ。当社は、ハイエンドのTesla製品に向けてコーディングする我々の顧客のニーズを理解している。彼らは、グラフィックス製品を低価格の開発プラットフォームとして使い、そのプログラムをHPC(High Performance Computing)製品で走らせる。我々は、そうしたニーズに応えることが必要だと考えた」。

 GPUプログラマは、例えフルスピードで走らなくても、倍精度演算命令を含むコードを、グラフィックス製品で走らせて試すことができる。その上で、同じプログラムをHPC製品の上で走らせることができる(マルチGPU展開の部分は別として)。均一の命令セットアーキテクチャでのプロセッサのスケーラビリティのもたらす利点だ。同じ利点は、今現在、x86 CPUが持っている。

 NVIDIA幹部の言葉からは、同社が、この利点を重要だと認識していることがわかる。利点を理解した上で、GPU製品をファミリとして一貫性のある開発プラットフォームにしようとしている。NVIDIAが、GPUコンピューティングの利点を充分理解していることがうかがえる。NVIDIAが、グラフィックスデバイス屋からコンピュータメーカーへと転換していることが象徴されている。

 こうして見ると、NVIDIAは最小の実装コストで、浮動小数点演算の一貫性をGF104で保つ道を見つけたことがわかる。

●よりパワフルな64 CUDAコアの構成も検討

 NVIDIAはGF104のSMにおいて、SFUクラスタやテクスチャユニットクラスタの構成も変更した。

 超越関数などの実行ユニットであるSFUは、GF100では4個で1クラスタだったが、GF104では8個で1クラスタの構成となっている。そのため、命令スループットが半分の4サイクルになった。より多くの命令を発行できる余裕が産まれる。テクスチャユニットも同様に2倍に強化された。テクスチャアドレス生成ユニットとテクスチャフィルタリングユニットのどちらも倍増されている。

 これらユニット群の増強は、グラフィックス負荷時の命令ミックスの分析に基づいて行なわれたという。このことは、下の図でNVIDIA GPUファミリの、SMまたはTexture/Processor Cluster(TPC)当たりの各ユニット数の変化を見てみるとよくわかる。

 純粋にグラフィックス向け製品だったNV40世代では、GPUの内部構成は下の図のようになっていた。汎用の積和算(MAD)ユニットに対する、SFUとテキスチャユニットの比率は世代毎に小さくなっており、GF100では今までになくMADの比率が高くなっている。GF104は、その比率をグラフィックス寄りに、揺り戻している。

 NVIDIAでGPUエンジニアリングを担当するJonah M. Alben氏(Vice President, GPU Engineering)によると、Fermiアーキテクチャの拡張では違う構成も検討したという。CUDAコアクラスタを4個にして、SM当たり64個のCUDAコアを搭載する構成だ。しかし、実際のコードでは、積和算だけが集中的に連続する場合は少なく、他の命令もミックスされるケースが多かったという。そのため、現在のGF104のような構成に落ち着いたという。

NVIDIA GPU_Processor Clusterのユニット数比較(PDF版はこちら)

●グラフィックス機能はそのままGF100から継承

 Fermiアーキテクチャでは、DirectX 11のDirect3D11サポートのために、平面分割専用ハードウェアのテッセレータがSM毎に1ユニットづつ実装されている。これはGF104のSMでもそのまま受け継がれている。NVIDIAは、テッセレータを含むジオメトリパイプライン系の固定機能ユニット群を「PolyMorph Engine(ポリモーフ Engine)」と呼んでいる。NVIDIAからの情報を元に推測したGF104のSM構成図で、上に配置したのがPolyMorph Engineだ。

GF104 SMの構造2(推測)(PDF版はこちら)

 図中でPolyMorph Engineの配置がいい加減なのは、単にブロック図上に配置するだけの情報がNVIDIAから得られていないからだ。通常、GPUのブロックダイアグラム図は、データフローを中心に作られている。GPUでは命令のフローより、データの流れの方がずっと重要だからだ。

 しかし、上の図は、コンピュータアーキテクチャ的にわかりやすく説明するために、データフローと命令フローの両方を描いている。しかし、FermiアーキテクチャのSMのデータフローには、まだわからない部分があり、確実な図を作ることがまだできていない。そのため、データフローの上に配置すべき、テッセレータやバーテックスフェッチを図中で正確に配置することができない。

 そもそも、PolyMorph Engineに含まれる機能ブロックは、1つにまとまっているものではない。それどころか、名前だけの不明瞭なものもある。例えば、ストリームアウトはプロセッサコアからメモリへのダイレクトな書き込み、つまり、ROP(Rendering Output Pipeline)などを介さないメモリ書き込みのパスを意味している。SMの機構上、この機能は実質的にはロード/ストアユニットが担っているはずだ。つまり、ストリームアウトは、ロード/ストアユニットが実現している、グラフィックスパイプライン上の機能だ。

 それなのに、なぜそれがPolyMorph Engineの方に入っているのか。それは、ストリームアウトが、ジオメトリパイプラインの中のDirectXの機能の1つであるためだと推測される。つまり、PolyMorph Engineは、DirectXジオメトリパイプラインでのシェーダプロセッサ関係以外の機能を概念的にまとめたものであり、それ以上のものではない。上の図では、そのためPolyMorph Engine部分についてはぼかした配置にしてある。

 GF104のSMのこれらのユニットは、実際にはどう動くのか。次の記事では、WARPスケジューリングに関連した部分をレポートしたい。