我需要使我的内核与主机通信。我尝试使用全局计数器(更好的方法已被广泛接受),但是以下代码始终显示为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;
}
答案 0 :(得分:3)
无论何时遇到CUDA代码问题,我强烈建议您使用proper CUDA error checking并通过echo
运行代码,在之前,请他人寻求帮助。即使您不理解错误输出,在您的问题中提供错误信息也将对那些试图帮助您的人有用。
如果您这样做,将收到报告cuda-memcheck
抛出无效的参数错误。
如果为该函数调用研究the documentation,则会看到第4个参数不是direction参数,而是offset参数。因此,提供cudaMemcpyFromSymbol
对于offset参数是不正确的。由于cudaMemcpyDeviceToHost
始终是设备->主机传输,因此提供direction参数是多余的,并且由于提供了默认参数,因此是不必要的。只需消除以下内容,您的代码就可以正确地为我工作:
cudaMemcpyFromSymbol