我已经读过很多次关于 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;
}
(我已经评论了所有不重要的行,只是让行调用函数转置)
我已经了解函数 main 中的所有行,除了调用函数的行tranpose
。当我说:当我们调用函数时transpose<<<gDim, bDim>>>(Md, Bd, WIDTH)
,CUDA 会自动将数组的每个元素分配到一个线程(和块)中,当我们调用“一次性”转置时,CUDA 将在线程上运行gDim * bDim
时间转置。gDim * bDim
这一点让我感到非常沮丧,因为它不喜欢java中的多线程,当我使用:(请告诉我。
谢谢 :)