Radeon HD 2000シリーズは、汎用シェーダユニット5基でSIMDユニットを構成し、これが複数集まってSIMDアレイを構成している…ということは前段で述べた。

ここでは、この最小単位の汎用シェーダユニットについて見ていくことにしよう。

Radeon HD 2900シリーズでは汎用シェーダユニットは320基あるが、実際には5基で1固まりの構成を取る。5基でひとかたまりという考え方は、従来GPUの頂点シェーダの構成に似ているが、実際、AMD側も、それを意識して5基一組の設計にしたことを明かしている。

なお、Radeon HD 2000シリーズアーキテクチャでは、汎用シェーダユニットは正確には「ストリーミング・プロセッシング・ユニット」(Streaming Processing Unit)と命名されている(本稿では汎用シェーダユニットという呼び方で通すことにする)。

汎用シェーダユニット=ストリーミング・プロセッシング・ユニット(Streaming Processing Unit)

図は、5基の汎用シェーダユニットからなる1個のSIMDユニットを拡大したものだ。

5基の汎用シェーダユニットは全て32ビット浮動小数点(FP32)演算精度を持つスカラー積和算器のポテンシャルを持つ。つまり、1つのSIMDユニットは5ウェイのスーパースカラ積和算器として機能できるのだ。

これに加え、図中右端に描かれているように、分岐実行ユニット(Brance Execution Unit)も備え付けられている。

1基1基の汎用シェーダユニットが、浮動小数点の積和算をこなせるスカラプロセッサになっているという点では競合NVIDIA GeForce 8000シリーズと同じだ。Radeon HD 2000シリーズ風にGeForce 8000シリーズを表現するならば「SIMDSIMDアレイは8ブロックに別れており、さらに各ブロックは16基の完全分解されたスカラプロセッサ(汎用シェーダユニット)で構成されている」という感じになるだろうか。どちらが優れているかを判断するのは難しいが、演算器の"起用粒度"はGeForce 8000シリーズの方が細かいので、全く異なる種類のタスクを同時多発的に実行させた場合には、Radeon HD 2000シリーズよりもGeForce 8000シリーズの方が効率がよいかもしれない。

図は先代のRadeon X1000シリーズの頂点シェーダユニットの拡大図だ。

先代Radeon X1000シリーズの頂点シェーダユニットの拡大図

先代Radeon X1000シリーズのピクセルシェーダユニットの拡大図(参考)

競合NVIDIA GeForce 8800 GTXの全体ブロック図(参考)

Radeon X1000シリーズ以前では、このように4要素ベクトル演算器(128bit Vector ALU)+1スカラ演算器(32bit Scalar ALU)の構成を取っていた。Radeon HD 2000シリーズでは、丁度先代の4要素ベクトル演算器をスカラ演算器に分解したようなイメージに近いことがよく分かる。

先代X1000シリーズでは、4要素ベクトル+1スカラが同時実行できるようにシェーダプログラムの命令の並びなどを工夫しないと、実行効率が上がらなかったが、HD 2000シリーズでは、5基のスカラユニットを組み合わせて実行できる自由な組み合わせのベクトル演算とスカラ演算が同時に実行できるようになったのだ。

ところで、図中、左端の汎用シェーダユニットが太くなっていることに気が付いたかも知れない。これは、この1基のみが指数、対数、三角関数などの複雑な超越関数(Transcendental Function)の計算能力が与えられていることを意味している。なお、32ビット浮動小数点演算精度、整数計算、論理演算、比較演算といった基本スペックについては5基の共通仕様となっている。

計算結果は図下段の汎用レジスタ(GPR:General Purpose Registers)に格納されて、次の命令実行(次のデータの処理)に移る。GPRには、前述したメモリレイテンシの隠蔽のために行われたスレッド切り換えの際に、眠らされたスレッドの途中データなども保持されている。ここはいわば汎用シェーダの一時記憶メモリ(超高速なSRAM)となっており、図中では小さいが、実際のチップ上では汎用シェーダユニットの何倍も大きい面積を占めているという。先代までは各モデル毎に取り扱える内部スレッド数を公表していたが、今世代ではこの値は非公開となっている。おそらく、これは、頂点シェーダ、ジオメトリシェーダ、ピクセルシェーダのような、それぞれが仕様の異なるシェーダ処理を同時多発的に実行させる統合型シェーダアーキテクチャでは、実行できる最大スレッドが状況によって全く異なってしまうため、仕様として表せなくなったからであろう。

汎用シェーダユニットが、実行していたシェーダプログラムを最後まで終えると、その最終結果の情報は「シェーダーエクスポート」(Shader Export)を通じてディスパッチプロセッサへと受け戻される(全体ブロック図参照)。頂点シェーダとしての結果であれば、ピクセルシェーダへ引き継ぐ…といった部分がここで行われる。