ATIのGPUはVLIW命令をSIMD実行する

このような計算を効率よく実行するためにATIが用いたのがVLIW(Very Long Instruction Word)命令のSIMD実行という方法である。なお、買収後しばらくはATIブランドを継続して使っていたが、現在ではすべてAMDブランドに切り替わっているので、ここでもAMDという名称を用いることにする。

VLIW命令には、32ビット浮動小数点の積和演算が4命令、32ビットの逆数や三角関数などを計算する「SFU(Special Function Unit)」命令が1つ。ただし、このSFUは32ビットの積和演算も実行することができる。そして、条件分岐命令が1命令含まれている。このVLIW命令は通常のスカラ命令を6個含んでいるのであるが、AMDは演算が行える命令だけを数えて「VLIW5命令」と呼んでいる。

図8.2 通常のスカラ命令を6命令まとめたVLIW5命令

そして、このVLIW5命令が16基のスレッドプロセサを含むSIMDコアに発行される。16基のスレッドプロセサは同じ命令を実行するのであるが、レジスタファイルの内容はスレッドプロセサごとに違っているので、SIMD(Single Instruction Multiple Data)の実行が行われることになる。

なお、ハイエンドのGPUでは、数十個のSIMDコアを搭載し、ローエンドのGPUになるにつれて、SIMDコアの数は少なくなって行く。

VLIW命令に6つの命令を詰め込むのは、コンパイラの仕事である。コンパイラは、相互に依存性が無い命令で、かつ、4命令は演算命令、1命令は演算命令かSFU命令、もう1命令は条件分岐命令を集めてくる必要がある。この条件に合う命令が無い場合は、その命令のスロットはNOP命令を詰めることになり、演算ユニットは遊んでしまう。

AMDのVLIW方式のGPUでは、1つの頂点のX、Y、Z、Wを1つのVLIW命令の4つの演算命令に割り当てて実行を行うことを意図している。X、Y、Z、Wの計算は相互に依存性が無いので、VLIW実行しても問題は生じない。

また、ピクセル処理の場合は、各ピクセルはR、G、Bと透過度を表すαの4要素で表わすのが普通であり、この4要素をVLIWの4演算命令に割り当てると効率よく演算ユニットを動かすことができる。

16基のスレッドプロセサは(アクセスするレジスタファイルは異なるが)同じ命令を4サイクルにわたって実行し、合計64頂点、あるいは64ピクセルを並列に実行するようになっており、AMDは、このまとまりをWavefrontと呼んでいる。

なお、VLIW5命令では、SFUの命令スロットが無駄になってしまうケースが多いので、2011年に発売されたHD6000シリーズのハイエンドのHD6900 GPUからは、演算命令を1つ減らしたVLIW4命令に変更した。VLIW4命令では、SFU命令を演算に使い、4要素の処理を行うようになっている。1つのVLIW命令で見ると演算数が1つ減っているが、その分、スレッドプロセサが小さくなり、チップに多数搭載できるようになっているので、損とは言えない。特に、利用率の低い命令スロットを減らすことは、全体としてはプラスになっているはずである。