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

NVIDIAが次世代GPUアーキテクチャ「Fermi」を発表



●アーキテクチャを根本から見直した新世代GPU

 NVIDIAは次世代GPUアーキテクチャ「Fermi(フェルミ)」の概要を明らかにした。GPUの内部アーキテクチャを一新、GPUコンピューティングでの効率とプログラマブル性を大きく高めた。また、演算プロセッサである「CUDA core(従来のStreaming Processorに相当)」の数を、GT200(GeForce GTX 280)系の240個から512個へと倍増させた。倍化という点では、AMD(ATI)のRV770(Radeon HD 4800)系からCypress(Radeon HD 5870)系への変化と同じだが、その内容はかなり異なっている。

 ATIは演算プロセッサ数を2倍にして生パフォーマンスを2倍にしたが、プロセッサコアやメモリ階層、データフローなどの“基本構造”にはそれほど手をつけなかった。それに対してNVIDIAは、プロセッサクラスタの構造を一新、メモリ階層とデータフローを大きく変更した。両社のアプローチはかなり異なり、アーキテクチャ上の飛躍が大きいのがFermiだ。

 NVIDIAはGPUアーキテクチャに、世代毎に物理学者の名前をつけている。初代のG80とその発展系であるGT200はTesla(テスラ)系に属し、第2世代がFermiだ。つまり、NVIDIAは今回、アーキテクチャのメジャーチェンジを行なう。

Fermiの概要

 Fermiアーキテクチャの、GPUコンピューティングにおいての大きな技術ポイントは以下の通りだ。

◎プロセッサコアを束ねたプロセッサクラスタ「Streaming Multiprocessor(SM)」の改革
・プロセッサコア「CUDA Core」の数をSM当たり8個から32個に
・倍精度浮動小数点演算の性能を単精度の1/2に拡張(従来は1/8)
・命令ユニット(WARPスケジューラ/ディスパッチャ)を2つに
・SM内部のライタブルメモリを16KBから64KBに拡張しコンフィギュラブルに

◎メモリサブシステムとメモリ階層の拡張
・L1/L2キャッシュ階層をリードオンリーからライタブルに
・オンチップも含めて全てのメモリでECCをサポート
・Atomic(不可分)メモリオペレーションのパフォーマンスを向上

◎「Parallel Thread Execution(PTX)」命令セットアーキテクチャの拡張
・全てのメモリアドレス空間を統合(C++のフルサポートのため)
・IEEE 754-2008スタンダードに単精度/倍精度とも対応
・プレディケーションを全ての命令に拡張
・OpenCLとDirectComputeへの最適化
・64-bitメモリアドレッシング(実装は40-bitロジカル/フィジカル)

◎「GigaThread」エンジンでのスレッド制御を拡張
・アプリケーションコンテクストスイッチングを10倍高速に
・複数のカーネルプログラムを同時に実行可能
・デュアルオーバーラップメモリトランスファエンジン

●汎用コンピューティングのために多岐に渡る拡張

 Fermiでのアーキテクチャ拡張は広汎に渡っており、ほとんどの部分でアーキテクチャが変わっている。現在明らかになっているのはGPUコンピューティング部分であり、グラフィックス機能部分の拡張は、上のリストに入っていない。例えば、ラスタライザやテッセレータ、テクスチャユニット、ROPといったグラフィックス専用ユニットの拡張は、ここでは挙げていない。それは、後日、別立てでレポートする。

FermiとG80/GT200の比較

 GPUコンピューティングでのFermiアーキテクチャは、予想されていた拡張がほぼ実現されたものとなっている。後述するが、従来のTeslaアーキテクチャでは、まだプロセッサ構造が複雑だった部分がシンプルかつフラットな構造に変わった。GPUコンピューティングのアプリケーションの一部で必要とされる倍精度演算パフォーマンスは、単精度の50%と大きく伸びた。汎用コンピュータとして、よりプログラムしやすく、より汎用的なアプリケーションを書きやすい構造になった。

 メモリ階層の拡張も目立つ。現在のプロセッサは、内部のコンピューティングパフォーマンスは伸びるが、メモリ帯域はそれに追従できない。そのため、性能を上げるためには、プロセッサ内部のメモリを活用してデータの局所性を活かすしかない。Fermiではメモリ階層を改良し、ライタブルなL1/L2キャッシュを設けることで、そうした状況に対応した。また、データセンターなどのニーズに応えるため、全メモリ階層でECCを加えた。よりパフォーマンスを引き出し易いメモリ構造と、高度なニーズに耐える信頼性を加えたことになる。

 NVIDIA独自の中間言語型の命令セットPTXは、OpenCLやDirectCompute、それにC++といった新言語サポートに向けて拡張された。PTXは、ドライバランタイムでGPUネイティブの命令にトランスレートされる。PTX 2.0では、新しく策定された浮動小数点演算スタンダードのIEEE 754-2008をサポートし、積和算の精度が新しい業界標準に合わされた。より多くの言語への対応や、新標準への対応がなされた。このことは、CUDAプラットフォームでの言語サポートをさらに拡大する自由度が増したことを意味している。

 GPU全体の効率を高める工夫も加えられた。NVIDIA GPUの弱点だった“重い”コンテクストスイッチは格段に高速化された。また、同じコンテクストの中の依存性のないカーネルプログラムを並列に走らせることができるようになった。CPUのマルチスレッディングとある程度似たような、高効率化が図られたことになる。

 現在の段階では、こうした拡張がグラフィックスパフォーマンスにどれだけ影響を及ぼすのかわからない。しかし、少なくとも汎用コンピューティングの面では、NVIDIAのFermiは大きな拡張を果たし、パフォーマンスをアップさせるだろう。

 今回の記事では、まず、GPUの構造の概要を描いてみたい。

