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

NVIDIAが次世代GPUアーキテクチャ「Kepler」のベールを剥いだ



●アーキテクチャを大革新してパフォーマンス効率を飛躍させたKepler

 NVIDIAが新世代GPUアーキテクチャ「Kepler(ケプラ)」を発表した。ベールを脱いだKeplerアーキテクチャは驚く内容だった。G80以来のNVIDIA GPUアーキテクチャの特長を、すっぱり取り去る大変革だったからだ。

 まず、GeForce 8800(G80)以来の、ハードウェアによる命令スケジューリングをかなりの部分取り去り、同じくG80以来のNVIDIAの特徴だった、ディープパイプラインの演算コアを、浅いパイプラインへと置き換えた。つまり、コントロールハードウェアとパイプラインのオーバーヘッドを大幅に減らすアーキテクチャを取ったことだ。その結果、できあがったのは、画期的なほど高効率のGPUアーキテクチャだった。Fermi世代のハイエンドGeForce GTX 580(GF110)と、Kepler世代のハイエンドGeForce GTX 680(GK104)を比較すると、それがよくわかる。

Keplerのダイレイアウト(PDF版はこちら)
GeForce GTX 680のスペック

 デスクトップハイエンドGPUのダイサイズ(半導体本体の面積)は、40nmプロセスだったFermi世代のGF110の520平方mmから、28nmプロセスのKepler世代のGK104の294平方mmへと約56%に縮小した。トランジスタ数の増加はGF110の3B(30億)から、GK104の3.54B(35.4億)へと、わずかに18%増えただけ。それなのに、搭載するCUDAコア(単精度積和算+整数演算ユニット)は、Fermi GF110の512コアから、Kepler GK104では1,536コアと3倍にも増えた。

 ピークパフォーマンスは、GF110が1,581GFLOPS(シェーダコアクロック1.544GHz時)に対して、GK104は3,090GFLOPS(ベースクロック1.006GHz時)以上と約2倍に上がった。それなのに、ボード消費電力はGF110の最大244Wから、GK104の195Wへと80%に下がった。

 つまり、FermiからKeplerで、ダイサイズは0.56倍、トランジスタ数は1.18倍、演算ユニット数は3倍、パフォーマンスは2倍、ボード消費電力は0.8倍になった。ラフに言って、パフォーマンス/ワットでは、KeplerはFermiの2.5倍に向上したことになる。

KeplerとFermiの比較(PDF版はこちら)

 プロセスが1世代微細化したことで、理論上はダイはリニアに0.7倍、面積で0.5倍シュリンクするが、FermiからKeplerの数値のアップは、それでは説明がつかない。プロセス技術分だけなら、ダイが0.56倍なら、単純計算では、演算ユニットは1.1倍、パフォーマンスは1.1倍以上にしかならないからだ。

●アーキテクチャの改良でGPUの効率をアップさせるNVIDIAのロードマップ

 一目瞭然のように、FermiからKeplerでは、プロセス技術のアップ分をはるかに上回るパフォーマンスのアップが達成されている。これは、マイクロアーキテクチャの改良によるものだ。NVIDIAは、KeplerではFermiから完全にGPUのマイクロアーキテクチャを一新したが、その効果は劇的だ。

 特に目覚ましいのは、2.5倍ものGPUのパフォーマンス/ワットの向上だ。NVIDIAは、2018~2020年までにGPUのパフォーマンス/ワットを10倍に引き上げようとしている。そのため、GPUの世代毎にパフォーマンス効率を数倍ずつ高めると説明してきた。GK104のパフォーマンス効率を見る限り、NVIDIAはKepler世代ではその公約を果たしつつあるように見える。

 Keplerアーキテクチャの高効率化は、GPUコンピューティングでの性能アップも見込んだものだ。しかし、高効率化は、グラフィックスでも有利に働く。ここ1~2年、NVIDIAはPCグラフィックスでは勢いが弱かった。その一因は、グラフィックスでのパフォーマンス/電力効率が、AMDに対して低かった点にあった。

 しかし、今回のKeplerでは打って変わって、NVIDIAはグラフィックスでのパフォーマンス効率でも大幅に向上させた。そのため、AMDに対して劣勢だった、PCグラフィックスでの勢いを挽回するチャンスがある。ダイが小さくなったことで、コスト競争力も増した。実際に、今回はAMDとNVIDIAで、デスクトップのトップエンドのGPUのダイサイズ(半導体本体の面積)が逆転しており、AMDの方が大きい。ただし、NVIDIAは、真のハイエンドであるGK100クラスを、まだ発表していない。

