ここ 3-4 年の間に GPU を使った数値計算という話が、少なくとも研究レベル
では次第に盛んになってきました。
私はあんまり自分で使ったわけではないので偉そうなことを書くのはアレな気
がしますが、この文章では現在考えられる可能性をカバーしておく必要はある
ということで書いてみます。嘘が書いてあると思ったら指摘して下さい。
一昔前には GPU は基本的にパイプライン化した専用プロセッサの集合で、あ
る意味 GRAPE と似たようなものでした。また、データ形式も基本的は 16 ビッ
ト整数でした。このため、演算能力自体は高くてもあまりいろんな使い道に使
えるものではありませんでした。しかし、3次元データの投影表現が中心にな
るとポリゴン座標は浮動小数点になり、最近は IEEE 32 ビット互換のものも
あります。また、ピクセルデータを扱うピクセルシェーダと言われる部分でも、
浮動小数点データを扱えるようになったものがあります (GeForce 6シリーズ
等)。
大量の演算能力が必要になるのは主にピクセルシェーダで、例えば GeForce 6
シリーズ(以下 GF6と略記)では、このために 16 (GF 7800 では24)プロセッサ
を持ち、それぞれが 12演算 (乗算+加算 4 ユニットとさらに乗算のみ 4ユニッ
ト) する構成になっています。(この辺ちょっと嘘かも) クロックは 500MHz
前後ですので、 プロセッサあたり 8 演算としても全体で約 100 演算、
単精度 50Gflops ということになります。
メモリについては。グラフィックカード上で GPU に直結した DRAM は 256 ビッ
ト幅、 DDR 600MHz (データレート 1.2GHz) というものもあり、この場合には
バンド幅は 38.4 GB/s に達します。 GPU の特徴の一つはこの極めて高いメモ
リバンド幅にあります。 5 演算の間に 1 語転送が可能であり、ベクトル計
算機の2演算1語に比べると劣るもののマイクロプロセッサに比べると演算性能、
バンド幅の両方が数倍になっているわけです。プログラミングモデルは完全に
汎用というわけではありませんが、大雑把にいって大規模な SIMD プロセッサ、
と思っておいていいようです。
というわけで、普通の PC に比べて数倍の演算性能を、値段を倍くらいにする
ことで(新しいグラフィックカードは結構高い、、、)実現できる「かもしれな
い」というところに GPGPU (General-Purpose computation on GPUs) という
ものの可能性がある、ということになります。
ここで重要なのは、ハードウェア開発コストはゼロである、ということです。
このため、ソフトウェアを頑張ればなにかいいことがあるかもしれない、とい
うわけで研究対象にはなります。
では、これがいろんな計算で実際に使いものになるか、という話になると実は
よくわからないところがあります。というのは、 GPU という性格上設計には
以下の制約があるからです。
-
単精度で十分。仮数 24 ビット必要かどうかは微妙
-
メモリバンド幅に対して演算速度をある程度以上はあげたくない
精度については、 nVidia の GPU は 仮数 24 ビットですが、 ATI は現在の
ところ 16 ビットとなっています。いずれにしても、 24 よりさらに高い精度
というのは当面不必要と思われます。これに対して、多くの科学技術計算では
倍精度は必須です。部分的に(場合によっては計算のほとんどを)単精度で行う
ことができる場合もありますが、その場合にも1つの演算ループの中で倍精度、
単精度の両方の演算をする必要があるようなケースが多く、単精度演算だけしか
できないプロセッサでは使えない、ということになります。ソフトウェアで倍精
度演算を行うのは常に可能ですが、ある程度のハードウェアサポートがなけれ
ば 数十倍の時間がかかってしまいます。
倍精度にするとハードウェア規模は 5 倍程度にはなるので、単純に倍精度演
算をサポートする、という可能性はあまりないと思われます。 IBM Power で4
倍長のサポートがあるように、なんらかのハードウェアサポートをすることで
4サイクル程度で倍精度乗算ができるようにするのはそれほど難しいことでは
ないのですが、それによってマーケットが広がることが大して期待できないこ
とにトランジスタを使う気になるかどうかは怪しいかな、という気もします。
また、 1/4 になると例えば GeForce 6800 にそういう機能があったとして倍
精度 12 Gflops になってしまい、 Pentium D と変わらなくなってしまいます。
まあ、元々単精度でも 2-3 倍しか違わないわけです。
2-3倍しか速くないのは、結局演算器の数があまり多くないからです。多くな
いのは、ピクセルシェーダではメモリバンド幅に対して演算性能を上げても意
味がないからです。ピクセルシェーダの基本的な機能は、各ピクセルに対して
テクスチャパターンから色、明るさを決めることで、メモリに入っているのは
テクスチャパターンです。これを読んで、ピクセルデータとなんか計算して、
出力はピクセルの実際の色、明るさ、ということになります。 GPU で最も重
要な機能はテクスチャパターンを高速に読み出すことです。計算はある
意味おまけです。このため、それほど高い演算性能になりません。
ピーク性能だけを考えると、 GPGPU でそんなにいいことがあるか?というの
は結構疑問です。メモリバンド幅が広いことは魅力ですが、問題はこれはカー
ドに載ったメモリだけということです。512MB とか結構大きなメモリがのった
カードがあることは確かですが、全ての処理をそちら側でできるわけでは普通
ないからです。 プログラム全体は CPU の側で動いて、計算が重いところだけ
を GPU で、と思うと、 PCI-Express とかを通してデータ転送が発生し、アプ
リケーションによってはそこがボトルネックになりますし、そこがボトルネッ
クにならないようなアプリケーションなら始めからバンド幅もメモリ容量もあ
まりいらないケースが多いでしょう。
GPU を GPU として(グラフィック処理に)使う時には、処理結果を CPU 側に戻
す必要はありませんし、CPU から送るデータ、例えばポリゴン座標は、ピクセ
ルデータに比べて量が少ないわけです。このため、通信バンド幅は必ずしもボ
トルネックにはならないで済みます。
GPU が注目されている一つの理由は、過去数年では GPU の進歩のほうが CPU
より速かった、ということがあります。
しかし、今後、 GPU のほうがマイクロプロセッサより速く進歩するか、とい
うと、これはかなり疑問です。一つは、 CPU もマルチコア化したことで名目
のピーク性能はトランジスタ数に比例して上げられるようになったことがあり
ます。もうひとつは GPU のほうでメモリバンド幅を増やすのが限界に近付い
た、ということがあります。 メモリバンド幅を増やすのは、クロック、ビッ
ト幅両方の増加によってきたのですが、プリント基板に石を載せて配線してい
る限り、現在の 256ビット幅を 2倍、 4 倍と増やすのはコストがかかりすぎ
るからです。 チップ同士を直接積層して非常に多数のパッドでつなぐ貫通電
極といった技術が実現しないと、今までよりはバンド幅の伸びは落ちると思わ
れます。
もちろん、貫通電極のような超多ピン技術が近い将来に実用化される可能性
は十分あります。しかし、その場合、 GPU 以外への応用も当然考えられるわ
けで、例えば、ベクトル計算機をそれで作る、というような可能性もでてくる
わけです。
というわけで、個人的には GPGPU にあまり期待しないほうがいいのでは、、、
と思っています。