最近、GPUの計算性能の高さからGPGPU(General Purpose Computation on Graphics Processing Unit)とかGPUコンピューティングとか言われる、GPUを科学技術計算処理に利用する研究が盛んになっている。また、GPUを製造するNVIDIAは、科学技術計算を3Dグラフィックスに続く新市場として捉えており、Teslaという科学技術計算用の製品を発売し、GPU上のプログラム開発環境としてCUDA(Compute Unified Device Architecture)を公開している。但し、NVIDIAのDavid Kirkチーフサイエンティストは最近、"GPGPU is dead, GPU Computing is the future for affordable supercomputing"と題した講演を行っており、同社はGPGPUという用語は過去のもので、同社のCUDAとCUDA Enabled GPUこそが将来の方向という主張である。

ということで、同社のCUDA Enabled GPUであるGeForce GPUのハードウェアアーキテクチャとCUDAについて概観してみようと思う。

グラフィックプロセッシング

GPUによる科学技術計算に行く前に、まず3次元グラフィックス処理について、理解しておこう。3次元の物体を画面上に表示するにあたって、まず物体の表面を細かい三角形の列であるトライアングルストリップに分割する。

トライアングルストリップの例

この図では10個の三角形のつながりしか描かれていないが、もっと長くすれば、リンゴをむいた皮のようになる。リンゴの皮がリンゴという曲面をおおっていたように、このトライアングルストリップを使ってどのような曲面でも近似的に表現することができる。但し、複雑な形状は一つのトライアングルストリップでは表現できず、複数のトライアングルストリップを必要とする。また、近似の程度を良くするためには各トライアングルを小さくしてやれば良い。

トライアングルストリップは、最初の三角形は(1)(2)(3)の座標で表し、次の三角形は(2)(3)(4)、その次は(3)(4)(5)というように、1個の新しい座標を追加すれば1個の三角形が表現でき、曲面の表現に必要なデータ量を小さくすることができる表現形式である。

例えば、自動車の外形をトライアングルストリップで表現する場合、X軸は車の前後方向、Y軸は左右方向で、Z軸は高さ方向に取り、車の中央を原点とするような座標系でトライアングルストリップの各頂点を記述することができる。しかし、この車を画面に表示する場合は、それを見る人の視点の方向から見た座標に変換してやる必要がある。

そして、トライアングルストリップの各三角形がどのような色や明るさで見えるかは、その三角形の面を照らす光源の位置と面の向きによる。詳細は省略するが、各頂点において(曲面の近似であるので、各頂点が異なる面の向きを持っている)光源と視点と面の向きの角度とRGBの各色に対する反射率や反射が鏡面反射であるか、乱反射であるかなどから、視点で見えるはずの各色の明るさを計算する。この計算は複数の光源がある場合には、それぞれの光源について計算して、それらの明るさを合計する。

さらに、これらの変換を行ったトライアングルストリップを画面に表示するには、質感を表現するためのテクスチャを貼り付けたり、視点方向から見て前方の三角形に隠れる部分は表示しないというZバッファ処理などを行う必要がある。

これらの処理は、膨大な計算を必要とするので、従来のグラフィックプロセサでは、それぞれの段階の処理を行う専用ハードウェアを持ち、入力されるトライアングルストリップの座標を流れ作業的に処理するパイプライン構造がとられていた。

しかし、グラフィック表示に高い写実性が求められるようになると、より複雑な計算処理が必要となり、ハードウェアによる固定的なパイプラインでは処理が難しくなってきた。このため、最近では固定パイプラインではなく、より汎用的な処理ができるUnified Shader(ユニファイド シェーダー)方式のグラフィックプロセサ(Graphic Processing Unit:GPU)が一般的になってきている。