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

ワンチップで2.7TFLOPSをたたき出すAMDのCypressの秘密



●プロセッサコアの基本的な構造は前世代を踏襲

 デュアルコア的な手法でプロセッサコア群を2倍にした結果、Cypress(コードネーム、糸杉の意)は前世代のRV770と比べて2倍のピーク性能を達成した。単精度浮動小数点演算では2.72TFLOPSで、倍精度でも544GFLOPSとなる。AMDがストリームコアまたはストリームプロセッサ(Stream Core/Stream Processor)と呼ぶ演算ユニットの数は合計で1,600ユニット。

 プロセッサコア自体の構成はRadeon HD 2000(R600)世代からそれほど変わっていない。ベースの構造は踏襲して、発展させて来ている。演算ユニット(ストリームコア)は、VLIW(Very Long Instruction Word)型のプロセッサにまとめられている。R600世代では、このプロセッサは「5-way Superscaler Shader Processor」と呼ばれていた。現在は「スレッドプロセッサ(Thread Processor)」と呼ばれている。AMDは、各要素の名称を頻繁に変更する傾向がある。

 スレッドプロセッサは16個束ねられて、「SIMDコア(SIMD Core)」または「SIMDエンジン(SIMD Engine)」と呼ばれるプロセッサクラスタを形成している。SIMDコアにはテクスチャユニットやL1キャッシュなどが付属しており、プロセッサとして単体で機能できる最小単位となっている。


Cypressの概要
最新GPUの比較

 VLIW型のスレッドプロセッサの中の5つの演算ユニット(ストリームコア)のうち、4ユニットは同じ構成で、32-bit単精度浮動小数点の積和算(FP MAD)と整数演算用のシンプルな演算ユニットだ。5番目のユニットは、浮動小数点FMADと整数演算の他に、複雑なオペレーション(sin, cos, log, expなど)や浮動小数点と整数のデータ変換なども実行する。5番目のユニットは、GPU的な用語で「スペシャルファンクションユニット」とも呼ばれている。

 また、スレッドプロセッサでは、単精度の4ユニットで、倍精度の積和算も1サイクルスループットで実行できる。2個のストリームコアが1個の倍精度の乗算(FMUL)を、別な2個のストリームコアが1個の倍精度の加算(FADD)を実行し、コンバインして倍精度FP MADを実現する。そのため、倍精度演算は単精度演算の1/5のパフォーマンスとなる。

 スレッドプロセッサに対する命令語は、6つの命令スロットを備えたVLIW(Very Long Instruction Word)命令となっている。命令をコンパイルする際に、並列に実行できる複数の命令を抽出して、1個のVLIW語の中に納める。プロセッサ側では、VLIW命令の中から個々の命令を取りだして、複数の演算ユニットで並列に実行する。コンパイル時に命令スケジューリングを行なうため、プロセッサをシンプルに保つことができる。

VLIWの仕組み

●汎用コンピューティング向けの機能の拡張も

 Cypressでは、演算コア自体の拡張も行なわれている。1つは、サイクル当たりの命令実行性能「Instruction-per-Clock(IPC)」を向上させること。新命令の実装によって、複数の命令で行っていた処理を1命令で実行できるようにした。これは、CPUでもお馴染みの手法だが、GPUであるCypressでは内積(dot products)命令などが強化された他、Sum of Absolute Differences(SAD)命令などが実装された。SAD命令は、動画エンコード系などで動き補償によく使われるため、現在では非常に一般的な命令だ。乗算と加算を融合させた積和算については、「Fused Multiply-Add」の業界標準として昨年(2008年)策定されたIEEE 754-2008に準拠する。この標準によってまるめ誤差のばらつきがなくなった。

 汎用コンピューティング「Stream Computing」の機能としては、OpenCL 1.0とMicrosoftのDirectCompute 11の機能の全てをハードウェアでサポートする。それどころか、来年(2010年)登場するOpenCLの次のバージョンも、ハードウェアでフルサポートできるという。

 SIMDコアからの出力は、Cypressではいったん「メモリエクスポートバッファ(Memory Export Buffer)」に貯められる。ここでデータをスキャッタするためで、最大で64個の32-bit値のデータを保持できる。GPUのようなベクタプロセッサでは、メモリに分散しているデータを集め(ギャザ)してベクタレジスタに格納、処理が終わったら、再び分散(スキャッタ)して書き戻す必要がある。このスキャッタ/ギャザを効率的に行い、メモリと内部バスの帯域をセーブするための仕組みだ。

演算コアの仕組み
IEEE 754-2008に準拠したコア

 この他、さまざまな汎用コンピューティング向け拡張が行なわれている。RV770では、各SIMDコアの中に、スレッド間でデータを共有するためのメモリ「ローカルデータシェア(Local Data Shares)」が16KB配置されていた。Cypressでは、これが32KBへと倍増されている。また、全SIMDコアの間で共有できる「グローバルデータシェア(Global Data Share)」も16KBから64KBから4倍増された。ただし、共有するSIMDも2倍の数になっているため、SIMD当たりのデータ容量は2倍になっただけだ。

 このデータシェアは、いずれもプログラムから明示的にアクセスするスクラッチパッドタイプのメモリだ。

