Unified Shader方式のGPU

Unified Shader方式のGPUは、座標変換や明るさの計算を行うハードウェアをそれぞれの処理に専用に設けるのではなく、汎用的な処理ができる演算器を持つ構造になっている。そして、どのような処理を行うかをハードウェアロジックで決めるのではなく、プログラムによって制御している。従って、座標変換を行う場合は、座標変換のプログラムを実行し、明るさの計算の場合は、そのプログラムを実行するという方法で、それぞれの処理を実行する。

これらの明るさなどを計算する処理はshading(絵の陰影、色の濃淡つけ)と呼ばれ、この処理を行うユニットをshaderと呼ぶ。Unfied Shader方式のGPUの処理は汎用プロセサの処理と同じ考え方であり、汎用的な処理が可能なGPUを使って、表示処理以外の一般的な計算を実行することをGPU Computingと呼んでいる。

GPUの大手メーカーであるNVIDIAは、同社のGPUを汎用の数値計算に利用するためのCUDA(Compute Unified Device Architecture)というGPU用のプログラム環境を開発、公開しており、現在の正式リリースバージョンは1.1であるが、このほど、CUDA2.0のβ版が公開された。

NVIDIAのGeForce8000 / 9000 GPU

次の表に、NVIDIAのGPUでCUDAが動作するGPU仕様の一覧を示す。但し、この表に見られるように、NVIDIAは、少しづつクロックやメモリバスの幅を変えてバリエーションを作っており製品の種類が多く、モバイル用のMのついた品種などはリストから省いているので、正確にどのGPUがCUDA対応であるかはNVIDIAのサイトで確認していただきたい。また、9600 GSOは、最新の品種でありCUDAの動作が可能だと思うのであるが、NVIDIAのCUDA Enabled GPUの一覧表には含まれていないというように、NVIDIAのサイトの情報も100%信頼してよいかどうかには多少、不安が残る。

NVIDIAのCUDA Enabled GPUのリスト

品種名 仕様 MP数 Shader Clock [MHz] Core Clock [MHz] Mem Clock [MHz] Mem Bus幅 [bit] Texture Fill [Gpix/s] Mem B/W [GB/s]
9800 GX2 1500 600 1000 512 76.8 128
9800 GTX (16) 1688 675 1100 256 70.4 70.4
9600 GT (8) 1625 650 900 256 57.6 57.6
9600 GSO 1375 550 800 192 38.4 38.4
8800 Ultra 1.0 16 1500 612 1080 384 39.2 103.7
8800 GTX 1.0 16 1350 575 900 384 36.8 86.4
8800 GTS 1.0 12 1200 500 800 320 24 64
8800 GT 1.1 14 1500 600 900 256 33.6 57.6
8600 GTS 1.1 4 1450 675 1000 128 10.8 32
8600 GT 1.1 4 1180 540 700 128 8.64 22.4
8500 GT 1.1 2 900 450 400 128 3.6 12.8
8400 GS 1.1 1 900 450 400 64 3.6 6.4

品種名の次の欄の仕様は、CUDAサポートの機能バージョンを表すもので、当初は1.0であるが、8800GT以下の品種では、多少機能が追加されたバージョン1.1となっている。また、最新の9600系は、当然1.1と同等かそれより上になっていると思われるが、この原稿を書いている時点では、正確なバージョン情報は公表されていない。

次のMP数の欄は、NVIDIAがマルチプロセサと呼ぶ、シェーダー処理を行うユニットの数を示している。9000系に関してはMP数は公表されていないが、9800は16個、9600は8個であると考えらえれる。

そして、GeForce GPUは演算を行うシェーダー部分と、コアの制御部分、メモリとがそれぞれ独立のクロックを使う設計であり、それらのクロック周波数の欄が並んでいる。そして、Memory Bus幅の欄はグラフィックメモリへのバスのビット幅である。

次のTexture Fillの欄は、面にテクスチャを貼り付けるスピード、その次はグラフィックメモリとGPU間のバンド幅である。この表を見ると、8000シリーズから9000シリーズへのクロック周波数の向上は10%程度であるが、Texture Fillの性能は倍増しており、9000シリーズでは、この部分でアーキテクチャ的な増強が行われたと考えられる。また、メモリバンド幅に関しても、バス幅やクロックを向上して性能向上を行っている。

次の図に、GeForce 8800 GTXのブロックダイヤを示す。

NVIDIAのドキュメントに記載されているGeForce 8800 GTXのブロックダイヤ(出典:NVIDIA)

中央に8個並んでいる大きな箱がシェーダープロセサの部分である。それぞれの箱に2個のマルチプロセサが入っており、こられの8個の箱で、16個のマルチプロセサとなる。そして、各マルチプロセサには8個の演算ユニット(Stream Processor、SPと呼ぶ)が入っており、それぞれの演算ユニットは32ビットの整数演算、浮動小数点乗算(MUL)、浮動小数点積和演算(MAD)を行うユニットを持っている。

各マルチプロセサは独立した命令ユニットを持ち、それぞれ個別の命令列を実行することができるが、それぞれのマルチプロセサに含まれる8個のSPは同一の命令を実行することになる。そして、SPは4サイクルにわたって同じ命令を実行する。コアのクロックはシェーダーのクロックの1/3強となっているので毎サイクル新しい命令を供給することが出来ず、このような構造を採っていると考えられる。

このため、次の図に示すようにSP0は時分割でスレッド0、8、16、24の実行を担当し、SP1はスレッド1、9、17、25を担当するという処理になる。従って、最低32本のスレッドがないと、実行に空きが生じてしまう。NVIDIAは、この32スレッドの単位をWarpと呼んでいる。

