大量の計算を効率的に実行するGPUの構造

このように頂点シェーダやピクセルシェーダは大量の計算を行う必要がある。これらの計算は、初期には計算が簡単な固定小数点の演算が用いられたが、ピクセルの明るさなど取り得る値の範囲が大きい量を扱うには不便であるので、現在では、表せる値の範囲が広い浮動小数点の数値を用いて計算を行うというのが普通である。一般的には32bitで1つの数を表す単精度の浮動小数点数が用いられ、数の表現や演算の精度などについてはIEEE 754規格に準拠するものが一般的である。しかし、ハードウェアを減らして性能を上げるために、24bitや16bitの浮動小数点数を用いる場合もある。

いずれにしても、頂点座標の変換やピクセルの明るさや色の計算は大量の計算となるので、GPUとしては、大量の計算を高速で実行できるアーキテクチャであることが重要である。

これらの計算は浮動小数点演算であるが、アドレスの計算など整数の計算も必要であるので、浮動小数点演算器、整数演算器、ロードストアユニットなどのいくつかのユニットを持ち、これらのユニットそれぞれの動作を指定するためにVLIW(Very Long Instruction Word)の命令を持つアーキテクチャが多く見られた。例えば、NVIDIAのGeForce 6800 GPUは、頂点シェーダは123bit長の命令を使うVLIWで、ピクセルシェーダも2つのシェーダユニットそれぞれにいくつかの演算を並列に指定するVLIWとなっていた。

GeForce 6800でもピクセル処理には2つのシェーダを使っていたが、頂点ごと、ピクセルごとに処理するデータの値は異なるが、演算は同じであることに着目して複数のデータに並列に同じ演算を行うSIMD(Single Instruction stream Multiple Data stream)アーキテクチャのGPUが作られた。

もちろん、各頂点、各ピクセルの処理をそれぞれプロセサコアを使って並列に処理を行っても良いのであるが、同じ命令を複数のコアが読んで解釈するのは無駄で、命令のフェッチとデコードの部分は1つにして、演算器だけを並べてやれば良い。こうすれば、同じ数のトランジスタで、より多くの演算器を作ることができ、演算1回あたりの消費エネルギーの点でも有利である。