GCNのスカラユニット

GCNのスカラユニットは、SIMDユニットの条件分岐などの制御を行う。スカラユニットは8KB(2Kエントリ)のレジスタファイルを持ち、このレジスタファイルは、4つのSIMDユニットに512エントリずつ割り当てられている。

スカラユニットは物理的には1つであるが、2つのスレッドを並列実行するので、論理的には2つのパイプラインとして動作する。一方のスカラパイプラインは、条件分岐の処理を行う。また、割り込みや一部の同期命令の処理も第1のスカラパイプラインが担当する。GCNでは命令レベルの粒度の割り込みをサポートしたことで、命令単位でブレークポイントを設定して、プログラムをデバグすることが可能になっている。

第2のスカラパイプラインは64ビットの整数演算機能を持ち、データキャッシュからスカラデータを読み出す場合のアドレス計算ユニット(Address Generation Unit)として動作する。また、jumpやcall命令のアドレス計算もこのパイプラインが担当する。また、プレディケート実行も、スレッドのforkとjoinをサポートするハードウェアを使って、この第2のパイプラインが管理する。

なお、64ビットの計算には、32ビット幅の2つのレジスタファイルエントリを結合して使っている。

スカラユニットのパイプラインはデータ処理ではなく、コントロールの処理を行うために設けられており、メモリに書き込む必要は無いので、L1データキャッシュは4CUで共用される16KBのリードオンリーメモリになっている。L1データキャッシュの読み出しは4バイトから64バイトの長さで行うことができ、4バイトを超える場合は、連続したレジスタファイルエントリに書き込まれていく。

GCNのベクトル実行

GCNのベクトル演算の実行は4つのSIMDユニットで行われる。各SIMDユニットは16個のFP32演算器を持ち、4サイクル同じ命令を実行することでWavefront 1個分の64演算を実行するという構造になっている。

SIMDユニットは、64KBのレジスタファイルを持っている。A+B×C→Dという積和演算を行うためには、3つのリードポートと演算結果を書き込むポートが必要であり、レジスタファイルの各レーンは3R1W構成になっている。そして、このレジスタファイルは演算器の数に対応した16レーン分のデータとアドレスポートを持っている。

ベクトル演算器は、FP32演算は毎サイクル新しい演算を開始できるが、64ビットの倍精度浮動小数点演算(FP64)の場合は、実装により、2~6サイクルに1回の演算となる。倍精度のFP64演算の場合は、レジスタファイルとやり取りするデータ量が2倍になるので、データのやり取りに2サイクル掛かるという実装が一般的であり、レジスタファイルの制約からFP64演算はFP32の1/2の演算性能という実装が普通である。これはNVIDIAのGPUでも、同じである。

加えて、GCNの演算器では、より多くのサイクルを使って処理を細分化してFP64演算に必要なハードウェア量を減らすというオプションがある。最高のFP64演算性能を必要とする科学技術向けの製品ではFP32の1/2の演算性能とした製品を作り、グラフィックスの実行が中心で、FP64を必要とする汎用の計算は、あまり使わないという用途の製品には、FP64の性能は1/6に抑えて、浮いたチップ面積にコンピュートユニットを詰め込んで、FP32の性能を上げるというような選択が可能となるようになっている。

また、GCNのSIMDユニットでは、整数の32ビット演算もハードウェア量を減らすために、2サイクル実行となっている。