GPUダイサイズとプロセス技術(PDF版はこちら)

 メモリインターフェイスはGF110の384-bit幅に対して、GK104では256-bit幅と狭くなり、ボードのメモリ量は2GBとなった。これは、チップ自体が小さくなったことで、メモリインターフェイスを狭くせざるを得なくなったためだ。サポートメモリ種類はGDDR5だが、これまでのGTX 580は4Gtpsだった転送レートが、GTX 680では6Gtpsサポートへと高速化されている。そのため、メモリ帯域はGTX 680は192.26GB/secと、GTX 580の192.4GB/secからほぼ変わらない。

 テクスチャユニットはGF110が64ユニットだったのが、GK104では倍の128ユニットに増えた。グラフィックスコアクロックがGF110の772MHzに対して、GK104はベース1.006GHzに上がったため、テクセルフィルレイトは、GF110の49.4GPixel/secから、GK104では128.8GPixel/secへと3倍近く跳ね上がった。

●パイプラインと命令スケジューリングの2点を大幅変更

 どうやってNVIDIAは、Keplerでマジックのようなパフォーマンス効率の向上を達成できたのか。その秘密は、マイクロアーキテクチャにある。

 NVIDIAのGPUアーキテクチャは、ユニファイドシェーダ以降は大きく分けて3世代になる。1世代目のTesla(テスラ)系アーキテクチャがGeForce 8(G8x)とその拡張版のGeForce 200(GT2xx)シリーズ、2世代目のFermi(フェルミ)アーキテクチャがGeForce 400(GF1xx)とGeForce 500(GF11x)シリーズ。Keplerは3世代目となる。TeslaアーキテクチャとFermiアーキテクチャでは大きく異なるが、それでも冒頭で触れた、ディープパイプラインとハードウェアスケジューラという2大特徴は共通していた。

 ところが、Keplerでは、プロセッサアーキテクチャの根本に関わるこの部分が、大きく変革された。つまり、Kepler世代では、NVIDIAアーキテクチャがこれまでにないほど変革された。そして、この変革は、Tesla/Fermi系からKepler系で、設計思想の根本の部分が、変わったことを意味している。それは、パフォーマンス最適化の設計から、パフォーマンス効率最適化への設計思想の変化だと、NVIDIAは説明する。

KeplerとFermiのアーキテクチャ比較(PDF版はこちら)

 詳しくは後の記事で説明するが、NVIDIAが基本的に行なったのは2つの対策だ。1つは、コントロールロジックのオーバーヘッドの削減、もう1つはパイプライン段数の削減による、パイプラインオーバーヘッドの削減。この2つが、従来NVIDIA GPUのパフォーマンス効率を下げていたことが、Keplerアーキテクチャによって証明された。

 結果として、ダイ(半導体本体)上のコントロールロジックの比率が大幅に下がり、その分を演算ユニットに割けるようになった。GK104が、トランジスタ数が20%弱しか増えていないのに、GF110の3倍もの演算ユニットを搭載できている理由の1つはこれだ。また、Keplerでは、パイプライン段数の削減の結果、個々の演算ユニットの消費電力が大幅に下がった。そのため、演算ユニットを増やしても電力向上が抑えられた。

 もちろん、製造プロセスがTSMCの40nmから28nmへ移行した効果もある。TSMCの28nmプロセスは、「High-K Metal-Gate (HKMG)」を採用したことで、リーク電流(Leakage)がある程度抑えられている。しかし、NVIDIAは、例え同じプロセス技術であったとしても、Keplerの方がパフォーマンス効率がはるかに高いと、アーキテクチャ面の変革を強調している。