●64エレメントがベクタ長となるAMDアーキテクチャ

 スレッドプロセッサは16個が1グループとなり、プロセッサクラスタであるSIMDコアとなる。SIMDコアは、名前の通り、内部のスレッドプロセッサをSIMD型の制御で命令実行を行わせる。つまり、16個のスレッドプロセッサに、同じVLIW命令を発行する。実際には、16個のスレッドプロセッサが4サイクル同じVLIW命令を実行する。そのため、1つの命令で、64のデータエレメントに対しての処理がSIMD実行される。

 この64エレメントが、AMD GPUの論理ベクタ長となっている。AMD内部のプログラミング用語では、この64エレメントを「ウェイブフロント(Wavefront)」と呼んでいる。NVIDIAアーキテクチャの「ワープ(Warp)」に当たる。AMD GPUのWavefrontは、現在のCypressも含めて、ここ数世代64だ。

Radeon HD 4870のSIMDコア
64エレメントはウェイブフロントと呼ぶ

 64エレメントのWavefrontは、AMD GPUの分岐粒度(Branch granularity)でもある。Wavefrontは、SIMD実行されるため、分岐命令によって64エレメントの処理がそれぞれ異なる方向へ分岐する場合、両パスを実行する必要がある。エレメント毎に実行を行わないようにマスクすることでベクタ分岐を行うが、実行サイクルが必要となるため、無駄が生じる。これが、ベクタプロセッサの弱点であるコントロールフローのオーバーヘッドだ。

 そのため、分岐粒度が小さいほど、分岐の多いプログラムの効率がよくなる。NVIDIAの分岐粒度は現在32エレメント、IntelのLarrabeeは16だ。AMDの64はやや大きい。これについて、AMDのEric Demmers氏(CTO and AMD Fellow, Graphics Products Group, AMD)は、次のように説明する。

 「ベクタ長は64に保っている。粒度を変えないことで一貫性を持たせている。64ベクタにしているのは、グラフィックスがこの粒度を好むからだ」。

 64エレメントは、グラフィックスなら例えばピクセルで64個分。つまり、8ピクセルx8ピクセルのブロックとなる。正方形のピクセルブロックは、伝統的にGPUが効率的にグラフィックスを処理できる単位として使われてきた。AMDは、ここに最適化している。

●グラフィクスでは最適なベクタ長64

 AMDのベクタ長64はグラフィックスには最適だ。しかし、レイトレーシングなどの場合は、ベクタの粒度はできれば16程度が望ましいという。AMDのベクタ長は、それをかなりはみ出している。

 AMDのMike Houston氏(Senior System Architect, AMD)は「クレイなどのベクタスーパーコンピュータはもっとはるかにベクタ長が長い。それと比べれば、ずっと効率的だ」と説明する。

 AMD GPUの効率のよさは、こうした部分にある。ベクタ長が長く、また、スレッドプロセッサをVLIW型とすることで、命令レベルの並列性も抽出する。NVIDIAはベクタ長が相対的に短く、また現行アーキテクチャでは、一切命令レベルの並列性は抽出しない。

 さらに、スレッドの制御もNVIDIAと比べると、AMDはずっと大人しい。例えば、AMD GPUは、1つのWavefrontの命令群を、ストールするまで連続して実行し、ストールしたら切り替える。それに対して、NVIDIA GPUは、多数のWarpの命令群をホールドして、次々に実行ユニットに流し込む。

 こうした制御の違いから、AMDとNVIDIAでは、それぞれのGPUの効率が異なる。一般論で言えば、NVIDIAアーキテクチャの方がどんなプログラムでも効率よく実行しやすいが、制御機構が相対的に大きくなる。それに対してAMDアーキテクチャではグラフィックスが最も効率がよく、それ以外のプログラムではばらつきが出る可能性がある。しかし、制御系が小さくなる分だけ、演算コアの密度が高くなる。

 そのため、AMD GPUは、トランジスタ当たりと、消費電力当たりの、生パフォーマンスの効率が極めて良い。2.72TFLOPSのパフォーマンスを達成できた秘密はこうした効率性にある。

トランジスタあたりと消費電力のパフォーマンス効率がいい

●RV770世代で改革されたGPUの内部バス

 AMDはCypressでテクスチャユニットも倍増させた。テクスチャユニットは、SIMDコアに付属するため、SIMDコアが2倍になればテクスチャユニットも2倍になるのは当然だ。その結果、テクスチャは68 billion bilinear filtered texels/secという途方もないスペックに上がっている。ただし、テクスチャフィルタが有効に働くようにするためには、充分な量のテクスチャをフェッチできなければならない。

