両者で実装方式が異なるGPUの根幹機能

GPUの根幹機能の実装方式において、両者の設計思想の違いが明確化しているのも、今世代のRadeonとGeForceの違いとして挙げることができる。

まず、順当にRadeon HD 48x0をデュアル化してDirectX 11対応化を果たしたRadeon HD 58x0から見ていくとすると、GPUの根幹機能の1つであるラスタライザも順当にデュアル化がなされた。

ラスタライザとは、ポリゴン(線分などの各種プリミティブも含む)を、レンダリング解像度に配慮しつつ実際に描画するピクセルへの対応付けを計算するユニットだ。いわばポリゴン単位タスクからピクセル単位タスクに分解する役割を果たすところ……といってもよいだろう。

Radeon HD 58x0の全体ブロックダイアグラム

Radeon HD 58x0のGraphics Engine部のクローズアップ

Radeon HD 5870では、汎用シェーダユニットであるSPが先代の二倍に増加され、その多くが相対的にピクセルシェーダへの起用が見込まれるため、そのタスク発注元のラスタライザも倍化したと言うことなのだ。

このラスタライザの倍化にともない、「早期Zカリング」(Early Z-Culling)を行うための「階層型Zバッファ・ユニット」(Hierarchical Z-Buffer Unit)も倍化されている。なお、階層型Zバッファとは、ラスタライザで生成したピクセルタスクのうち、「視点からは見えていないピクセル」や「画面外のピクセル」などを破棄するために実施される仕組みだ。一般にラスタライザから算出されたZ値ピクセル群の最小&最大値と、描画先フレームバッファ側のZバッファ内にある、対応するZ値ピクセル群の最小&最大値とを比較すること処理を行う。念のために言っておくと、実際にレンダリング最終段階でピクセルを描画する際に行われるZ値可否判定(Zテスト)とは別モノで、早期ZカリングはSPをピクセルシェーダとして起用する前に不要なピクセル描画を排除する仕組み。ピクセルシェーダに仕事を発注する前に行うカリング処理だから"早期"Zカリングというわけだ。

ラスタライザは、Z値ピクセルの割り当ても同時に算出するので、ラスタライザが二倍になれば、その後段とも言える階層型Zバッファ・ユニットもセットで倍化されるのは「成り行き」ということになる。

なお、ラスタライザや階層型Zバッファユニットが搭載されているジオメトリエンジンにはGraphics Engineという名称が付けられている。このGraphics Engineにはこの他、Vertex Assembler(頂点アセンブラ)やGeometry Assembler(ジオメトリアセンブラ)を内蔵している。これらについても簡単にその役割を解説しておこう。

一つめの頂点アセンブラは頂点シェーダが必要とする頂点バッファやインデックスバッファのアドレスデータをまとめる仕事をこなす。二つめのジオメトリアセンブラはジオメトリシェーダが必要とする複数頂点情報のとりまとめを担当する。これらはRadeon HD 58x0全体で一個ずつでデュアル化はなされていない。

一方のNVIDIAのGeForce GTX 4x0は、アーキテクチャを一新させたことで、先代Geforce GTX 2x0や、競合Radeon HD 58x0とは異なる内部構造となっている。

GeForce GTX 4x0の全体ブロックダイアグラム

Raster Engineのクローズアップ。GeForce GTX 480ではこれが4つある

Radeon HD 58x0がデュアルRadeon HD 48x0構造としたのに対し、GeForce GTX 4x0では4つのミニGPUコアと言われるGPCのクワッドコア構成を取っていることはここまでに既に述べたとおり。そこで、この4GPC構成化に伴い、GeForce GTX 4x0のラスタライザは、このGPCにつき1基が実装されるデザインとなった。つまり、GeForce GTX 4x0では4基のラスタライザが有ることになる。

GeForce GTX 4x0のラスタライザは機能ブロック上では「Raster Engine」に内包される。

Raster Engineに含まれる「Edge Setup」ユニットは、ラスタライザの前段階処理とも言うべきことを行うユニットで、頂点データを取り出して、その頂点がレンダーターゲット範囲内にあるのか、その頂点が視線に向いていないか(向いていないならば裏面に相当)などの基本チェックを行っている。同じくRaster Engineに含まれる「Z-Cull」ユニットは、早期Zカリングを担当するところだ。

この辺りはブロックダイアグラム上の記載方法が異なるだけで、Radeon HD 58x0とGeForce GTX 4x0の処理系そのものに変わりはない。注目すべきはラスタライズ・エンジンが2基なのがRadeon HD 58x0、4基あるのがGeForce GTX 4x0だという点だ。

これは高解像度バッファへのレンダリング時の効率に違いが出てくると予測される。当然4基のGeForce GTX 4x0の方が高解像度レンダリングは強いはずだ。Radeon HD 58x0をフォローするわけではないが、ATIにしてみればこの弱点を突かれれば、「Radeon HD 58x0はパフォーマンスクラスだから」と切り返して来るであろうし、「高解像度レンダリングには実質4基(2基×2GPU)のラスタライザが搭載されるRadeon HD 5970がある」と言ってくることだろう。

では、DirectX 11注目の機能であるテッセレーションステージを司る根幹ユニットであるテッセレータ(Tessellator)についてはどうか。

ATIにとってこのハードウェア・テッセレータの実装は今回のRadeon HD 58x0で6世代目になる。最初期のものはDirectX 8.1世代SM1.4対応のRadeon 8000シリーズ時代の「TruForm」機能を実現させるために実装されたN-PATCH法実践専用のテッセレータで、これはRadeon 9000/X800/X1000シリーズでソフトウェア化されてしまったが、Xbox 360-GPU(Xenon)、Radeon HD 2000シリーズで復活して、以降Radeon HD 3000/4000シリーズにも搭載、今回のRadeon HD 58x0へと受け継がれることとなった。もちろん、これまでと同じものではなく、DirectX 11のレンダリングパイプラインを構成する「Hull Shader」(ハルシェーダ)から制御され「Domain Shader」(ドメインシェーダ)へデータを出力するようなアップデートが施されている。

Radeon HD 58x0のGraphics Engine部のクローズアップ。テッセレータは一基のみ

Radeon HD 58x0のテッセレータはRadeon HD 4000シリーズまでと同様にシェーダコア側ではなく、ラスタライザや階層型Zバッファユニットなどと同じく、Graphics Engine側への実装となっている。しかも、一連の「アーキテクチャ倍々化」に則ってはおらず、単一の実装に留まっている。

ATIとしては、負荷の高めなジオメトリ系処理はハルシェーダとドメインシェーダ……すなわちSP側で行われ、テッセレーションの処理系そのものはデータムーブが主であるため負荷としては軽微であり、またDirectX 11時代の第一世代のアプリケーションは、この機能をそれほど積極的に活用されないという見込みもあったため、このようなアーキテクチャとなったようだ。

テッセレーション・オフ

テッセレーション・オン。距離の遠近、局面の勾配の強弱に応じたテッセレーションを行った例となっている