●命令スケジューリングの一部をCPU側のコンパイラに移行

 KeplerとFermiでは、命令スケジューリングの根本が異なっている。Keplerでは、FermiまでのNVIDIA GPUでのハードウェアによる複雑な命令スケジューリング機構を簡素化し、ドライバソフトウェア(コンパイラ)ベースのプリスケジューリングに切り替えた。これまでは、NVIDIA GPUのプロセッサ単位である「SM(Streaming Multiprocessor)」の中にある命令ユニットが、ハードウェアで全ての命令スケジューリングを行なってきた。レジスタのスコアボーディングによって、レジスタを監視してデータがバリッドになった命令から実行する仕組みだ。この仕組みは、アクティブなスレッド数が増えるにつれて、膨大なリソースを必要とするようになる。

Keplerの命令スケジューリング(PDF版はこちら)

 Keplerでは、この仕組みを一新。スコアボードで管理する命令は、ロードやテクスチャフェッチのような長レイテンシ命令だけに限定した。それ以外の命令については、CPU側で走るドライバソフトウェアのコンパイラのプレスケジューリングに移行することにした。演算命令のレイテンシは、各GPUアーキテクチャで決まっている。そこで、コンパイラは、カーネルの命令をGPUネイティブ命令に変換する際に、レイテンシ情報や命令間の依存性の情報をネイティブ命令に埋め込んでしまう。GPUハードウェア側は、それをチェックして、実行できるタイミングで命令をピックするだけだ。

 この仕組みで、NVIDIAはGPUの命令スケジューリングハードウェアを一気に簡素化した。言ってみれば、GPUにやらせていたことを、CPUに回すことで、GPUを軽くしたわけだ。もちろん、副作用もあり、Kepler世代の方が、CPU側で走るドライバがある程度重くなる。しかし、GPUではコードサイズが相対的に小さく、データサイズが巨大であるため、CPU側のコードのスケジューリングが増えても、電力効率的に見合うと踏んだと思われる。

 ここで面白いのは、ライバルのAMDが、従来のVLIW(Very Long Instruction Word)コアのGPUでは、ドライバのコンパイラによるソフトウェアスケジューリングを行なっていたのを、新しいGCN(Graphics Core Next)からは、スコアボーディングによるハードウェアスケジューリングへと切り替えたことだ。命令スケジューリングに関しては、ちょうどAMDとNVIDIAの関係が入れ替わったように見える。

従来のAMD GPUのVLIW5アーキテクチャ命令発行(PDF版はこちら)

●ディープパイプラインのオーバーヘッドを劇的に減らす

 NVIDIAはG80設計の際に、シェーダ演算コアのパイプラインを深くすることで、シェーダを倍速で動作させる設計を取った。Fermi系もその設計を引き継いでおり、パイプライン段数が深く、FO4(Fanout-Of-4)ディレイが大幅に少なく、高周波数動作が可能になっている。CPUに例えると、Pentium 4のNetBurstアーキテクチャ的な高周波数発想で作られていた。そのため、NVIDIA GPUでは、シェーダプロセッサコアを1.6GHz以上の高周波数で回すことができた。それ以前のGPUコアに対して、パイプライン段数を2倍程度に増やしたと思われる。

パイプラインを2倍に深くした場合(PDF版はこちら)

 このアーキテクチャ選択には、単位ダイ面積当たりのパフォーマンスを高められるという利点がある。だが、不利な点もある。パイプラインを細分化することでラッチ(Latch)回路が増え、しかも倍クロックで動作するため、消費電力が増大し、パフォーマンス/電力が低下する。NetBurstが抱えていたのが、この問題だ。

 NVIDIAはKeplerアーキテクチャの説明で、このラッチ増大の問題に触れ、Keplerではパイライン段数を大幅に減らして、パイプライン中のラッチを減らしたとした。下の図がNVIDIAの説明を元に起こしたKeplerとFermiのパイプラインアーキテクチャの違いの概念図だ。

