所以我开始使用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,因此我无法实际访问实际的机器。
答案 0 :(得分:1)
两个问题,都在同一行代码中。
*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;