CUDA のスレッド/ブロックと配列について何度も読んだことがありますが、CUDA がカーネル関数のマルチスレッドの実行を開始する方法とタイミングをまだ理解していません。ホストがカーネル関数を呼び出すとき、またはカーネル関数内。
たとえば、この例があります。配列を単純に転置するだけです。(したがって、この配列から別の配列に値をコピーするだけです)。
__global__
void transpose(float* in, float* out, uint width) {
uint tx = blockIdx.x * blockDim.x + threadIdx.x;
uint ty = blockIdx.y * blockDim.y + threadIdx.y;
out[tx * width + ty] = in[ty * width + tx];
}
int main(int args, char** vargs) {
/*const int HEIGHT = 1024;
const int WIDTH = 1024;
const int SIZE = WIDTH * HEIGHT * sizeof(float);
dim3 bDim(16, 16);
dim3 gDim(WIDTH / bDim.x, HEIGHT / bDim.y);
float* M = (float*)malloc(SIZE);
for (int i = 0; i < HEIGHT * WIDTH; i++) { M[i] = i; }
float* Md = NULL;
cudaMalloc((void**)&Md, SIZE);
cudaMemcpy(Md,M, SIZE, cudaMemcpyHostToDevice);
float* Bd = NULL;
cudaMalloc((void**)&Bd, SIZE); */
transpose<<<gDim, bDim>>>(Md, Bd, WIDTH); // CALLING FUNCTION TRANSPOSE
cudaMemcpy(M,Bd, SIZE, cudaMemcpyDeviceToHost);
return 0;
}
(重要ではないすべての行にコメントしました。関数を呼び出す行を転置するだけです)
function を呼び出す行を除く、関数 main のすべての行を理解しましたtranpose
。function を呼び出すとtranspose<<<gDim, bDim>>>(Md, Bd, WIDTH)
、CUDA は自動的に配列の各要素を 1 つのスレッド (およびブロック) に割り当てます。また、「1 回限り」の転置を呼び出すと、CUDA はスレッドgDim * bDim
上で実行時間を転置しgDim * bDim
ます。
Javaのマルチスレッドが苦手なので、この点がとてももどかしいです:(教えてください。
ありがとう :)