Keplerのパイプライン(PDF版はこちら)

 KeplerはFermiに対して、パイプライン段数では約半分になり、動作周波数の上限もその分落ちる。そのため、NVIDIAはKepler世代ではコア数を増やすことでパフォーマンスのバランスを取るという発想でいる。コア数を2倍に増やすと、ダイ面積は1.8倍(2倍にならないのはラッチが減るため)に増える。CPUでは、実はラッチとクロッキングの電力消費の比率が非常に大きい。そのため、電力消費は、1個の高周波数コアよりも、2個の低周波数コアの方が減るという。Keplerで、CUDAコア数が増えても電力が低いのは、こうした理由による。

 また、Keplerでは、Tesla/Fermiのプロセッサコアの倍速動作をやめた。GPU全体が(I/Oを除き)同じ動作周波数で動作する。これは、異なるクロックプレーン間の調整が不要になったことも意味する。

●大きく拡張されたSM(Streaming Multiprocessor)の内部

 Keplerでは、こうしたアーキテクチャ面での大幅な改革がなされたため、GPUコアの構成も大きく変わった。NVIDIA GPUは、SM(Streaming Multiprocessor)をプロセッサの最小単位として構成されている。このSMが、Keplerでは大きく拡張され、「SMX」と呼ばれる構造に再編された。Xは、通常はエクストリームの略なので、SM Extremeを意味する可能性が高い。SMXの大きな特徴はサイズが大きくなり、中に備えるCUDAコア数が激増し、命令発行数が大幅に増えたことだ。Fermi世代のGPUのSMと比べると、違いがよくわかる。

KeplerのSMXブロック図(PDF版はこちら)
GF100のStreaming Multiprocessor(PDF版はこちら)
GF104のStreaming Multiprocessor(PDF版はこちら)

 従来のFermiのSMは小規模だったが、KeplerのSMXはユニット数が多い。KeplerもFermiも、CUDAコアは16ユニットずつ1グループとしてまとめられている。これは、NVIDIA GPUの実行単位が32スレッドを束ねたWARPであるためだ。32スレッドのWARPに同じ命令を実行する、この基本は、Keplerでも変わっていない。16ユニットのグループに、2サイクル(命令によっては2サイクル以上)かけて、32スレッドのWARPの命令発行を行なう。

 FermiではSMの中にCUDAコアx16のグループがGeForce GTX 480(GF100)/GeForce GTX 580(GF110)系では2グループ、GeForce GTX 460(GF104)/GeForce GTX 560 Ti(GF114)では3グループだ。それに対して、KeplerではCUDAコアx16のグループが12個も配置されている。

 このほか、超越関数などを実行するSpecial Function Unit(SFU)のx16ユニットのグループが2個、メモリからのデータの読み出し/書き込みを行なうロード/ストアユニットのx16ユニットのグループが2個備えられている。これら、演算とメモリ系のユニットグループだけで、合計16グループだ。この他に、テクスチャユニットが16ユニット配置されている。

 16+アルファの実行ユニットグループに対して、KeplerのSMXの命令ユニットは最大8命令発行だ。半分の数の命令発行数で、実行ユニットをフル稼働させることが可能なのは、実行ユニット側がWARP単位で実行するため、2サイクルに1回しか命令を受け付けられないからだ。

 KeplerでSMXの規模を大きくできた理由の1つは、命令スケジューリングハードウェアが簡素化されたためだ。オーバーヘッドが少なくなり、命令ユニットを増やしても、まかなえるようになった。また、Kepler SMXでは、レジスタ数は2倍に、インフライトで制御できるWARP数は64WARPへと増やされている。ただし、相対的にロード/ストアに対する演算のユニットの比率は増えている。メモリ帯域に対する演算性能の比率のbytes/flops比率も落ちており、従来よりさらにレジスタ間演算の比率を高める必要があると推測される。ちなみに、メモリ階層の構成はFermiから変わっていない。

Keplerのメモリ階層(PDF版はこちら)

 また、SMXには、テッセレータを含むジオメトリパイプライン系の固定機能ユニット群「PolyMorph Engine(ポリモーフエンジン)」が搭載されている。このスループットも2倍に改善されたとNVIDIAは説明している。


●GPU全体の構造はFermi世代からの継承

 NVIDIA GPUは、マルチコア的な構成を取っており、GPU全体が、サブGPUコアである複数の「GPC (Graphics Processing Cluster)」で構成されている。グラフィックス処理では、それぞれのGPCが区分されたリージョンのレンダリングを担当する。この構成自体は、KeplerもFermiも同じだが、SMがSMXに大型化したことで、かなり内容が変わっている。