●プロセッサクラスタの構成を一新して粒度を拡大

 NVIDIAアーキテクチャでは、GPUはプロセッサを束ねたプロセッサクラスタStreaming Multiprocessor(SM)を基本単位として構成されている。TeslaアーキテクチャのG80とGT200では、SMの基本構造はほぼ同じだった。しかし、FermiではSM自体の構造が変わり、よりフラットでコンピューティングの面で扱いやすく、より効率が高くなるように設計し直された。

 Tesla系では各SMは8個のプロセッサコア「Streaming Processor(SP)」を搭載していた。FermiではSM内のプロセッサコアは32個になった。SMの中のプロセッサコアは、TeslaではStreaming Processor(SP)と呼ばれていたが、今回から「CUDA core」と改名されている。ただし、厳密なものではなく、NVIDIA自体も、Fermiのコアを時々SPと呼んでいる。

 SM内のプロセッサコア数は変わったが、論理上のベクタ長であるWARP内のスレッド数は32のまま変わらない。WARPは「SIMT(Single Instruction, Multiple Thread)」実行、つまり同期して同じ命令を実行するスレッドの束で、一般的なベクタマシンのベクタ長にあたる。Fermiでは論理ベクタ長を変えずに、物理ベクタ長だけを変更したことになる。

 Tesla系では各SMに4個のSpecial Function Unit(SFU)と1個の命令ユニット、それに16KBのシェアードメモリ(スクラッチパッド型のライタブルメモリ)が搭載されていた。また、GT200からは各SMに1個の倍精度浮動小数点演算ユニットが加えられていた。しかし、Fermiではこの構造が変わった。

FermiのStreaming Multiprocessor

 FermiではSMに4個のSFUが搭載されておりSFUとプロセッサコアの比率が変わった。命令ユニットはデュアルになり、異なるWARPの命令を同時に発行できる。これについては、後の記事で説明するが、Teslaの基本的なスケジューラの流れを受け継ぎつつ、制御する粒度を高めることで、相対的な単純化を図っている。

 Fermiでの倍精度浮動小数点演算は、専用ユニットではなく、各プロセッサコアCUDA coreで実行されるようになった。CUDA coreは、単精度浮動小数点演算を1サイクルのスループットで実行できるが、倍精度演算も2サイクルスループットで実行できる。そのため、Fermiでは倍精度の性能は、単精度の1/2になる。汎用的なCPUの倍精度と単精度の比率と同じだ。GT200では、単精度のプロセッサコア8個に対して倍精度ユニットが1個で、倍精度と単精度の積和算の性能比は1/8だった。

 CUDA coreは倍精度浮動小数点演算に対応しただけでなく、内部データパスが2倍になり浮動小数点演算パイプと整数演算パイプが分離された。

Fermiの“CUDA Core”

