NVIDIA GPUのCompute Capability

NVIDIAはGPUの世代ごとに偉大な科学者の名前を付けており、このシリーズの初代が「Tesla」、そして2代目が「Fermi」、そして、3代目が「Kepler」で、最新の4代目は「Maxwell」という名前が付けられている。また、この後は「Pascal」、そして「Volta」と名付けられることになっている。

Tesla、Fermi、Kepler、Maxwellと順に開発してきたこれらのGPUは、ある意味では、CPUと同様に、上位互換になっており、前のGPUで動いたPTXコードはそのまま動くようになっているが、ハードウェアの中身は大きく変わっている。

また、NVIDIAのGPUの場合は、PTX命令はGPUで直接実行されるのではなく、GPUドライバが、本当のマシン命令に翻訳したものをGPUハードウェアに供給するという仕組みになっている。マシン命令とPTXはかなり近いといわれるが、GPUの世代によって、同じPTX命令が異なるマシン命令あるいはマシン命令の列に翻訳されて実行されることがあり得る。

これはハードウェアの違いを隠して、同じプログラムを実行させられるという点ではうまいやり方であり、ハードウェアが急速に進歩しているGPUでは、このようなやり方を取らざるを得ない点もある。しかし、逆に言うと、PTXというベールを通してGPUハードウェアを見ることになるので、ハードウェアの構造が分かりにくいという面があり、この記事のようなハードウェアの解説を書くことを難しくしている。

そして、NVIDIAのGPUは世代ごとに、そのハードウェアの作りやハードウェアの物量はかなり変わってきているので、NVIDIAはCompute Capability(CC)という形でどのような違いがあるのかをまとめている。CCはTeslaが1.0~1.3(図3-46、3-47には含まれていない)まで、Fermiが2.x、Keplerが3.x、そしてMaxwellが5.xとなっている。

図3-46 NVIDIAのCompute Capabilityの表 その1

図3-47 NVIDIAのCompute Capabilityの表 その2

例えば、CC 1.xでは、グリッドは2次元までであったが、2.0以降では3次元のグリッドが扱え、ブロックに含む最大スレッド数も512から1024に増加している。また、SMが扱えるブロック数は、Fermiでは8個であったが、Keplerでは16個、Maxwellでは32個と世代ごとに倍増している。

また、倍精度浮動小数点数が扱えるようになったのはCC 1.3以降であり、CPUとGPUのメモリの統一アドレスが可能になったのはCC 3.0以降、GPUで実行される関数から、GPUで実行される関数を呼び出すDynamic Parallelismが使えるのはCC 3.5以降といった具合である。