从CUDA开始,关于设备代码

时间:2016-02-29 07:41:59

标签: cuda

所以我开始使用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,因此我无法实际访问实际的机器。

1 个答案:

答案 0 :(得分:1)

两个问题,都在同一行代码中。

*a = blockIdx.x*threadIdx.x*blockDim.x;;

1。你所有的线程都写到同一个位置。假设您想要一个包含1-64的数组,这不是您想要做的。你想要这样的东西:

a[id] = id;
  1. 你的算术错了。如果你想让你的块和线程映射到1-64,你可以使用它来代替

    blockIdx.x * blockDim.x + threadIdx.x;

  2. 将所有内容组合在一起就可以做到这一点:

    int id= blockIdx.x*blockDim.x+threadIdx.x;
    a[id] = id;