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

マルチスレッディングを前提に設計されたXbox 360 GPU




●24,576本のベクタレジスタを備えたGPU

Xbox 360 GPU & eDRAM

 Xbox 360 GPUのダイ(半導体本体)写真ですぐに気がつくのは、ダイ上に点在する膨大なSRAMエリア。キャッシュと推定されるまとまったエリア以外にも、各所にくまなくSRAMが点在する。じつはこれ、ほとんどがレジスタだ。

 Xbox 360 GPUは、合計で24,576本のベクタレジスタを持つ。なぜ、2万本を越えるような、途方もない数のレジスタを備えるかというと、それはマルチスレッディングのためだ。ハードウェアマルチスレッドのサポートのためには、ステート切り替え用の物理レジスタが膨大に必要になる。そのため、Xbox 360 GPUでは、膨大なレジスタを備えているという。

 その代償として、Xbox 360 GPUでは、キャッシュ量を切りつめている。最新GPUの中には、かなり大型のキャッシュを備えるGPUもあるが、Xbox 360 GPUの場合は頂点キャッシュ(Vertex Cache:VC)が8KB、テクスチャキャッシュ(Texture Cache:TC)が32KBと、ミニマムの量しか搭載していないという。Microsoftによると、キャッシュにほとんど頼らず、メモリアクセスではスレッディングしてしまうというのが、基本的なXbox 360 GPUの思想だという。

 Xbox 360 GPUがこうした設計を取った理由の1つは、GPUのワークロードの特性のためだと推定される。GPUの場合、キャッシュヒット率がCPUと比べて低く、その一方で、並列化可能なワークロードが無数にある。そのため、キャッシュを増やすよりも、その分のリソースをマルチスレッディングに回した方が効率的となる。長レイテンシのメモリアクセスに入っても、スレッディングしてしまえばレイテンシを隠蔽できる。データのフェッチを待っている間、別なスレッドを実行すればいいだけだからだ。これはGPU全体のトレンドで、Xbox 360 GPUを開発したATI Technologiesだけでなく、NVIDIAもGeForce 6800(NV40)以降はマルチスレッディングへと向かっている。

 これは、SRAMをどこに使うかという視点から考えることもできる。キャッシュヒットが高く、マルチスレッド化できるワークロードが少ないCPUではSRAMをキャッシュに使う。それに対して、逆のソフトウェア環境にあるGPUは、SRAMをレジスタに使う。24,576本の128bitベクタレジスタは、換算すると384KBとなる。つまり、400KB弱分のSRAMを、Xbox 360ではキャッシュにする代わりにレジスタへと振り向けたわけだ。同じSRAMでも、ポート数の少ないキャッシュよりレジスタの方がダイエリア(半導体チップ上の面積)を取る。より多くのキャッシュを載せられるだけの面積を使って、レジスタを配置したことになる。

 Xbox 360 GPUの、Unified-Shaderは、合計48個の演算ユニット(ALU)を備えている。それぞれのALUは、内部に128bitの4wayベクタユニットが1個と、32bitの1wayスカラユニット1個を備えている。両ユニットに対しては同時に命令発行と処理が可能だ。各ALUにつき、512本ずつのレジスタが存在する計算になるが、レジスタ群はシェアされている。

●94スレッドをオンザフライでハードウェア制御

 Microsoftが明らかにした情報によると、Xbox 360 GPUは最大94スレッドをオンザフライで管理できる、ハードウェアマルチスレッディング能力を持つという。これは、E3時にATIが明かした数字(64スレッド)と異なるが、こちらが正しい数字だと思われる。スレッディングの内わけは、頂点スレッドが31、ピクセルスレッドが63。どちらも、2のべき乗の数字マイナス1となっている。

 さらに、頂点スレッドは64頂点、ピクセルスレッドは64ピクセルを1つのスレッド単位として扱い、ステートの切り替えを行なう。つまり、1スレッドは64個の頂点に対する処理、または、64個のピクセルに対する処理を上限に構成されるわけだ。ATIは、この粒度が最も適切だと判断したということになる。ちなみに、GPUベンダーによって、このあたりの表現は異なっており、各ピクセルを1スレッドと言うGPU関係者もいる。

 GPUの場合は、プログラマ側がマルチスレッドプログラミングをする必要がない。親スレッドから自動的にインスタンスが生成される。例えば、ラスタライザでプリミティブは、同じシェーダで処理されるピクセルに分解される。Xbox 360 GPUでは、生成されるインスタンスをバインドして1スレッドとして扱うようだ。

 また、Xbox 360 GPUは、スレッドのハードウェア切り替えの他に、その上位でGPU自体のコンテクストの切り替えもハードウェアでサポートする。最大8コンテクストまでをハードウェアで保持できる。そのため、シェーダを切り替える毎に、従来のようにGPUパイプをフラッシュする必要がない。GPUパイプは長いため、いったんフラッシュすると非常にペナルティが大きい。しかし、Xbox 360 GPUなら8面のコンテクストを保持しているため、低コストにステートの切り替えができる。

