■後藤弘茂のWeekly海外ニュース■
NVIDIAがパフォーマンスクラスのGPU「GeForce GTX 460(GF104)」を発表した。GeForce GTX 460については、先週の記事でアーキテクチャを予想したが、それは大きく外れた。GF104は、実は、予想を大きく超えたラディカルなアーキテクチャのGPUだった。
最重要なポイントは次の通り。まず、GF104は、上位の「GeForce GTX 480(GF100)」をベースに大幅なアーキテクチャ上の拡張を加えたものだった。プログラミング上の一貫性は、GF100に対してほぼ保たれており、削られた部分はほとんどない。その一方で、グラフィックスワークロードで重要となるパフォーマンス効率については向上されている。そのため、ダイ当たりのグラフィックスパフォーマンス効率が高い。つまり、NVIDIAはグラフィックス向けに特化したGPUを作るのではなく、グラフィックス時に高効率だが、プログラミング上は上位GPUと同様に見えるGPUを作った。
GF104の内部アーキテクチャを見ると、この思想がよくわかる。GF104では、Fermi初代のGF100と比べると、プロセッサの集合であるSM(Streaming Multiprocessor)内のCUDAコア(Fermiアーキテクチャでの演算プロセッサ)数が150%に増やされている。各SMは48個のCUDAコア(16コア×3クラスタ)、8個のSpecial Function Unit(SFU)、8個のテクスチャアドレスジェネレータとテクスチャフィルタリングユニット、16個のロード/ストアユニットを備える。
つまりGF104のSMは、GF100よりCUDAコアは16個、SFUは4個、テクスチャユニットは4個増えた。また、SM内での命令発行は、これまでの2命令(2Warp)発行(2サイクル毎)から4命令(4Warp)発行(2サイクル毎)へと倍増された。3命令ではなく4命令発行になった点は重要で、演算リソースが増えただけでなく、演算ユニットの稼働率が理論上、大幅に向上した。アーキテクチャ的に見ると、GF104の単位ダイ面積当たりのパフォーマンス効率はGF100より相対的に高くなるはずだ。マイクロアーキテクチャのこの変更は、グラフィックスワークロードの命令ミックスに最適化した結果だという。GF104のSMを、GF100と比較した図は下の通りだ。SMの詳細は次の記事でレポートしたい。
GeForce GTX 460(GF104) Streraming Mutliprocessor(予測)(PDF版はこちら) |
GeForce GTX 480(GF100) Streraming Mutliprocessor(PDF版はこちら) |
NVIDIA GPUのプロセッサユニットの比較(PDF版はこちら) |
●GPUのプログラミングモデルの一貫性にこだわるNVIDIA
初代Fermi(GF100ダイ)が持つ、HPC(High Performance Computing)に最適化された機能のうち、少数の機能がGF104ダイでは削られるか減らされた。GF104は、GF100ダイの特徴であるメモリに対するECC保護機能を持たない(GeForce GTX 480はダイに実装されているが無効化されている)。
ただし、倍精度浮動小数点演算は、スループットは抑えられたものの、GF104でもサポートされた。TeslaバージョンのFermiでは、倍精度演算は単精度に対して1:2(50%)のピーク性能だが、GF104では1:12(約8%)のピーク性能だ。つまり、HPC向け機能であっても、プログラミングに関わる部分は、GF104でも削らずに性能を抑えるだけに止められた。そして、それ以外のほとんどのGF100の技術要素は、グラフィックスと汎用(General Purpose)の両方に向いた機能が全て受け継がれた。
全体の構造を見ると、GF104では、各SMにDirectX 11のテッセレータ(平面分割ユニット)が備えられ、4個のSMがラスタライザ回りとともに「GPC(Graphics Processing Cluster)」としてまとめられている。これはGF100と同じ構成だ。GF104のSM内部のライタブルメモリは、GF100同様に64KBでL1キャッシュと共有メモリのコンフィギュアラブル型。内部バスは双方向のクロスバースイッチで、メモリコントローラ側にライタブルL2キャッシュを備える。こうしたメモリ階層とバス構造はGF100と同じで、Fermiアーキテクチャのユニークな機能である、複数のカーネルプログラムの並列実行や、40-bitアドレッシングの統合メモリアドレス空間なども全て受け継がれている。
GF104 GPCの概要(PDF版はこちら) |
GF104(1GB)全体の概要(PDF版はこちら) |
そのため、GF104は、グラフィックス機能だけでなくプログラミング上で見える部分も見えない部分も、上位のGF100系とほぼ完全な互換性を持つ。違いは、性能最適化に関する一部要素程度と見られる。つまり、NVIDIAは、プログラミング上の一貫性を保ちながら、なおかつグラフィックスのパフォーマンス効率を上げるという、相反する目標をGF104で達成している。これは、かなり異例だ。なぜなら、相応のエンジニアリング労力が必要となるからだ。
●プロセッサの効率性が高いGF104アーキテクチャこのことは、GPUに柔軟なプログラム性を持たせて、HPCから家庭向けまで、一貫したプログラミングモデルでカバーするというNVIDIAの思想が、確固としたものであることを示している。今世代では、倍精度演算に至るまで、下位GPUでサポートされるからだ。
これは、GPUプログラミングコミュニティにとってはいいニュースだ。低価格のビデオカードで走らせたプログラムを、そのままTeslaや大きなGPUクラスタでも走らせることができるからだ。GPUプログラミングが広まれば、それだけGPUを使った汎用アプリケーションが出て来るため、エンドユーザーにとっても利点となる。
その一方で、グラフィックス性能中心のユーザーにとっては、GF104には高効率のパフォーマンスという利点がある。GF104の利点は、演算リソースが多いことだけでなく、稼働率に高いヘッドルームがあることだ。ハイエンドGF100のSMはピークのIPC(Instruction-per-Clock)が2(単精度の場合)だが、下位のGF104のIPCはピークが4で実効IPCの目標値が3だ(さまざまな制約により実効IPCが落ちるケースがため)。つまり、1つのSMが、1サイクルにより多くの命令を実行できる。
例えば、チップ全体での実行命令数を計算すると、GF100が480 Instruction/Core Clock(15 SM/2 IPC時)であるのに対して、GF104は理論上のピークが448 Inst/Clk(7 SM/4 IPC時)で、実効が336 Inst/Clk(7 SM/3 IPC時)となる。GF100は理論値と実効値の乖離が少ないはずだが、それでもGF104の効率はダイサイズ比を考えると相対的に高い。
もちろんGF104にも弱点があるが、理論上はキャッシュヒットする限り、高効率で回り続ける。下は、理想IPC時のGF104のWarpスケジューリングの例だ。Warpスケジューリングの仕組みは後の記事で詳説するが、GF104では理想値では演算コアがフル稼働できることがわかる。GF100では、これは理想状態でもできない。
GF104のGPGPUプログラムにおけるWarpスケジューリング(PDF版はこちら) |
全体を見ると、NVIDIAがうまくFermiアーキテクチャを維持しながら、パフォーマンス効率がある程度高い派生アーキテクチャを作ったことがわかる。懸念されたGPUコンピューティング向け製品とグラフィックス向け製品へのプログラミングモデル上の分離はない。この設計思想は、おそらくファミリーで一貫しており、さらに下位のGPU製品にも受け継がれると推定される。CUDAプログラミングフレームワークの下に、一貫したGPUファミリを作り上げようとしていると考えられる。そのためには、エンジニアリングコストをかけて、アーキテクチャを拡張することも厭わないようだ。
GF100ファミリーの比較(推測)(PDF版はこちら) |
●従来のパフォーマンスGPUとは全く異なる派生
先週の記事では、GF104は「GeForce GTX 280(GT200)」をベースにしている可能性が高いと予想した。結果として予想は間違いだったが、それは、NVIDIAがここまで労力をかけることを想定できなかったからだ。
GF104をGT200ベースと推定した根拠は、GPUが搭載するプロセッサ数が24の倍数であり、32の倍数ではないからだった。NVIDIA GPUは一定の単位でWarp(NVIDIA GPUでのSIMT実行の単位、32スレッド)のスケジューリングを行なっており、その粒度を崩すことができない。GT200の場合は粒度は24プロセッサ、GF100の場合は32プロセッサだ。
NVIDIAアーキテクチャでは、1個のSM(Streaming Multiprocessor)の中に搭載する実行プロセッサ数を変えようとすると、命令発行ユニットを拡張する必要がある。また、実効性能を高く保とうとするならレジスタ数やWarpスケジューリングも拡張しなければならない。つまり、プロセッサとしての基本要素の多くを変更する必要があり、エンジニアリング労力が膨大になる。そのため、そうした変更は行なわないと推測した。
実際、GPUベンダーはハイエンドGPUから派生させたパフォーマンスクラスのGPUに対しては、そこまでの改良を行なわないのが一般的だ。通常は、ハイエンドGPUのアーキテクチャそのままで、ユニット数だけを半減させたGPUをパフォーマンス価格帯に投入する。アーキテクチャに手を加える場合も、特定の機能を削る「引き算」方式で行なう。今回のように、プロセッサアーキテクチャを「足し算」で拡張するのは異例だ。また、前記事で推測したように、旧世代のGPUアーキテクチャを、下位製品として延命させる場合も多かった。
しかし、今回は違う。プロセッサアーキテクチャ自体の拡張の度合いで見ると、GeForce 8800(G80)からGT200への変化と同程度に、GF100からGF104も大変化だ。なぜなら、プロセッサの根本とも言える命令発行とメインの実行パイプラインが拡張されているからだ(GT200では命令発行は拡張されなかった)。
つまり、GF104は単なるGF100のカットアウト版ではなく、アーキテクチャレベルから再設計された新GPUだ。言ってみればFermiバージョン2がGF104だ。今回は、初代GPUであるGF100から半年も経たないうちに、発展アーキテクチャが登場した点は異例だと言える。
NVIDIA GPUのメモリのマルチスレッドの比較(PDF版はこちら) |
●メモリ帯域とのバランスが取れた2/3戦略のGPU
今回のGF104は、パフォーマンスクラスのGPUとしては異例づくめだ。アーキテクチャレベルから再設計されたことだけでなく、ダイサイズやプロセッサコア数もパフォーマンスGPUとしては異例に多い。ダイサイズは300平方mm台中盤とAMD(ATI)のハイエンドGPUクラスで、GF100ダイのほぼ2/3の面積だ。トランジスタ数は19億5千万で、これもGF100の32億の約2/3。ダイに実装されているプロセッサ個数は384個で、GF100ダイの約75%。おおまかに言えば、GF100の2/3のバージョンがGF104だ。これは、2番手GPUがハイエンドGPUの1/2のバージョンだったこれまでとは違う。
もっとも、純粋にアーキテクチャの観点から見ると、この戦略は的を射ている。なぜなら、GPUのメモリインターフェイス幅は、GF100が384-bit幅で、GF104が256-bit幅だからだ。過去にはハイエンドGPUが512-bit幅あるいは256-bit幅で、下位のGPUがその半分の256-bit幅または128-bit幅ということが多かった。その場合は1/2のメモリ帯域とのバランスで、1/2のプロセッシングパフォーマンスが都合がいい。
しかし、今回のようにハイエンドが384-bitになると、下位GPUが192-bit幅も収まりが悪いので、256-bit幅の選択も自然だ。下位GPUが2/3のメモリ帯域となると、2/3のパフォーマンスが、アーキテクチャ的には利にかなうことになる。例えば、メモリ帯域の制約などの条件が、上位のGPUと似たものになるからだ。
実際、GF100とGF104では、GF104のIPCが3として計算した場合、メモリ帯域と実行命令数のバランスがほぼ取れている。つまり、マーケティング上で見ると異例だが、アーキテクチャ的に見ると合理的なのがGF104のサイズだ。これも、NVIDIAがアーキテクチャ主導になってきたことを示すサインかも知れない。
GPUのトランジスタ数とプロセス技術の変遷(PDF版はこちら) |
GPUダイサイズとプロセス技術の変遷(PDF版はこちら) |
NVIDIA GPU製品とダイ(PDF版はこちら) |
G80からGF100までの進化(PDF版はこちら) |