增量和访问全局计数器CUDA

时间:2018-10-22 16:16:58

标签: cuda

我需要使我的内核与主机通信。我尝试使用全局计数器(更好的方法已被广泛接受),但是以下代码始终显示为0。我在做什么错? (我尝试了评论和未评论的方式。)

#include <stdio.h>
#include <cuda_runtime.h>

//__device__ int count[1] = {0};
__device__ int count = 0;

__global__ void inc() {
    //count[0]++;
    atomicAdd(&count, 1);
}

int main(void) {
    inc<<<1,10>>>();
    cudaDeviceSynchronize();
    //int *c;
    int c;
    cudaMemcpyFromSymbol(&c, count, sizeof(int), cudaMemcpyDeviceToHost);
    printf("%d\n", c);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

无论何时遇到CUDA代码问题,我强烈建议您使用proper CUDA error checking并通过echo运行代码,之前,请他人寻求帮助。即使您不理解错误输出,在您的问题中提供错误信息也将对那些试图帮助您的人有用。

如果您这样做,将收到报告cuda-memcheck抛出无效的参数错误。

如果为该函数调用研究the documentation,则会看到第4个参数不是direction参数,而是offset参数。因此,提供cudaMemcpyFromSymbol对于offset参数是不正确的。由于cudaMemcpyDeviceToHost始终是设备->主机传输,因此提供direction参数是多余的,并且由于提供了默认参数,因此是不必要的。只需消除以下内容,您的代码就可以正确地为我工作:

cudaMemcpyFromSymbol