はじめに

CUDAプログラムを作るにあたって知っておかなければならなかった用語やプログラムのお作法などのメモを残します。

用語

用語名 意味
ホスト CPU側
デバイス GPU側
カーネル デバイスで実行されるプログラム
ブロック スレッドの塊
グリッド ブロックの塊

プログラムのお作法

  • メソッドの先頭に __global__ をつける
  • カーネルは以下の方法で呼び出す。
メソッド名<<<グリッドに含まれるブロックの数, ブロックに含まれるスレッドの数>>>(カーネルの引数)
  • カーネル内では blockIdx/threadIdx という変数が自動で定義されており、この変数を使って自身のグリッド内のブロックのインデックス/ブロック内のスレッドのインデックスを把握することができる。
  • 3次元を扱うグリッド/ブロックの数やブロック/スレッドのインデックスは dim3 で表現される。

プログラム例

__global__ void sample(int a) {
  int index = blockIdx.x * blockDim.x + threadIdx.x;
}

int main(int argc, char* argv[]) {
  dim3 grid(3, 1, 1); // dim3 grid(3); と書いても同じ
  dim3 block(2, 1, 1); // dim3 block(2); と書いても同じ
  sample(grid, block);
}