CUDA 入門

2011年1月8日

CUDA とは

グラフィックカード (ビデオカードともいう) はグラフィックを描画する仕事を受け持つ装置です。グラフィックについての演算処理を行う部品を GPU (Graphics Processing Unit) と呼びます。グラフィック処理はディスプレイの画素 (ピクセル) 単位で行われますが、画素どうしの処理の依存性が小さいため (つまり 100 番目の画素を処理するために 1 番目の画素の処理の完了を必ずしも待つ必要はない)、グラフィックカードは複数のプロセッサによって複数の画素を同時に処理します。この並列計算機能をグラフィック処理以外にも活用できないかということで、GPU は GPGPU (General-Purpose computation on GPU, GPU による汎用目的計算) というキーワードで再認識されるようになりました。CUDA は、NVIDIA 製品向けに GPGPU プログラミングを行うためのプラットフォームです。

グラフィックカードの仕組み

GPU は画素の処理を並行処理するためにたくさんのプロセッサをもっています。そのプロセッサをスカラプロセッサ (SP) あるいは CUDA コアと呼びます。コアはいくつかずつでまとまっており、コアのまとまりと共有メモリなどが集まってストリーミングマルチプロセッサ (SM) あるいは単にマルチプロセッサ (MP) と呼ばれる単位を作っています。GPU はこの MP の集合として構成されます。この GPU とメモリ (ビデオメモリ、CUDA 上では "グローバルメモリ") によりグラフィックカードは構成されています。

GPU による計算の流れ

GPU を利用した計算はつぎのように行われます。

  1. GPU による処理に必要なデータをメインメモリからビデオメモリへ転送する。
  2. GPU による処理を実行する。
  3. GPU による処理の結果をビデオメモリからメインメモリへ転送する。

CUDA 上の概念

ホストとデバイス

CUDA によるプログラミングにおいては、CPU の処理と GPU の処理の区別をはっきり認識しておく必要があります。CPU 側をホスト、GPU 側をデバイスと呼びます。ホストとデバイスのコードはわけて書く必要があります。デバイス側で動くプログラムのことをカーネルと呼びます。

デバイスとグリッド

デバイスは 1 つの GPU に対応しています。グラフィックカードを複数挿すことも可能なので、デバイスが複数ある場合もあります。デバイスの下位概念としてグリッドがあります。1 デバイスに 1 グリッドが対応します。グリッドは複数のブロックにわかれています。

ブロックとスレッド

ブロックはスレッドというものから構成されます。このスレッドが実際の処理の単位です。ブロックは MP に、スレッドはコアにそれぞれ対応します。ただし、OS 上の 1 つのプロセスが必ずしも 1 つの CPU に対応していないように、ブロックやスレッドも MP やコアの数に対応する必要はありません。

ブロックやスレッドの数は任意に設定できますが、その数には制限があります。デバイスがどれだけの数のブロックやスレッドを扱えるかは、NVIDIA GPU Computing SDK のサンプルプログラム deviceQuery を実行することで知ることができます。

ハードウェアのバージョン

NVIDIA のハードウェアには Compute Capability なるバージョン番号があります。この番号によってスレッド数などの制限や使える機能が異なります。

一番気になるのは倍精度浮動小数点数の対応についてでしょう。倍精度浮動小数点数は Compute Capability 1.3 から対応しています。数値計算などでぜひとも使いたい倍精度浮動小数点数ですが、そのためには Compute Capability が 1.3 以上のグラフィックカードを用意する必要があります。

CUDA プログラミング 目次へ