从CUDA开始,关于设备代码

问题描述 投票:0回答:1

我正在开始进行 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,因此我无法物理访问实际机器。

cuda nvidia
1个回答
1
投票

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

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

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

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

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

将所有内容放在一起,您可以做到这一点:

int id= blockIdx.x*blockDim.x+threadIdx.x;
a[id] = id;
© www.soinside.com 2019 - 2024. All rights reserved.