単精度の演算性能では汎用 CPU を大幅に上回る、ということになっている
GPGPU ですが、実際の性能はどんなものか、というのはなかなかよくわかりま
せん。というのは、大抵の論文では、
-
あるアプリケーションについて、
-
どの程度チューニングされたかわからない汎用 CPU との速度比較が
のっているだけだからです。汎用 CPU の理論ピーク性能が例えば 10 Gflops
だったとしても、実際のアプリケーションでは適当なコーディングでは 1
Gflops も出ない、ということは珍しくない、というか普通ですから、例えば
その3倍性能がでました、といってもそれは 3Gflops なわけです。汎用 CPU
のプログラムをちゃんとチューニングしたらそれくらいの性能はでてしまうの
かもしれません。
そういうわけで、性能比較が実際に役に立つためには、
が理解される必要があります。こんなことは当たり前だと言われるとそうなの
ですが、しかし、実際には特に後者の、「何故その性能になっているか」は
なかなかわかりません。
例として、 GPU で重力 N 体計算をしたという
論文を取り上げてみ
ます。この論文の筆頭著者は98年から99年にかけて私の研究室にポスドクでき
ていた人で、現在はアムステルダム大学の助教授(くらいだと思います)になっ
ています。
この論文では、 GRAPE でやっていた N 体計算を、同じような方法で GPU を
使うコードを作って、その性能を比較しています。使った GPU は nVidia
8800GTX と Quadro FX1400 です。これらでは、基本的に同じ Cg 言語を使っ
たプログラムを書いた、となっています。
実装の詳細は後で議論するとして、まず速度です。N 体計算の計算量は基本的
には粒子数N の自乗に比例するわけですが、 GRAPE を使う計算ではこのN の
自乗に比例するところだけを GRAPE でやり、粒子数にしか計算量が比例しな
いところは普通の PC(ホスト計算機) でやります。また、このためにホスト計
算機と GRAPE の間に通信が発生し、その量は粒子数に比例します。
このため、 GRAPE を使った計算では、粒子数が小さいところではホストでの
計算や通信のほうに時間がかかるので、計算時間が粒子数に比例します。粒子
数が大きくなると GRAPE の速度が見えてきます。普通の PC を使った計算で
は、非常に小さい粒子数 (10程度)でなければ計算時間は粒子数の2乗に比例す
るので、 GRAPE を使った計算は粒子数が非常に小さいところではホストより
遅く、粒子数を大きくしていくと GRAPE は Nに比例してホストはNの2乗に比
例するのである範囲では N が大きいほど GRAPE が相対的に速くなり、 N が
非常に大きいところでは速度差が一定になります。
この論文では、 GRAPE-6 の4チップモデル(ピーク性能 130Gflops くらい)と
ホスト(3.4GHz Xeon)を比べると、 256 粒子で既に GRAPE が速く、 N が大き
い極限では 100倍程度 GRAPE が速くなっています。これは、ホストのほうは
ほぼ 1.3 Gflops 程度でている、ということで、 3.4GHz Xeon で特別なチュー
ニングをしていなければこんなものでしょう。問題はGPU です。論文の図 1
をみていただければ(少なくとも 2007/2/16 版では)、
-
FX1400 はあらゆる粒子数で Xeon より遅い
-
8800GTX はあらゆる粒子数で GRAPE-6 の 25 から 70倍遅い
-
8800GTX が Xeon と同じ速さになるのは 16000粒子くらい
となっています。これからわかることは、
-
FX1400 は計算速度自体がXeon より遅い
-
8800GTX は計算速度自体は Xeon よりかなり速い
-
おそらく、通信速度が 8800GTX は GRAPE-6 の 1/70 程度である
ということです。
通信速度のハードウェアの性能としては、 GRAPE-6 は 32bit PCI でつながっ
ており、理論ピークが 132MB/s です。実際には 50MB/s 程度であることがわ
かっています。つまり、 GPU はどういうわけか 1MB/s もでていない、という
ことになります。
理論的には、 GPU は 16 レーン PCI-Express でつながっているわけですから、
通信には PCI で接続された GRAPE-6 の30倍の速度がでてもいいわけです。従っ
て、どういうわけかハードウェアの理論性能の 1/2000 くらいの通信速度しか
でていない、ということになります。
問題は何故このように極度に通信が遅いかですが、まだコードを公開したくな
いとのことなので理由は良くわかりません。 が、これが GPU とか Cg 言語の
実力、というわけではないと思います。というか、思いたいところです。
現在のところ、あまりに通信が遅いので 8800GTX の計算速度は評価困難です。
が、ホストの 10倍程度はでているようにもみえます。
もちろん、単精度なので精度不足、という問題もあるのですが、これは数値評
価を工夫することで(演算数はかなり増えますが)、GRAPE と同じことをやらせ
るなら実効的に倍精度にするのは難しいことではありません。元々、GRAPE で
も最初の座標の引き算と最後の積算以外は単精度でやっていますから、同じよ
うなことをすればいいのです。
まあ、それでも、1999年に作ったチップの GRAPE-6 に比べて同等かやや劣る
速度で消費電力は数倍、という感じで、なかなか微妙な線かもしれません。
現在の 4 コアの Intel チップなら、チューニングしたコードでは20-40
Gflops 程度はでるでしょうから、 8800GTXとの差は殆どなくなってしまいま
す。
なかなか、 GPGPU も簡単ではないようです。
さて、この話には後日談というか続きがあります。まともにやればもっとまと
もな性能がでるという、、、乞御期待。