Kepler GK104全体図(PDF版はこちら)
GF104の全体図(PDF版はこちら)
GF100の全体図(PDF版はこちら)

 従来のFermiでは、各GPCの中に4個のSMが納められていた。各SMに32個のCUDAコアが配置されているため、GPC全体で128個のCUDAコアの構成となる。それに対して、Keplerでは2個の大きなSMXが納められており、CUDAコアは各SMXに192個で合計384個となる。SMX側にテッセレータがあり、GPC側にラスタライザが配置された構成もFermi以来変わっていない。

 各SMXにはギガスレッドエンジンで、タスクが分配される。グラフィックス以外のコンピューティング処理の場合は、個々のSMにそれぞれ異なるカーネル(GPUが実行するプログラム)を割り当てることができる。各SMXは双方向のクロスバスイッチで4個のメモリクラスタに接続されている。各メモリクラスタは、それぞれ64-bitのメモリインターフェイスを備え、それぞれ128KBのL2キャッシュが備えられている。GK104では、4クラスタの合計で、L2キャッシュは512KBとなる。L2キャッシュとメモリコントローラはROP(Rendering Output Pipeline)ユニットとも接続されている。

●シェーダコア以外にも拡張点が多いGeForce GTX 680(GK104)

 こうしたプロセッサアーキテクチャ面での特長に加え、GK104では、さまざまなフィーチャを負荷しており、その中にはグラフィックス処理を向上させるものもある。

 GK104では、ディスプレイパイプラインが拡張され、画像出力を最大4ディスプレイまでサポートする。また、H.264のハードウェアビデオエンコーダ「NVENC」が実装された。最近のCPUと同様に、GPUの動作周波数を引き上げるブースト機能も備える。また、画面のカクツキをなくすAdaptive VSync技術を搭載、レンダリング画像の品質を上げる新しいアンタイエイリアシングモード「TXAA」をサポートする(シェーダ実装なので旧GPUでもサポートされる)。ホストインターフェイスでは、PCI Express Gen3を実装。さらに、デスクトップ版だけでなく、ノートPC版まで同時期に投入される。

 GPUブーストは、CPUのターボブーストと似ている。低負荷で、チップの消費電力が低い場合に、動作クロックを引き上げる機能だ。電力がTDP(Thermal Design Power:熱設計消費電力)に達しないケースで、GPU全体のクロックを上げる。

 GK104のベースクロックは1,006MHzだが、典型的なアプリケーションでは1,058MHzまでクロックを引き上げる。基本のブースト幅は5%程度に過ぎないが、多くのアプリケーションで、1.1GHzかそれ以上に引き上げられるケースがあるという。さらに、GPUでは重要となる、オーバークロックについても、GPUブーストに被せる形でサポートする。

 Keplerアーキテクチャを概観すると、KeplerがNVIDIAの転換点となる大改革であることがわかる。設計思想を、パフォーマンス/電力への最適化へと転じることで、高パフォーマンスを期待できるアーキテクチャになった。これは、プロセスの微細化が進んだことで、パフォーマンス/ダイエリアにあまりフォーカスする必要がなくなったこととも関連している。

 NVIDIAは今回、ハイエンドの80番台に当たるGeForce GTX 680ブランドに、本来ならミッドレンジを示す4番台のコードネームGK104のダイ(半導体本体)を使った。Fermi世代では、ミッドレンジのパフォーマンスGPUであるGeForce GTX 560 TiがGF114で、同じく末尾が4のコードネームだった。このクラスは300平方mm前後のダイサイズで、256-bit幅メモリインターフェイスの系列だ。

 これは、Kepler系でさらに上位のGK100を予想させる。400平方mm以上のダイサイズで、384-bit幅以上のメモリインターフェイスの製品カテゴリだ。HPC市場では、今回のGeForce GK104よりも、メモリ帯域がさらに広く、内蔵メモリも多い、よりコンピューティング向けの製品が求められていると推測される。ただし、今後は、HPCとPCグラフィックスで、基本アーキテクチャは共通化しながらも、製品としての分化はより進んで行くかもしれない。