GPUプログラミング
上のCUDAのカーネルで「if (i < n)」を入れている理由として正しいものはどれか。
__global__ void add(float *c, const float *a,
const float *b, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
c[i] = a[i] + b[i];
}
- Aスレッドの総数が要素数より多いとき、余ったスレッドが配列の範囲の外を読み書きしないようにするため
- B足し算の結果がnを超えないようにするため
- CGPUの速さを2倍にするため
答えと解説を見る
正解:A. スレッドの総数が要素数より多いとき、余ったスレッドが配列の範囲の外を読み書きしないようにするため
スレッドはブロック単位で起動するので、要素数がブロックの大きさの倍数でないと、スレッドの総数が要素数を上回ります。番号を確かめずに書き込むと、確保した配列の外のメモリを壊したり、不正なアクセスでエラーになったりします。「i < n」の確認は、GPUのカーネルを書くときのほぼ決まった形です。
- A. 正しい。ブロックの数を切り上げたために生じる余りに対処します。
- B. 値の大きさではなく、番号の範囲を確かめています。
- C. 速さのためではなく、正しさのためです。