我正在开始进行 CUDA 编程,我有一个关于内核编码部分的问题。下面是我正在尝试的代码。
我试图让它使用 8 个块(每个块有 8 个线程)打印数字 1-64。可以看到该程序正在使用 8 个线程块,每块块 8 个线程。
问题是我的输出大得不可思议,而且每次都不同,而且只有一个值。
#include <stdio.h>
__global__
void start(int *a){
*a = blockIdx.x*threadIdx.x*blockDim.x;;
}
int main(){
int a;
int *d_a;
int size = 64*sizeof(int);
cudaMalloc((void**)&d_a,size);
cudaMemcpy(d_a,&a,size, cudaMemcpyHostToDevice);
start<<<8,8>>>(d_a);
cudaMemcpy(&a,d_a,size,cudaMemcpyDeviceToHost);
cudaFree(d_a);
printf("%d\n",a);
return 0;
}
编辑:好吧,这听起来很愚蠢,但是我如何检查代码是否确实发送到 GPU 卡?我怀疑内核代码根本没有被处理。可能是因为 GPU 关闭了或者其他什么原因。我正在使用 PUTTY,因此我无法物理访问实际机器。
两个问题,都在同一行代码中。
*a = blockIdx.x*threadIdx.x*blockDim.x;;
1.您的所有线程都写入同一位置。假设您想要一个包含 1-64 的数组,这不是您想要做的。你想要这样的东西:
a[id] = id;
你的算术是错误的。如果您希望块和线程映射到 1-64,您可以使用它来代替
blockIdx.x*blockDim.x+threadIdx.x;
将所有内容放在一起,您可以做到这一点:
int id= blockIdx.x*blockDim.x+threadIdx.x;
a[id] = id;