後藤弘茂のWeekly海外ニュース

DirectX 11テッセレータを改良した「Radeon HD 6800」



●頂点データ爆発を引き起こすDirectX 11のテッセレーション

 AMDは、次世代GPU「Northern Islands(ノーザンアイランズ)」ファミリをリリースし始めた。第1弾のパフォーマンスGPU「Radeon HD 6800(Barts:バーツ)」系は、従来のエンスージアストGPU「Radeon HD 5870(Cypress)」を拡張しつつ、小型化したバージョンだ。Northern Islandsでは、今後、上位のエンスージアスト向けに、新アーキテクチャの「Cayman(ケイマン)」(11月後半出荷)と、Caymanをデュアルチップ構成にした「Antilles(アンティリーズ)」が登場する。

 AMDは、Radeon HD 6800では、NVIDIAに引き離されていたテッセレーション性能の強化を図ったと説明する。スイートスポットのトライアングル分割数では、従来のRadeon HD 5870より、テッセレーションの性能は2倍になったという。テッセレータのアウトプットバッファを増やすことで実現した。また、AMDはRadeon HD 6800でテッセレーション回りの実装を改良すると同時に、テッセレーション性能についての理解を呼びかけた。これを説明するためには、まず背景にあるテッセレーション実装の実態を説明する必要がある。

Northern Islandsのダイサイズ
PDF版はこちら

 DirectX 11世代でグラフィックスパイプラインに加わった新機能であるテッセレーションは、GPUのパイプライン全体に少なからず影響を与えている。DirectX 11パイプラインでは、テッセレーションステージ群として、ポリゴンを分割するテッセレータの前にプレテッセレーション処理を行なう「Hull Shader」、後ろにポストテッセレーションのための「Domain Shader」を配置した。ハードウェア的な実態としては、AMDとNVIDIAのどちらも、テッセレータをハードウェア実装し、前後のシェーダは、シェーダプロセッサ群でソフトウェア実行している。

DirectX 11 APIとGPU実装
PDF版はこちら
DirectX 11のテッセレーション

 問題は、このハードウェアテッセレータのアウトプットにある。トライアングルを分割するテッセレーションの結果、トライアングルのサイズが小さくなり、頂点数が増加するからだ。トライアングルサイズの縮小はラスタライザの効率の悪化を招き、さらにはピクセルパイプの処理負担も増やす。頂点数の増加はレジスタやバッファからメモリへの頂点データ溢れを引き起こす。古典的なGPUパイプラインは、ラスタライザ以外は、アウトプットデータが一定であることを前提として作られている。しかし、テッセレータは、多数の頂点データを生成してしまうため、古典的なグラフィックスハードウェアの考えが通用しない。

●テッセレーションに対する最適化の度合いの違い

 そのため、テッセレーション実装のハードウェア上のチャレンジは、小さくなるトライアングルと増える頂点を、どうやって効率良く扱うか、という点にある。この点で、NVIDIAとAMDの思想は異なっている。NVIDIAはテッセレーションの活用が、マイクロポリゴン(ピクセルより小さなポリゴン)にまで過度に進むと想定して、ボトルネックの解消によりリソースを割いた。それに対して、AMDは実際のゲームアプリケーションでのテッセレーションの必要性の一定レベルと想定して、そのスイートスポットに対して最適化した。

 具体的には、NVIDIAはGPU内をより小さく分割(ハイエンドGPUで4分割)することでラスタライズのパフォーマンスを上げた(GPU分割によるオーバラップ増加のロスとのトレードオフがある)。テッセレータハードウェアを各SM(Streaming Multiprocessor:AMDアーキテクチャのSIMDコアに近い演算コア)に分散して搭載することで、テッセレータとプロセッサ間のデータ移動を最小に抑えた。また、頂点データの溢れをオンチップでキャッシュするために、キャッシュ階層を設けた(実際にはGPUコンピューティング用に設けたキャッシュ階層を利用している)。L1キャッシュはSMに分散されているため、L1にヒットする限り、頂点データはSM内の移動だけで済む。

 それに対して、AMDは、GPUの分割度は2でNVIDIAより大人しく、テッセレータは各SIMDコアではなく、上位のセットアップエンジンに密着している。また、メモリ階層の基本は変えず、テッセレータに専用バッファを設けた。

 テッセレータハードウェア自体の実装コストはさほど重くはないが、こうした付帯する部分にどれだけリソースをつぎ込むかによって、コストは変わってくる。NVIDIAの方がはるかにコストをかけているが、キャッシュ階層のように、GPUコンピューティング向け機能をうまく利用した部分も多い。

GPUのマルチコア化
PDF版はこちら
DirectX 11 APIとGF100アーキテクチャ
PDF版はこちら
Radeon HD 6800の概要
PDF版はこちら
AMD GPUの比較
PDF版はこちら