テクスチャユニットの改良でベンチマークも高速化している

 AMDは、テクスチャフェッチのための内部バスアーキテクチャについて、RV770で大きな変更を行なった。R600世代で採用したリングバスを取りやめ、片方向のクロスバスイッチを2つ組み合わせるアーキテクチャへと切り替えたのだ。これは、R600アーキテクチャから効率を上げるために、内部バストラヒックを解析したところ、90%が上り一方方向のテクスチャフェッチだと判明したからだという。そのため、上りにテクスチャ専用の太いクロスバスイッチを採用、下りのバスから分離した。

 RV770では、下の図のように、まず、メモリコントローラに付属してリードオンリのL2テクスチャキャッシュが各64KBずつある。キャッシュといっても、読み出したテクスチャを保持するバッファで、プロセッサ側からデータを書き込むことはできない。

RV770の内部バス

 L2キャッシュは1,024-bit幅と推測されるバスでクロスバスイッチと接続されている。このクロスバスイッチは上り方向だけのスイッチだ。このスイッチでテクスチャデータは各SIMDに付属した小容量(8KBとみられる)のL1テクスチャキャッシュに送られる。L1からはテクスチャユニットがフェッチして、フィルタリングを行なう。L1もリードオンリーだ。

 テクスチャはSIMDコアの中で使用され、演算結果は各SIMDからシェーダエクスポートへとはき出される。SIMDからの出力は、例えば頂点データがラスタライザを経てピクセルデータとして再びSIMDコアに送られるなど、再帰的にデータが回される場合もある。そうでない場合は、メモリへと書き込まれる。

 この時、シェーダエクスポートからは、各メモリコントローラに付属しているレンダーバックエンド(ROP)へと送られる。グラフィックスの場合は、ここでROP処理が行われて、最終的にメモリへと書き込まれる。一方、メモリコントローラは双方向のハブで、インターフェイスやその他のユニットと接続されている。

 このように、RV770では、グラフィックスのデータの流れに沿って内部バスが再編成され、その結果非常に効率的になった。

●Cypressの内部バスはRV770の発展系か

 では、Cypressの内部バスはどうなっているのだろう。メモリコントローラと内部バスの設計を担当するアーキテクトのFritz Kruger氏(Architect, AMD)は次のように語る。

 「テクスチャキャッシュはL2/L1ともリードオンリーで、クロスバスイッチで接続されている。システムアーキテクチャの観点からは、今回のCypressのはRV770とよく似ている。非常に小さな拡張しか行なっていない」。

 だが、前述のように、Kruger氏はバスを簡単にするためにデュアルコア化を図ったとも説明している。また、テクスチャは、2つのコアでシェアされるとも説明している。こうした説明から予想されるCypressの内部バスを描いてみよう。

 まず、Cypressの内部を、RV770と同じ構造のまま拡張すると下の図のようになる。この場合、20のSIMDからの入力と、8つのROPへの出力が入り乱れ、シェーダエクスポート部分が混み合った状態になっている。

Cypressの内部をRV770と同じ構造のまま拡張した場合

 そこで、2グループに分離され制御されていると推測されるSIMDからの出力が、それぞれ別なスイッチで扱われると仮定してみよう。すると、下の図のようになる。各スイッチは、それぞれ10のSIMDからの入力と、4のROPへの出力をスイッチする。2系統のROPはそれぞれがメモリコントローラに接続されている。Cypressの内部バスがこうした構造となっているかどうかは、まだわからない。しかし、クロスバの複雑化を避けるには、こうした方式を採ることが有効であることは確かだろう。

別なスイッチで扱われると仮定した場合

●マルチコンテクストを保持するAMDアーキテクチャ

 AMD GPUは、コンテクストのスイッチを高速化する機構をハードウェアで備えている。

 「複数のコンテクストをGPU内部で保持している。コンテクストをスイッチすると、ナノ秒で全く違うコンテクストに切り替わる。完全にパイプライン化されており、ストールは全くない。合計で8コンテクストの全てのステイトを保持している。全てのレジスタがデュプリケイトされる。そのために、膨大な(SRAM)エリアを確保している」。

 このように、Eric Demmers氏(CTO and AMD Fellow, Graphics Products Group, AMD)は説明する。GPUのコンテクストスイッチングについては、Microsoftが数年前にOS側で制御するプランを出した。これはADDMまたはWDDM2.1と呼ばれていたドライバモデルだった。しかし、AMDは、GPU内部でハードウェアでシームレスに行ってしまう方法を主張し、現在はMicrosoftのプランは消えているという。

 AMDアーキテクチャでは、全く異なるタイプのステイトもGPU内部に保持できるという。

 「コンピュートとグラフィックスをGPUの中に同時に持つことも可能だ。我々のGPUでは、シェーダもコンピュートも同じことだ」(Demmers氏)。

 ただし、複数のコンテクストを同時に走らせる、CPUのマルチスレッディングのようなことはサポートしていない。一度に走らせることができるのは1つのコンテクストだけで、ステイトを保持することで切り替えを速くしている。