GPUを科学技術計算に使う

グラフィックス処理で使われる座標変換やピクセルのシェーディングの計算は、当初は、少ないハードウェアで実現できる固定小数点(整数と同じ)演算を使っていたのであるが、座標は小さなものはミリ以下の単位から広いシーンはキロメートル単位までの値が混在し、ピクセルの明るさは6桁程度は優に変わるので、固定小数点の数字の範囲にうまく収まるように注意して計算する必要があり、面倒であった。

このため、微細化で使用できるトランジスタ数が増えてくると、浮動小数点演算器を搭載するGPUが出てきた。32bitの単精度浮動小数点数で計算するのが一般的で、この精度で十分であるといわれている。

科学技術計算では64bitの倍精度(Double Precision)浮動小数点演算が多く使われるが、科学技術計算の中にも単精度で良い問題もある。そして、GPUが多数の単精度浮動小数点演算器を持ち、CPUに比べて格段に高い演算性能を持つようになると、GPUを科学技術計算に利用するという研究者が出てきた。当初はありあわせの単精度演算のGPUを使っていたのであるが、やはり、科学技術計算では、64bitの倍精度浮動小数点演算を使いたいという要望が出てきて、現在では、多くのGPUが単精度だけでなく、倍精度の浮動小数点演算も実行できるようになっている。

しかし、前述のように、グラフィック専用のGPUの場合は、32bitの単精度の浮動小数点演算ができれば十分である。このため、グラフィック専用で使われる中級以下のGPUチップでは、グラフィックスで使う単精度浮動小数点演算器は多数持っており性能は高いのであるが、倍精度浮動小数点演算器は少数しか搭載しないものも多い。この場合、倍精度浮動小数点演算は、一応、できるのであるが、単精度と比較すると1/10以下と性能が低い。

なお、GPUで科学技術計算を行う場合、CUDAやOpenCLという言語が使われることが多いが、これらの言語では倍精度浮動小数点演算が定義されており、GPU各社としては中級のGPUでもCUDAやOpenCLが使えるハードウェアであると言いたいので、性能的に低くても、一応、倍精度浮動小数点演算がハードウェアで実行できるようにしているという面もある。

一方、科学技術計算も視野に入れたハイエンドのGPUチップでは倍精度浮動小数点演算専用の回路を持ち、高い演算性能を持つチップが作られる。また、グラフィックスの場合は、回路の動作エラーで、1ピクセルの色が多少変わっても気づかないことが多いが、科学技術計算では1つでも計算結果が変わってしまうと問題である。特に、多数のGPUを使うスパコンではエラー回数は個数に比例して増えるので、このようなエラーは大きな問題であり、NVIDIAのFermi以降のハイエンドGPUはGDDR5メモリだけでなく、チップ内のキャッシュやレジスタファイルにもECCを付けてエラーを訂正する機能を持たせている。

一方、エンジニアリング用のワークステーションではCADやCAEで設計計算を行い、その結果を3Dグラフィックスで表示するという用途もあり、NVIDIAはスパコンなどの用途もにらんで、64bitの倍精度浮動小数点演算性能を強化したTeslaシリーズのGPUを商品化した。

NVIDIA Tesla GPUの外観とロゴマーク (出典:NVIDIA Webサイト)

現在ではAMDも64bit倍精度浮動小数点演算性能を強化した製品を出しているのであるが、スタートで先行したNVIDIAの方がプログラミング環境なども含めて先行しており、科学技術計算市場ではNVIDIAが大きなシェアを占めている。

これからGPUの構造について述べて行こうと思うのであるが、実はGPUの構造については情報が少ない。それでも、各社は新しいアーキテクチャのGPUを発表すると、ホワイトペーパーなどを出しており、ハイレベルの概略の構造は公表されている。もう1つの情報源は、GPUプログラムの性能を上げるためには、どのようにプログラムを書くべきかというドキュメントである。このドキュメントには、直接的には、GPUのマイクロアーキテクチャは書かれていないが、こう使えば性能が高くなるという記述から、こう作られている筈という推測ができる。

ということで、これから説明するGPUのマイクロアーキテクチャは、GPU各社の内部情報に基づくものではなく、これらの公開情報に基づく筆者の推測であり、間違っていることも十分あり得る。