●ラスタライザの効率が問題となるテッセレーション
Eric Demers氏(GPG Chief Technology Officer, AMD)

 AMDのEric Demers氏(GPG Chief Technology Officer, AMD)は、こうした実装の違いがあるものの、テッセレーションの性能指標についても、大きな誤解が生じていると指摘する。要約すると、通常のアプリケーションでのテッセレーションの性能ではAMD GPUも充分な性能を発揮しているのに、テッセレーションを極度に使うベンチマークでは不本意な結果が出ていると主張する。

 最大のポイントは、どの程度のテッセレーションが適切かという点にある。Demers氏は次のように説明する。

 「人々がどの程度テッセレーションについて理解しているのか、そこに疑問がある。例えば、ゲーム『エイリアンVSプレデター』では、実に美しくテッセレーションを使っている。このソフトでは、動的にLOD(Level of Detail)を効かせることで、トライアングルの分割数を最適にしている。

 しかし、一部のベンチマークはテッセレーションを限界まで進めて計測している。これはムダとしか思えない。なぜなら、実際のアプリケーションはそんなテッセレーションの使い方をしないからだ。では、テッセレーションでのトライアングル分割を最高に上げると何が起こるか。トライアングルが小さくなるため、ラスタライザの効率が顕著に落ちてしまう」。

 テッセレーションの適用の度合いが、アプリケーションとベンチマークではかけ離れた場合があるとDemers氏は指摘する。つまり、ベンチ自体に偏りがあるという主張だ。そして、そのために、非効率が発生していると言う。

 「我々だけでなく、NVIDIAもIntelも、みんなラスタライザはクアッドベースの実装を行なっている。そのため、ラスタライザが最も効率がいいのは、クロック当たり16ピクセルになるトライアングルを処理する時だ。(下のスライドの)左の図で示したように、テッセレーションを適用して1トライアングルが小さくなり、トライアングル当たり1ピクセルになると、ラスタライザの効率はたった6%と、極めて悪くなる。4ピクセルでさえ、効率がよくない。

 トライアングルが小さくなると、シェーディングの重複も多くなる。(下のスライドの)右の図はSIGGRAPHでの、オーバーシェイディングを示した論文のものだ。図の右の方に行くにつれてトライアングルが小さくなる。すると、赤い色で示されるように、シェーディングの重複が増える。トライアングルが小さくなると、トライアングルのエッジが多くのピクセルで重なり合うからだ。複数のトライアングルで重なったピクセルは、何度もシェーディングされる。同じことを何度も行なうことになり、無駄が増える。トライアングル当たり5ピクセルでも、各ピクセルは平均で5回もシェーディングされる」。

テッセレーションの効率

 ラスタライザは、トライアングル毎にシリアル処理するため、ここがパフォーマンスボトルネックとなる。1トライアングルをラスタライズすると16ピクセルが生成される場合、16ピクセルラスタライザのパフォーマンス効率は最も高くなる。ところが、トライアングル当たり1ピクセルのマイクロポリゴンばかりになると、同じ16ピクセルの生成に16クロックかかってしまう。効率は1/16に落ちてしまう。さらに、シェーディングでもオーバーヘッドが生じるため、マイクロポリゴン化はシェーディングのオーバーヘッドが大きいと言う。

 さらに補足すると、伝統的なGPUは16ピクセルの倍数を1グループとして処理している。より正確に言えば、4のべき乗を単位として構成されており、各ユニットの数もそれに沿っている。例えば、AMD GPUの各SIMDコアは、16個のVLIWプロセッサで構成されており、それぞれが別なピクセルを処理する。そのため、ピクセルパイプへと供給するラスタライザも1トライアングル当たり最大16ピクセルをラスタライズできるように構成されている。

●トライアングル当たりのピクセル数が効率のカギ

 Demers氏は、マイクロポリゴン的なテッセレーションによるオーバーヘッドは、ミッドレンジ以下のGPUではテッセレーションが使いものにならないという誤解を生む原因になっていると指摘する。

 「ラスタライザの効率が落ちて、ピクセルのオーバーシェイディングが増えても、ハイエンドGPUはリソースが多いため、ある程度の性能を出すことができる。しかし、下位のGPUでは性能が出せない。そのため、ベンチマークのようなテッセレーションを行なうと、『ハイエンドGPUしかテッセレーションを行なうべきではない』という結論になってしまう。

 しかし、私はテッセレーションは、全ての階層のGPUで有効だと考えている。テッセレーションのアイデア自体が、もともと全ての階層のGPUで、最適なジオメトリを実現することにある。GPUによって、ゲームのジオメトリ(パイプラインのプロセッシング)を変える必要はない。

 GPUハードウェアは、トライアングル当たり10~30ピクセルで効率がよくなるように設計されている。アプリケーションもそれに合わせており、それより小さなトライアングルにするのは、ベンチマークのためとしか思えない。言ってみれば、自説を勝手に主張している(soapbox statement)に過ぎない。

 NVIDIAは開発者に対して、テッセレーションの度合いを最大に上げるようにとプッシュしている。なぜなら、彼らの方がテッセレーションの性能がいいからだ。しかし、それはベンチマークのために過ぎず、間違えている。もし、(3Dグラフィックスが)マイクロポリゴンへと進むなら、私は今とは別な設計を取るだろう。しかし、現状はそうではない」。

 そもそも、テッセレーションのアイデアは、ジオメトリデータを圧縮し、GPU側で最適なポリゴン数へと調節することにあった。テッセレータによって、各GPUリソースに合わせてアダプティブにポリゴン数を増やすことで、どのGPUでも同じジオメトリデータを扱いながら、内部的には、GPUリソースに合わせた頂点数へと変換する。Demers氏が指摘しているのは、極端なテッセレーションでは、こうしたテッセレーションのそもそもの利点に反する結果となってしまうという点だ。

