GPUはなぜ高性能なのか?

3Dグラフィックス処理のところで述べたように、描画には、多数の頂点の座標変換や多数のピクセルの明るさを計算する必要がある。GPUは、この大量の計算を高速に実行することを目的として作られた専用プロセサである。

一方、現在のGPUはアドレス変換機構は持っているものの、VMをサポートするレベルにはなっていないし、ユーザモードとスーパバイザモードの分離や割り込み処理機構などは、持っていないか、あるとしても不十分で、LinuxなどのOSを実装できる汎用プロセサとはなっていない。

大量の頂点の座標変換や大量のピクセルの明るさの計算を高速に実行するには、頂点レベルやピクセルレベルに存在する大量の並列性を利用して、並列に計算を行うのが効率が良い。現在のハイエンドのGPUでは、数1000個の演算器を1チップに集積し、数1000個の頂点やピクセルの計算を並列に実行することにより、高い性能を実現している。

Xeon E5-2680 v2 CPUは10コアで、各コアでAVX2を使えば、32bit単精度(Single Precision)浮動小数点の積和演算を8個並列に実行でき、2演算(積と和)×8並列×8コア=128演算を実行できる。一方、NVIDIAのK20x GPUは2演算×192並列×14コア=5376演算を並列に実行できる。Xeon E5-2680 v2のクロックは2.8GHzであるのに対して、K20x GPUは0.732GHzであり、CPUの方が3.825倍のクロックであることを考慮しても、5376/(128×3.825倍クロック)=10.98で、ピーク演算性能でいうと、Kepler GPUの方が11倍以上速い。

図3.1 CPUとGPUの単精度(SP)演算性能の比較

一方、まったく並列に実行できないシングルスレッドの場合を考えて見ると、強力なキャッシュ階層や分岐予測機構を持ち、スーパスカラやOut-of-Order実行を行うXeonコアは、1サイクルに1.5命令程度は実行できると考えられる。これに対して、キャッシュも貧弱で、単純なインオーダ実行を行うGPUコアは、例えばgccのコンパイルなどの整数系の処理が中心で条件分岐も多い仕事をする場合には、1サイクルに0.1~0.2命令しか実行できないと思われる。これだけでみても、10倍程度の性能差があり、これにクロックの約4倍を合わせると、40倍くらいCPUの方が速いと思われる。

つまり、CPUとGPUの性能を比較するのは、スポーツカーと大型トラックを比較するようなもので、速度に注目するのか積載量に注目するのかで結果はまったく変わってくる。従って、適材適所で使い分けるというのが正しい使い方である。例えば、スパコンの計算ノードは2ソケットのXeon CPUに3~4台のGPUを接続するという構成が一般的である。これは、OSを動かし、ノード間の通信やIOなどの処理を行うにはXeon CPUが適しており、多数のスレッドで並列に計算できる科学技術計算のコア部分はGPUにやらせるという分担が最も効率が高いからである。また、科学技術計算の中でも並列度が低い部分はXeon CPUの方が計算が速いという部分もあり、CPU+GPUという構成が活きる。