Xbox 360 GPU(一部推定)
PDF版はこちら

●テッセレータはハードウェア実装

 GPUパイプを上から見て行くと、まずメインメモリ上のコマンドバッファから「コマンドプロセッサ(Command Processor:CP)」がコマンドを読み出す。その下の「頂点グルーパー(Vertex Grouper)」には、平面分割を行なう「ハードウェアテッセレータ(Hardware Tessellator)」が付属している。「Vertex Grouper & Tessellator (VGT)」という名前になっている。

 Microsoftは、Xbox 360 GPUのTessellatorは、コンシューマ機では初めての実用的な性能のTessellatorだと言う。以前、このコーナーでShaderアレイを使ってテッセレートを行なうという予測を書いたが、そうではなかった。テッセレートされた頂点は1頂点/サイクルの出力だが、テッセレーテッド頂点はキャッシュに載りやすいため、スループットの低さは隠蔽されるだろうという。

 シェーダユニットはUnified-Shader型で、従来のようなVertex ShaderとPixel Shaderの区別はない。Xbox 360 GPUではシーケンサ(Sequencer)がコントロールフロー命令を実行し、各Shaderアレイの制御を行なう。Shaderアレイ群とSequencerの組み合わせがShaderというイメージだ。そのためか、Microsoftが今回示した図では、ShaderアレイはALUと表現されていた。

 ShaderのALU群は3バンクに分割されている。マルチスレッディングの制御は、このバンク単位で行なわれる。Shaderフィーチャは、DirectXのProgramable Shader 3.0プラスアルファとなる。つまり、内部演算精度は32bitとなり、さらに機能が拡張されている。

 テクスチャパイプは、テクスチャサンプラが16ユニット。48基というShader ALUの数と比べると少ないように見えるが、これはおそらくマルチスレッディング主体にGPUを設計したためと推定される。ハードウェアスレッディングをしない(あるいはスレッディングの幅が狭い)場合は、できるだけ早くテクスチャをフェッチする必要がある。そのため、テクスチャパイプを太くして、競合によるディレイをできるだけ抑えなければならない。

 しかし、キャッシュミス時には必ずスレッディングしてしまうなら、テクスチャデータがロードされるまで、ALU側を待たせることができる。レイテンシが長くなってもいいため、テクスチャパイプをスループットを保てるぎりぎりの数に抑えることができる。

●Shaderの処理結果を自由に出力

 Shader ALUアレイの下には「シェーダエクスポート(Shader Export:SX)」と呼ばれる、独特のユニットがある。Shader Exportは、名前の通りShaderからの出力を管理するユニットで、Vertex ShaderとPixel Shaderの区別がないUnified-Shaderならではの処理を行なう。

 頂点データはShaderで頂点シェーディングされたあと、このShader Exportから「プリミティブアセンブラ(Primitive Assember:PA)」へと出力される。そこから「スキャンコンバータ(Scan Converter:SC)」でラスタライズされてピクセルに分解。その後で、再びShaderアレイに戻され、ピクセルシェーディングが行なわれる。

 Shader Exportの下には「Backend Central (BC)」と呼ばれるブロックがあり、これがeDRAMとのデータ転送やメインメモリへ処理結果を出力する処理などを司っている。Shaderから出力されたピクセルデータは、通常はGPU内のピクセル処理ブロックに送られる。しかし、Xbox 360 GPUの場合は、Backend Centralを通じてeDRAMに送られる。そこで、Alpha、Z、ステンシルの処理が行なわれ、最後に処理結果がBackend Centralへと戻される。

 eDRAMとGPUの2つのダイ(半導体本体)は、パッケージの基板上でバス幅の広い専用インターフェイス(HSIO)で結ばれている。両チップ間の帯域は32GB/sec。これは、16GB/secでeDRAMにレンダリングし、16GB/secでGPUメインダイ側に書き戻す場合にピタリと合う帯域だ。GPUコアからメモリハブ(MH)への帯域は16GB/secなので、32GB/secは必須だと見られる。ちなみに、eDRAMダイのZ/Alphaプロセッサ群とeDRAMは256GB/secの広帯域で結ばれている。GPU全体の処理のうち、メモリ帯域を食う処理だけをeDRAMを使ってやってしまうという思想だ。

 しかし、eDRAMの容量は10MBなので、HDTV解像度の720p(1,280×720ドット)でMSAAにすると足りなくなってしまう。そのため、分割レンダリングを行なう。分割レンダリング自体は、ハードウェアとライブラリでサポートし、プログラム側からは見えないようにするという。分割レンダリングでは、分割ラインにまたがるジオメトリは2重に描画する必要があるため、頂点処理は約1.2~1.3倍のオーバーヘッドになる(ピクセル処理側はオーバーヘッドがない)という。

 Xbox 360 GPUでは、eDRAMで固定ピクセル処理を行なうため、PC向けGPUのようにビデオメモリ帯域を節約する必要がない。そのため、パイプラインの中でカラーとZデータの圧縮を行なっていない。カラー&Zの圧縮/伸張回路が省かれたことになる。

 Xbox 360 GPUには次世代Shaderを先取りした機能が加えられている。その1つは、次世代のDirectX 10で加わるパイプライン中のシェーダからメモリへの直接のデータ書き出し「シェーダメモリエクスポート(Shader Memory Export)」だ。Xbox 360 GPUでは、Shaderで演算した結果を、メモリ上の任意のアドレスに直接出力ができる。これは、GPUで汎用プロセッシングを行なうためには欠かせない機能だと言われている。

 Xbox 360 GPUのピクセル出力は、カラー&Zで8ピクセル/サイクル。Zオンリーなら半分なので16ピクセル/サイクルとなる。MSAAのフィルタリング自体はeDRAM側ではなく、メインダイ側のBackend Centralブロックで行なう。