●スイートスポットに合わせたテッセレータの拡張

 では、Radeon HD 6800でのテッセレーションはどのように強化されたのだろう。AMDはハードウェア的にはオンチップのバッファを増やし、ビデオメモリ上と推定されるオフチップバッファも増やし、ソフトウェア的にはHullシェーダとDomainシェーダを最適化したという。オンチップバッファは、テッセレータハードウェアに付属するアウトプットバッファで、メモリ階層とバスアーキテクチャをテッセレーションに合わせて拡張したわけではない。

メモリ階層
PDF版はこちら
Radeon HD 6800の内部バス
PDF版はこちら

 下のスライドは、相対的なテッセレーションのパフォーマンスを示している。縦軸がトライアングル数で、横軸がトライアングルの分割数であるテッセレーションファクタだ。テッセレーションのパフォーマンスであるテッセレーションレートは、Radeon HD 5870(Cypress)を1xとした相対性能となっている。絶対性能は、トライアングルを小さく分割すればするほど、つまり、右に行けば行くほどレートは落ちるはずだ。

テッセレーションの性能

 このチャートで目立つのは、分割数が比較的少ない9ファクタまでのパフォーマンスが相対的に上がっている点。ファクタ数が増えるにつれて、相対的に性能差が縮まる傾向にある。AMDのDemers氏は、「今日の典型的なアプリケーションでは4から8ファクタ程度が多い。そのスイートスポットでの性能は最大2倍に上がっている」と説明する。つまり、オーバーオールにテッセレーションの性能が2倍になったわけではなく、アプリケーションのよく使うポイントに合わせた性能アップだ。

 この図の相対性能カーブが示唆するのは、Radeon HD 6800で改良されたバッファがそれほど大きな容量ではないことだ。容量が大きければ、ファクタ数が増えてもパフォーマンスアップが維持される傾向が出ると推定されるからだ。

●6つのディスプレイパイプラインを備えるEyefinity

 テッセレータハードウェアと、それを支える周辺機能は、DirectX 11世代GPUのハードウェア設計の最大の焦点だ。AMDは、Radeon HD 5870からRadeon HD 6800への移行でも、この部分では、根本的な部分での拡張は行なわなかった。上位のCayman(ケイマン)は、Cypress→Bartsとはアーキテクチャが異なるため、Caymanでどれだけ変わるかがカギとなる。

 この他のRadeon HD 6800の拡張点は、メディアデコードエンジンUVD(Universal Video Decoder)が第3世代となり、複数のHDビデオのデコードが可能になった。また、Evergreenの売り物だったマルチディスプレイ技術「Eyefinity」は引き継がれている。下は、CypressのEyefinityパイプラインの図だ。Radeon HD 6800も、基本的には、これを引き継いでいる(Radeon HD 6800では3つ目のタイミングソースを内蔵したと説明している)。

Radeon HD 6800におけるEyefinityのアーキテクチャ
PDF版はこちら

 「6つの独立した(ディスプレイ)パイプラインがあり、それぞれ個別に独立して制御することができる。ただし、PLLは限られている。DVIとVGA、HDMIはそれぞれが個別の独立したタイミングソースを必要とする。そのため、それぞれに個別にPLLを用意しなければならない。しかし、DisplayPortはタイミングソースを共有するので、実装しやすい。もし、6つのVGAを備えようとしたら、非常にコストは高くつくだろう。しかし、6つのDisplayPortなら、非常に安くつく。我々がDisplayPortを推している理由はそこにある」(Demers氏)。

 微細化が進むと、デジタル回路はどんどん小さくなる。しかし、アナログ回路やタイミングソースといった部分は、同じ比率では縮小しないので、相対的にコストが高くなってしまう。そのため、DisplayPortへと全面移行しない限り、必然的にディスプレイ出力の制約が残る。

強化されたUVD3
Eyefinityによる出力