●メモリ階層はハードウェアキャッシュとスクラッチパッドメモリの2本立て

 Teslaアーキテクチャでは、SMはより大きな規模のクラスタに編成されていた。G80では2個のSMで1個のTexture/Processor Cluster (TPC)を、GT200では3個のSMで1個のTPCとなっていた。ロードストア(Load/Store)ユニットとテクスチャ(Texture)ユニットは、TPC内のSM全てで共有されていた。

 しかし、Fermiでは、ロードストアユニットは、各SMに付属するようになりSM間での競合はなくなった。この構造から、テクスチャユニットもSMに付属していると推測される。つまり、TPCという概念自体がなくなった可能性が高い。

 このことは、クラスタの管理の構造が簡素化され、クラスタの粒度が高くなったことを意味する。つまり、GPUの中での制御部分は、相対的にシンプルになった。例えば、GT200ではプロセッサクラスタSMの数は30だったが、Fermiでは16に減っている。

 Teslaでは、各SMの内部にライタブルなシェアードメモリを16KB搭載していた。Fermiでは、メモリ量が64KBに拡張されただけでなく、コンフィギュラブル(Configurable)になった。具体的には48KBのシェアードメモリと16KBのライタブルL1キャッシュまたは16KBのシェアードメモリと48KBのライタブルL1キャッシュの組み合わせに切り替えることができる。

Fermiのメモリ構造

 従来のGPUのデータキャッシュはテクスチャ用で、リードオンリでプロセッサ側から書き込むことができなかった。しかし、Fermiではライタブルなキャッシュとなり、全てのSMで共有する768KBの共有L2キャッシュと、各SMに内蔵されるL1キャッシュの階層となった。スクラッチパッド型メモリとハードウェア制御キャッシュの2本立ての構造となった。

 そのため、プロセッサの演算結果がハードウェアで自動的にキャッシュされ、別なプロセッサがそれを参照するといったCPUでは当たり前のことが可能になった。ただし、キャッシュに馴染まないデータやアプリケーションもあるため、NVIDIAはL1をコンフィギュラブルにし、また、データによってはキャッシュに書き込まないといった制御もできるようにした。また、データの整合性を取るためのAtomicオペレーションの強化も図った。

●フラットなメモリアドレススペース

 Fermiでは、階層化されたメモリのアドレス空間は、論理上はフラットなアドレス空間に統合され、GPU内部でハードウェアで物理メモリ空間にマップされる方式へと変わった。これまで、階層毎に異なるアドレス空間に異なるロード/ストアオペレーションだったのが、単一空間で単一種のオペレーションに統合された。これによって、動的なアドレスのポインタのサポートが容易になったのと同時に、メモリ階層を今後複雑化することも容易になった。

Fermiのメモリアドレス空間

 メモリアドレッシングは64-bitに拡張された。ただし、CPUと同様に実装されるメモリアドレッシングは制限される。Fermiでは論理アドレスと物理アドレスともに40-bitが実装された。

 プレディケーションも、全ての命令に拡張された。GPUでのプレディケーションは、条件分岐の際に、分岐のテイクンとノットテイクンの両方の分岐パスをシリアルに実行。条件が成立したスレッドのみ、その演算結果をレジスタに書き込むテクニックだ。条件分岐をなくすことができるため、SIMD(Single Instruction, Multiple Data)型の実行を行なうGPUでは一般的に実装されている。Fermiではプレディケーションを全ての命令に適用できるようになり、結果として分岐を含むコードをより高速に実行できるようになった。

●複数のカーネルプログラムの並列実行が可能に

 目立たないが大きな拡張は、GPU全体のスレッド実行を制御する「GigaThread」エンジンの改良だ。

 これまでのNVIDIA GPUは、一度に1つのカーネルプログラムしか走らせることができなかった。正確には、各SMは、同じカーネルプログラムの別な部分の命令を、別なスレッドブロック群に対して実行していた。CPU的な言い方に直せば、シングル“スレッド”的なプロセッサだった。

 しかし、Fermiからは、同じコンテクストの中の依存性のないカーネルプログラムをGPUの中で同時に走らせることができるようになった。CPU的な言い方をすれば、マルチ“スレッド”的になった。そのため、実行するスレッド数の少ない、つまり並列度が比較的低いカーネルを多数実行するような場合にも、複数のカーネル実行を平行させることで、GPUを無駄なく稼働できるようになった。

Fermiのカーネル実行

 また、カーネル実行のバックグラウンドで、CPUからGPUへのデータ転送とGPUからCPUへのデータ転送をオーバーラップして実行できるようになった。これによってカーネル切り替えのレイテンシも最小化された。これには、「GigaThread Streaming Data Transfer(SDT) Engine」という名前がついてるが、元もと双方向のPCI Expressを有効に使えるようになっただけの話だ。

 Fermiアーキテクチャは幅広い範囲に渡る大規模なアーキテクチャ拡張であり、NVIDIA GPUは、この世代でアーキテクチャ的には完全に一新される。少なくとも並列コンピューティングでは、最強のアーキテクチャの1つになることは間違いない。ただし、盛りだくさんのFermiアーキテクチャは、トランジスタ数も30億(3billion)と巨大で、再び大型のチップサイズになることが予想される。