●Xbox 360 GPUのダイサイズは200平方mm前後?

 Microsoftは、Xbox 360 GPUのダイサイズは公開していない。トランジスタ数は、GPUメインダイが232M(2億3,200万)、eDRAMが100M(1億)。メインダイはRADEON X800(R420/423)系の160M(1億6,000万)トランジスタの約50%増だが、製造プロセスが90nmになるため、ダイサイズ(半導体本体の面積)は縮小すると見られる。計算上では200平方mm前後となる。Webでリークされたパッケージ写真でも、200平方mm弱程度に見えた。

 PC向けハイエンドGPUのダイが300平方mmを越えているのと比べると小振りで、PLAYSTATION 3のGPUである「RSX(Reality Synthesizer)」と比べても小さいと推定される。しかし、Xbox 360 GPUでは、付属するeDRAMがおそらく70平方mm程度で、2ダイを載せたマルチチップモジュールとなるため、GPU全体でのコストは決して低くはない。初代のXboxのXGPUのダイは約150平方mm弱で、ずっと小さかった。

 この先、プロセス技術が進むにつれて両ダイはシュリンクする。Microsoftはコストダウンのためには、おそらくGPUダイとeDRAMダイを統合する必要が出てくるだろう。その場合、GPU本体の製造プロセス技術をDRAM混載プロセスに変えるというチャレンジがある。

 新たに明らかになった情報を総合すると、Xbox 360 GPUの姿がますます明瞭になる。Xbox 360 GPUは、マルチスレッディング主体に設計された新しい方向性のGPUで、Unified-Shader型アーキテクチャもその設計思想にマッチしている。また、eDRAMを使うことで、メモリ帯域への圧迫を減らし、カラー&Z圧縮機能などを省くことに成功している。Xbox 360 GPUは、Shader ALU数が48と多い割にトランジスタ数が少ないが、その理由もこのあたりに隠されていそうだ。

Xbox 360 System(一部推定)
PDF版はこちら

□関連記事
【8月22日】【海外】ゲーム向けに独自拡張されたXbox 360のCPU
http://pc.watch.impress.co.jp/docs/2005/0822/kaigai204.htm
【5月26日】【海外】Xbox 360から見えるUnified-Shader時代のGPUの姿
http://pc.watch.impress.co.jp/docs/2005/0526/kaigai183.htm
【5月20日】【海外】予想を超えるモンスターだったXbox 360のGPU
http://pc.watch.impress.co.jp/docs/2005/0520/kaigai181.htm
【5月16日】【海外】Xbox 360のGPUはUnified-Shaderアレイを実装
http://pc.watch.impress.co.jp/docs/2005/0516/kaigai179.htm

バックナンバー

(2005年9月14日)

[Reported by 後藤 弘茂(Hiroshige Goto)]


【PC Watchホームページ】


PC Watch編集部 pc-watch-info@impress.co.jp ご質問に対して、個別にご回答はいたしません

Copyright (c) 2005 Impress Corporation, an Impress Group company. All rights reserved.