マルチプロセサのスレッド実行状況

このように、各マルチプロセサが32スレッドを並列に実行するので、16個のマルチプロセサを持つ8800 GTXは512本のスレッドを並列に実行する。汎用プロセサでは、最も並列度の高いSunのUltraSPARC T2(Niagara 2)でも8コア×8スレッドで64スレッドの並列実行であるのに対して、8800GTXは、その8倍のスレッドを並列実行する超並列プロセサである。これが、Unified Shader方式のGPUが高性能である理由である。

一つのWarpに含まれる全てのスレッドが同一の命令を実行する場合は、前の図のように実行できるが、上記の命令i+1が条件分岐命令であり、スレッドによって次に実行する命令が違ってくると、このようには実行できない。

条件分岐がある場合のマルチスレッドの実行

このため分岐が起こると、上の図のように、まず分岐なしの方向のスレッドだけを実行し、次に分岐ありの方向のスレッドだけを実行するという処理を行う。つまり、分岐が起こると、両方のフローが合体するまで、分岐の両方の方向の命令を実行するための時間が必要となってしまい、1サイクルに有効に仕事ができるスレッド数が減少する。このため、できるだけ条件分岐を使わない形にプログラムを書くことが性能の高いプログラムを書く上で重要である。

SPは、浮動小数点の積和演算と乗算は同時に実行することが可能であり、1サイクルに実行できる浮動小数点演算数は、3演算/サイクル×16マルチプロセサ×8演算器 = 384演算/サイクルである。そして、9800 GTXのシェーダークロックは1688MHzであるので、全体の演算性能は384×1688M = 648GFlopsとなる。

Intelなどの汎用x86プロセサでは、SSE命令を使用するとコアあたり8演算/サイクルの単精度浮動小数点演算の実行が可能である。従って、2.83GHzクロックのクワッドコアのQ9550の場合90.56GFlopsであるので、これと比較すると9800 GTXは7倍強のピーク演算性能を持っている。

また、各マルチプロセサに、図ではTFと書かれている2個のテクスチャフィルタリングユニットを持っている。テクスチャの貼り付けに関しても、貼り付ける面が傾いている場合は傾きに応じてテクスチャを伸縮する必要があり、TFユニットも補間演算などの機能を持っているが、この機能は科学技術計算では使い道が限定される。従って、後述のROPユニットと合わせて、表示専用のハードウェアと言ってよい。

そして、各マルチプロセサは8192本のレジスタを持っている。このレジスタ数は汎用プロセサに較べると非常に大きい数であるが、一つのマルチプロセサをフルに動かすためには最低でも1Warp(32本)のスレッドが必要である。そして、最大アクティブスレッド数は768(24Warpを順次実行)となっていて、実際のプログラムでも一つのマルチプロセサで数百のスレッドが実行されるのが普通であるので、それぞれのスレッドで使用できるレジスタ本数は、汎用プロセサと較べてそれほど多いというわけでは無い。

レジスタから溢れたデータを保持するメモリとして、図ではL1と書かれているシェアードメモリを持っている。シェアードメモリは、マルチプロセサあたり16KB存在し、8個のSPで共用している。このシェアードメモリは、ソフトウェアで意識する必要のない汎用CPUのキャッシュとは異なり、CUDAで領域を確保してアクセスするローカルメモリである。なお、8個のSPからのアクセスの衝突を減らすため、この16KBのローカルメモリは16バンク構成になっている。

ブロックダイヤの図の下側の部分は、マルチプロセサ群とメモリを接続する部分であり、これらを接続する共通バスと、L2と書かれた全マルチプロセサで共有されるコンスタントメモリとテクスチャメモリ、そしてビットマップレベルの操作を行うラスターオペレーション部(ROP部:L2の隣の青い小箱群)が存在する。

全マルチプロセサで共用するオンチップメモリとして、コンスタントメモリとテクスチャメモリがある。これらのメモリ量は実装されているマルチプロセサ数に依存するようで容量は明記されていないが、アーキテクチャ的には、各マルチプロセサは最大8KBのコンスタントメモリと最大8KBのテクスチャメモリをアドレスすることができるようになっている。また、このコンスタントメモリとテクスチャメモリは、まとめて値を書き込む機能は存在するが、通常の処理では読み出しだけのリードオンリーのメモリとなる。

8800 GTX/Ultraのメモリバス幅は384ビットであり、64ビット幅のメモリバス6本で構成されている。これは、現状の汎用CPUのメモリバスは128ビット程度であるのに較べると3倍の幅であり、この強力なメモリバスもGPUが高性能を発揮する上で重要な役割を果たしている。

メモリバンド幅について補足すると、512ビットのバス幅を持つ9800 GX2は2個のGPUチップを1枚のボードに搭載した製品であり、単一チップでの最大のメモリバス幅を誇るのは、現在でも8800 GTX/Ultraである。そして、ブロックダイヤの図の上側の部分は、ホスト(汎用CPU)へのインタフェースや、マルチプロセサに命令を供給するGPU全体の制御回路が描かれている。また、このブロック図には明示されていないが、ホストのメモリとGPUのデバイスメモリの間のDMA転送を行うDMAユニットが存在する。

なお、9000シリーズのハードウェアアーキテクチャについては殆ど情報が無いが、強化された部分はPureVideo HDなどの部分であり、GPUコンピューティングに関する部分は、基本的には8000シリーズからあまり変更が無いと考えられる。