両者ブロックダイアグラムの比較

ここからはアーキテクチャについて、やや深く切り込んで両者を見ていくことにしよう。

GeForce GTX 200シリーズは基本的にはGeForce 8800シリーズをベースに拡張を施したものといえる。

下の図1/図2がGeForce GTX 280/GTX 260の全体ブロック図になる。

図1: GeForce GTX 280の全体ブロック図

図2: GeForce GTX 260の全体ブロック図

GeForce GTX 200シリーズは、GeForce 8800シリーズから始まったGPGPUでの活用を視野に入れたアーキテクチャを採用しているため、3Dグラフィックス処理用の「GPUモード」と、CUDAを動作させるための「GPGPUモード」の2つの動作モードを持っている(ちなみに、これまであまり語られてこなかったが、GeForce 8000/9000シリーズにもGPUモードとGPGPUモードがある)。

それぞれの動作モードでのブロックダイアグラムは図3/図4のようになる。

図3: GPUモードにおけるGeForce GTX 280のブロックダイアグラム

図4: GPGPUモードにおけるGeForce GTX 280のブロックダイアグラム

両モードの違いは、図を見ると分かるように各機能ブロックの役割が微妙な変化と、各機能ブロックの有効化、無効化に現れる。例えば上段の「スレッドスケジューラ」(Thread Scheduler)が、GPUモードでは、SP群を頂点シェーダ、ジオメトリシェーダ、ピクセルシェーダの各種シェーダとして起用するマネージメント業をこなすが、GPGPUモードではSP群を均等な演算リソースと見なしてのマネージメント業をこなすようになる。また、ブロック図下段に着目すれば、GPUモードではレンダリング結果をビデオメモリに出力するROP(Rendering Output Pipeline)ユニットが有効化されるが、GPGPUモードではこれが無効化されて、代わりにビデオメモリへの読み書きを総括するAtomicユニットが有効化されるようになる。

Radeon HD 4800シリーズのブロックダイアグラムは図5のようになる。

図5: Radeon HD 4800シリーズのブロックダイアグラム。Radeon HD 4870とHD 4850とでブロックダイアグラム上の違いはない

Radeon HD 4800シリーズにはGPUモード、GPGPUモードといった明確なモード変更のような仕組みはない。Radeon HD 4800シリーズもGPGPU活用には対応するが、開発者が直接Radeon HD 4800シリーズ向けのCAL(Compute Abstraction Layer)コードを書くか、あるいはGPGPU用開発言語システムを利用し、そのコンパイラなどを利用して中間言語を吐き、これをランタイム時にもう一段階コンパイルしてRadeon HD 4800シリーズ用のCALコードに変換する仕組みをとる必要がある。

ATIがスタンフォード大学のGPGPU開発言語「Brook」を拡張した「Brook+」を提供し始めたのは去年の後半からで、やや出足が遅れている感はあるが、仕組み自体はNVIDIAのCUDAとよく似ている。ATIとソフトスタジオとの共同でビデオエンコーダなどのGPGPUアプリケーションが開発されているが、筆者の取材では、現時点ではどれもCALコードベースで行われており、現時点でのRadeon HDシリーズ向けのGPGPUアプリケーションの汎用性はやや低いように思われる。

「Brook+」の仕組み。中間言語(IL)はNVIDIA CUDAでいうところのPTXに相当する。PTXについてはこちらを参照のこと

「Brook+」のサンプルコード