CUDAについてわからないことがあります。スレッドと呼ばれる「仮想」変数があることを理解しています。
カーネルをプログラミングするとき、スレッド変数は自動的に実行され、カーネルはスレッドごとに何度も実行されます。(ここまでで正解?)
今、私がこのようなものをプログラムすると:
for (int i = 0 ; i<100; i++){
....
}
スレッドごとに何度も実行されますか? それとも一度だけ?
CUDAについてわからないことがあります。スレッドと呼ばれる「仮想」変数があることを理解しています。
カーネルをプログラミングするとき、スレッド変数は自動的に実行され、カーネルはスレッドごとに何度も実行されます。(ここまでで正解?)
今、私がこのようなものをプログラムすると:
for (int i = 0 ; i<100; i++){
....
}
スレッドごとに何度も実行されますか? それとも一度だけ?
カーネル関数 (接頭辞 ) に入れるすべてのコードは、__global__
すべての同時スレッド (スレッドの質量はカーネルの起動時に指定されます) によって実行されます。カーネルの本体では、グローバル識別子またはローカル識別子に従ってスレッドの計算を区別できます。
1Dの場合(潜在的にあなたのケース):
ローカル識別子:int tid = threadIdx.x
グローバル識別子:int tid = blockIdx.x*blockDim.x + threadIdx.x
さらなる説明:
このカーネルがある場合:
__global__ void dummy(int *out){
for(int i=0; i<100; i++){
...
}
}
4096 の同時スレッドを起動する必要がある場合は、スレッドをスレッド ブロックに編成する必要があります (局所性を活用し、ハードウェアの制限に対処するため)。4096 スレッドを 256 スレッドのスレッド ブロックに分割すると、次の方法でこの大量のスレッドを実行してdummy
関数を実行できます。
dummy<<<4096/256, 256>>>(output_array);
このdummy
関数は、ハードウェア (実際の GPU) に応じて、4096 スレッド (それぞれに 1 つずつ) でシリアルまたはパラレルで実行されます。すべてのスレッドが並行して実行されていると想定する必要があります。上記のように、スレッド識別子 (グローバル) を使用してスレッドの計算を区別できます。