■後藤弘茂のWeekly海外ニュース■
NVIDIAは、Kepler(ケプラ)世代のフラッグシップGPU「GK110」のベールをついに剥いだ。といっても、提供時期は、GK110のHPC(High Performance Computing)向け製品「Tesla K20」が2012年第4四半期と、まだ先の話だ。GK110/Keplerの新機能も、今年遅くにリリース候補版が出るCUDA 5(現状はプレビュー)がないと使えないものが多い。しかし、垣間見える機能だけを見ても、GK110が野心的なGPUであることがわかる。
NVIDIAは、米サンノゼで開催している同社の技術カンファレンス「GPU Technology Conference(GTC)」で、GK110とKeplerアーキテクチャのこれまで明かされていなかった機能を明らかにした。その中には、GPU内でスレッド生成を行なう「Dynamic Parallelism」、ハードウェアタスクキューイング「Hyper-Q」、GPUのバーチャライゼーションをベースにした「NVIDIA VGX」プラットフォームとその上でのクラウドゲーミングプラットフォーム「GeForce GRID」が含まれる。Hyper-QとDynamic Parallelismは、GK110以降のKeplerファミリの機能となる。
これらはいずれも、GPUのプログラム性やGPUの性能効率を引き上げ、さらにはGPUの適用範囲を広げることを可能にする技術だ。もっとも、CPU側から見た場合、すでにCPUでは実装されている技術が、ようやくGPUに入るとも言える。逆を言えば、CPUとGPUがまた一歩近づき、その分GPUが使いやすくなると見ることができる。
NVIDIAは、Keplerアーキテクチャでは、グラフィックス向けのGeForce GTX 680(GK104)を最初にリリースした。GK104は、300平方mm以下のダイに256-bit幅のメモリインターフェイスを搭載した、GPUとしてはミッドレンジクラスのチップだ。それに対して、今回発表されたGK110は、500平方mmクラスのダイに384-bit幅メモリインターフェイスと、最近のハイエンドGPUらしい仕様となっている。
GK110のダイ PDF版はこちら |
●プロセッサクラスタSMXのレイアウトが異なるKeplerファミリ
NVIDIA GPUのプロセッサクラスタの最小単位である「SMX(Streaming Multiprocessor eXtreme)」は、GF110ダイ上で見分けがつく。ただし、ダイ写真上のSMXは、GK104とGK110で大きくレイアウトが異なる。中央部分のレイアウトは共通しているので、それを合わせて同等と推測されるスケールにして並べたのが上の図だ。比較すると、GK110のSMXの方が十数パーセントかそれ以上大きいと推測される。これは、倍精度演算ユニットなどが強化されたためだ。
GK104系は「Kepler1」アーキテクチャと呼ばれるのに対して、GK110は「Kepler2」と呼ばれている。NVIDIAの前世代のFermi(フェルミ)アーキテクチャでは、ハイエンドのGF100/110系と、それ以下のグラフィックス向け製品では、プロセッサコア部分のアーキテクチャが異なっていた。今回も、Kepler1とKepler2では、プロセッサコアのアーキテクチャが異なる。また、SMXから全体のダイサイズを割り出すと、少なく見積もっても500平方mm前後となる。従って、NVIDIA GPUの限界に近いダイサイズを維持する路線は、Kepler世代でも健在ということになる。
GPUのダイサイズ推移 PDF版はこちら |
下は、GK110のSMXのブロック図だ。GK104との大きな違いは、64個の倍精度(DP)演算ユニットが加わっている点にある。この倍精度ユニットは単精度演算はできない。単精度専用の演算ユニットは192個で、全体は4リージョンに大きく別れている。ちなみに、Keplerマイクロアーキテクチャの特長である浅いパイプラインやスケジューリングの部分的なソフトウェアへの移行は、Keplerファミリ全体で共通していると見られる。
GK110のSMX PDF版はこちら |
KeplerのSMXとFermiのSM比較 |
KeplerとFermiのアーキテクチャの違い PDF版はこちら |
●2,880個と推定されるCUDAコアに500平方mmクラスのダイサイズ
フアン氏 |
チップ全体を見ると、Kepler初代のGK104は294平方mmのダイでトランジスタ数は3.54B(35.4億)、8個のSMXを搭載し、合計の単精度浮動小数点演算ユニット(CUDAコア)数は1,536個を数える。それに対して、公開されたGK110は7.1B(71億)トランジスタで、NVIDIAのJen-Hsun Huang(ジェンセン・フアン)氏(Co-founder, President and CEO)によると「現時点で最も複雑な(トランジスタ数の多い)チップ」だという。
GK110の公開されたダイ写真を見るとSMXの数は15個。GK110のSMXの浮動小数点演算ユニットは192個なので、合計の単精度演算ユニット(CUDAコア)数は2,880個の計算になる。ただし、製品では歩留まり確保のためにSMXが1個無効にされる可能性があり、その場合はCUDAコア数が減る。下のスライドにあるTesla K10は、GK104ベースのTeslaで、こちらはGTC時に正式発表された。
GK104のTesla K10 |
性能レンジはHPC向けのTesla K20で、Fermi世代のTeslaに対して倍精度浮動小数点演算パフォーマンスで3倍と発表されている。Fermiベースの「Tesla M2090」の倍精度性能は666GFLOPSなので、Tesla K20は2TFLOPS以上の倍精度性能を持つ計算になる。
GK110では、倍精度の性能は単精度の3分の1で、15SMXの場合はチップ全体で960個の倍精度演算ユニットとなる。そのため、3倍性能を達成するとしたら、1GHzかそれ以上で動作させる必要がある。その場合、単精度のパフォーマンスは6TFLOPS近くになる。
ちなみに、GK104では、2個のSMXで1個のGPC(Graphics Processing Cluster)を構成して、ラスタライザなどを共有する仕組みとなっている。しかし、GK110のダイを見ると、3個のSMXでセットになっているように見える。全体のSMX数も15であることを考えると、GPCは3個のSMXで構成されている可能性がある。下はGK110の全体構成だ。
GK110の全体構成 PDF版はこちら |
●CUDA 5と連携するGK110の新機能
GTCでのJen-Hsun Huang氏のキーノートスピーチでは、GK110の発表と合わせて、Keplerのこれまで明かされていなかった機能や、GK110とともに導入される新機能が紹介された。中でも重要なのは、GPU側での動的なスレッド生成によるDynamic Parallelismだ。これによって、CUDA 5での動的リンカーのサポートが可能になり、構造的に複雑なプログラムが容易になった。プログラミングモデルやパフォーマンスに大きな影響を与える重要な拡張となっている。NVIDIAのMark Harris氏(Chief Technologist, GPU Computing)は「Dynamic ParallelismはCUDA 5の最もエキサイティングな機能だ」と語った。
GPU側で動的なスレッド生成によるDynamic Parallelism |
そもそも、GPUでは動的なオブジェクトリンキングができなかったこと自体が、通常のプログラミングの常識からすれば驚くことかも知れない。しかし、これは、CPUからカーネルをダウンロードして実行するというGPUのコプロセッサ的な実行モデルのためだ。従来のGPUは、自身ではカーネルを立ち上げることができないため、新たなカーネルを立ち上げようとする度にCPUへと処理を戻さなければならなかった。そのため、Fermiアーキテクチャまでは、ネストする複雑なプログラムやシミュレーションでの空間メッシュ分解の最適化などは難しかった。
しかし、GK110では、どのスレッドからもGPU自身でカーネルを立ち上げることができるようになる。そのため、GK110では、そうした従来では難しかったプログラムが容易になり、パフォーマンス最適化も容易になる。キーノートスピーチやCUDAのセッションではその例として、流体シミュレーションでの下のスライドの例が示された。
流体シミュレーションの例 |
左のようにグリッドが疎である場合は、パフォーマンスは高いが精度が低くなる。真ん中のようにグリッドが密である場合は、精度は高くなるもののパフォーマンスは低くなる。しかし、右の例のようにグリッドのサイズをアダプティブに変えて、精度が必要な部分だけグリッドを細かくすると、最適なパフォーマンスで最適な精度を得ることができる。
キーノートスピーチでは、具体的な例として、銀河系とアンドロメダ銀河の衝突の天体シミュレーションのデモが行なわれた。30万弱のボディをリアルタイムでシミュレートするこのデモは、Dynamic Parallelismで可能になったという。
Dynamic Parallelismによって実現したシミュレーション |
NVIDIAの記者会見でHuang氏は次のように語った。
「銀河衝突のアルゴリズムでは、エンジニアが1年以上Fermiに移植しようとしてきた。しかし、Keplerでは、Dynamic Parallelismの機能ために、彼は週末までの間に移植ができてしまった。複雑なネストしたアルゴリズムの移植では、Dynamic Parallelismは非常に強力だ」。
●GPUプログラミングを変えるDynamic Parallelismもちろん、メッシュの最適化だけでなく、Dynamic Parallelismの恩恵は、もっと幅広い分野で得ることができる。下はCUDA 5のセッションで示されたコード例だ。左は従来アーキテクチャで、GPU側でカーネルを立ち上げることができないので、GPUからいったんCPUにタスクを戻して、CPUからカーネルを発行させている。それが右のKeplerになると、GPU側にいったん投げたら、以降はGPU側でカーネルを立ち上げて実行し、最後にCPUへと同期で返すまでは、CPUとの間のやりとりがなくなっている。CPUとGPUの間での煩雑なデータ交換が減少し、CPUがその分、より長い時間フリーになっている。
CUDAのコード例 |
Bill Dally氏 |
NVIDIAのBill Dally氏(Chief Scientist)は次のように説明した。
「Dynamic Parallelizationは非常に重要だ。これまでは、GPUに小さなスレッドアレイがたくさんあるコードを移植しようとする場合に問題に直面していた。スレッドアレイから次のスレッドアレイに行く場合に、CPUとGPUの間を行ったり来たりしなければならなかったからだ。しかし、今度は、各スレッドが次のスレッドを生成できるようになるため、GPUコーディングで必要だったコードが不要になる」。
Dynamic ParallelismによってCUDA 5では、動的にオブジェクトを呼び出してリンクさせることができるようになった。言い換えれば、GPUで実行中のカーネルから、別なカーネルを呼び出すことが可能になった。従来のFermiまでのGPUでは、コンパイラでライブラリを静的に結合して実行ファイルにビルドする必要があった。しかし、Keplerでは動的にロードできるようになったため、ライブラリの効率的な活用が可能になる。
CUDA 5では動的にオブジェクトを呼び出してリンクできる |
Dynamic ParallelismでNVIDIAが実現しているのは、従来、CPU上のドライバソフトウェアで行なっていた機能のGPUへの取り込みと考えることもできる。これは、CPUコアを統合した製品が(モバイル以外では)まだ先であるNVIDIAにとって、より重要な機能でもある。もっとも、GPUはグラフィックスでは、以前から多少は似たようなことをやっていた。
Dynamic Parallelismは、プログラミングの側面からはKeplerの重要な新機能で労力を大幅に省くことができる。それだけでなく、GPUの稼働率を上げ、カーネル実行の並列性を高め、GPUとCPUのロードバランシングを容易にし、全体のパフォーマンスアップも実現する。そして、GPUが、よりCPUに近づいたことを象徴している。