GPU を用いた並列計算

近年、GPU を用いた並列計算が非常によく研究されています。Amber などの分動力学計算でも用いられていますし、今年発売されたGaussian 16 もGPU を用いた並列計算に対応したことから、注目度の高さとその有用性が伺えると思います。

前回の記事 ”自作 PC をつくってみた!”にも書いた通り、管理人は最近グラフィックボードを購入しました。

GPU を用いた並列計算でどれくらい計算が加速するかにも興味があるのですが、一番の関心は CUDA での並列用プログラムの開発です。CUDA についてはまた今度まとめますが、今回は GPU を用いた並列計算について、自分用のメモも兼ねてまとめたいと思います。

GPU とは?

GPUとは、Graphics Processing Unit の略で、日本語では画像処理装置とも呼ばれます。パソコンの頭脳としては、CPU(Central Processing Unit/中央演算処理装置)がよく知られていますが、画像処理に特化したもとして開発されたのが GPU です。

グラフィクスの描画には多数の頂点の座標変換や多数のピクセルの明るさを計算する必要があるため、大量の浮動小数点演算を実行する必要があります。そのため GPU には多数(例えば 512 個)の演算器が用意されており、グループごとに SIMD 方式で制御されています。最近では科学技術計算に拡張した GPU が登場して、GPGPU (General Purpose GPU) と呼ばれています。
(注)SIMD 方式= Single Instruction Multiple Data とは、一つの演算命令で複数データに対する処理を同時に行う方式のことを指します。

通常の映像処理は CPU に内蔵されているグラフィックボードで十分なのですが、例えば複雑な映像処理をすると重くなったり、3D を駆使したゲームなどではコマ落ちしたりするなど限界があるため、負荷のかかる映像処理には GPU が必須となります。

こちらに CPU と GPU の違いを視覚的に認識できる動画があります。CPU は逐次処理用に最適化された数個のコアから成るのに対して、GPU は複数のタスクに同時に対応できるよう設計された数百から何千のより小さくより効率的なコアで構成されています。

GPU の購入

市販されている GPU では、NVIDIA の GeForce、Quadro、Tesla、AMD の Radeon、FirePro、FireStream が有名です。

一般的に、ゲームなどの個人使用には GeForce や Radeon が適しているとされ、業務用の動画編集や 3D-CAD では Quadro や FirePro が適しているとされています。

また、計算機科学用には NVIDIA 社の Tesla やAMD 社の FireStream が良いとされていますが、Tesla も Quadro も個人で購入するには高過ぎる気がします。。。
(Gaussian 16 は、Tesla K40 または K80 でないとダメなようです。Amber は GeForce シリーズでも OK です。)

Quadro は高かったので管理人は GeForce の GTX 1060 を使用しています。ちなみに、GeForce の GTX-1080 は 7 万円くらいですが、Quadro K6000 は、60 万円近くするそうです。

計算化学とのつながり

GPU は、元々はワークステーションや PC での CG において高速な描画機能を提供する専用のプロセッサでしたが、リアルタイムで描画される CG の高度化に伴い、だんだんと汎用のプログラミング機能とデータ構造をその ”プログラマブル・シェーダー” が獲得していきました。(注)プログラマブル・シェーダーについては、こちらのページ(外部リンク)

それとともに汎用の並列計算への適用が研究され、2006 年の NVIDIA 社の CUDA 言語(後述)とそれをサポートする汎用 GPU の登場により、GPGPU と呼ばれるに至りました。

GPU を用いた並列計算が盛んになっていったのは、個々の CPU の処理性能の上昇率が伸び悩むようになってきたために、マルチコア(multi core)・メニーコア(many core)化していった時代の流れと良く合っていると思います。

複雑な処理にも対応した CPU に比べて、GPU は単純かつ膨大な量のデータを短時間で処理する能力に長けているため、計算機への応用が研究され始めました。実際、下図に示したように、数十倍ほど計算速度が向上するようです。

(画像は、こちらのページから転載。)

ここまで聞くと GPU がとても優れていることがお分かりいただけたと思います。しかし、ノード間の通信や IO などの処理を行うには CPU が適しているため、スーパーコンピューターでは 1 ノードに 2 ソケットの Xeon CPU と 4 つの GPU という構成が一般的なようです。

2009 年 11 月の TOP500 で世界 5 位になったスーパーコンピューター ”天河一号 Tianhe-I” は、 14,336 個の CPU (Xeon X5670) と 7,168 個の GPU (NVIDIA Tesla 2050) で構成されていました。

また、東京工業大学に設置されているスーパーコンピューター TSUBAME にも多くの GPU が用いられています。

GPU 並列計算を行うには?

GPU を用いた並列計算を行うには、それ専用にプログラムを書き換える必要があります。有名どころでは、NVIDIA 社が提供している CUDA や Khronos Group の OpenCL などがあります。

CUDA も OpenCL も C 言語をベースとして開発されているので、C++ メインの管理人にとっては非常に取っつきやすそうです。

GPU 並列処理用の言語はいくつかありますが、どれを使えばいいか迷われている方は、こちらのページを参考にされてはどうでしょうか?(外部リンク)

管理人は GeForece の GTX 1060 を購入したので CUDA を使います。次回の記事では、並列プログラミング用の言語について書きたいと思います。

管理人はコンピューターの専門家ではないため、もし記事中に誤りなどがありましたら、コメント欄、Twitter、メールなどで教えていただけたら幸いです。お手柔らかにお願いいたします。

参考文献

  1. 計算科学(別巻)スーパーコンピューター【岩波講座】
  2. ゼロから始めるGPU Computing
  3. CUDAとOpenCLどっちがいいの?

関連する記事

管理人: