図8.4はGCNのCompute Unit(CU)のブロックダイヤである。右側に演算を行う4つのSIMDユニットが描かれている。各SIMDユニットは64KBのレジスタファイルを持っている。そして、4つのSIMDユニットで共用の16KBのL1データキャッシュと64KBのLDS(Local Data Storage。NVIDIAのシェアードメモリと同じ位置づけのメモリ)がある。

NVIDIAのCUDAコアは整数演算を行うこともできるが、AMDのSIMDユニットに含まれているベクタALUは浮動小数点の積和演算だけで、整数演算機能は持っていない。GCNでは、整数演算は、SIMDユニットの左隣に書かれているスカラユニットで実行するという造りになっている。

図8.4 GCNのコンピュートユニットのブロックダイヤ

そして、図8.4の左端は命令のフェッチを行うユニットで、その右にそれぞれのSIMDユニットのPC(Program Counter)と10Wavefront分の命令バッファがある。各SIMDユニットは4サイクルかけて1つのWavefrontを実行し終わると、命令バッファから次に処理するWavefrontを受け取って実行するという動作をする。4つのSIMDは、個別のPCと命令バッファを持っているので、それぞれが異なるプログラムを実行することもできる。

それぞれのSIMDは10Wavefrontのバッファを持っており、通常は10個のWavefrontの命令をラウンドロビンで順番に実行して行く。このように実行すると、同じWavefrontの次の命令を実行するのは4サイクル×10=40サイクル後になり、演算器のレーテンシを隠すことができる。

そして、4つのCUで共用される16KBのスカラのリードオンリーL1キャッシュと32KBのL1命令キャッシュがある。

L1命令キャッシュから読み込まれた命令は命令バッファに入れられる。命令キャッシュのラインは64バイトで、一般的な命令の長さは8バイトであるので、多くの場合、8命令が入っている。そして、命令バッファからの読み出しは、最大5命令を読み出すことができる。

通常の命令はSIMDの中の演算器で実行されるが、バリア命令やプレディケート実行でスキップされる命令などの演算器を必要としない命令は、Wavefrontのバッファの中で処理されるようになっている。バリアに関しては、それぞれのCUは16個のバリア命令を追跡するバッファを持っており、Wavefrontの進行をグローバルに同期させるために使用することができる。

CUは、毎サイクル4つのSIMDユニットと1つのスカラユニットに命令を発行することができ、これは命令バッファから最大5命令を同時に読み出せるということと対応している。