多次调用CUDA内核时出现cudaMemcpyFromSymbol错误

多次调用CUDA内核时出现cudaMemcpyFromSymbol错误,cuda,Cuda,我在GPU上运行一个循环,这样每次迭代后,我都会检查收敛条件是否满足。如果是,则退出while循环 __device__ int converged = 0; // this line before the kernel 内核内部: __global__ convergence_kernel() { if (convergence condition is true) { atomicAdd(&converged, 1); } } 在CPU上,我在循环中

我在GPU上运行一个循环,这样每次迭代后,我都会检查收敛条件是否满足。如果是,则退出while循环

__device__ int converged = 0; // this line before the kernel
内核内部:

__global__ convergence_kernel()
{
   if (convergence condition is true)
   {
      atomicAdd(&converged, 1);
   }
}
在CPU上,我在循环中调用内核:

int *convc = (int*) calloc(1,sizeof(int));
//converged = 0; //commenting as this is not correct as per Robert's suggestion
while(convc[0]< 1)
{
    foo_bar1<<<num_blocks, threads>>>(err, count);
    cudaDeviceSynchronize();
    count += 1;

    cudaMemcpyFromSymbol(convc, converged, sizeof(int));
}
int*convc=(int*)calloc(1,sizeof(int));
//收敛=0//根据罗伯特的建议,这是不正确的
while(convc[0]<1)
{
foo_bar1(错误,计数);
cudaDeviceSynchronize();
计数+=1;
cudaMemcpyFromSymbol(convc,converge,sizeof(int));
}
这里,如果条件为真,我的convc[0]=1,但是,当我打印这个值时,我总是看到一个随机值,例如conv=3104,conv=17280,conv=17408,等等


有人能告诉我我的
cudaMemcpyFromSymbol
操作缺少什么吗?我错过了什么吗??提前感谢。

当您在
convc
中读取
converge
值时,我对您为什么会收到垃圾的最佳猜测是您没有在任何地方初始化
converge
。不能在主机代码中这样做:

converged = 0;
__device__ int converged = 0; // this line before the kernel
您可以将您的声明更改为:

converged = 0;
__device__ int converged = 0; // this line before the kernel

或者您也可以使用
cudaMemcpyToSymbol
,它实际上与您似乎已经意识到的
cudamemcpyfromsmbol
功能相反。

cuda memcheck通过时没有错误!您是否初始化过聚合的
变量?你当然不能用
converged=0。您认为
converged=0
在主机代码中起什么作用?@Talonmes如果
converged=0
则再次调用内核foo_bar1@robert crovella如何初始化设备变量?当然,您没有这样的语句:
if(converged=0)无论如何都会被破坏,所以说“如果
converged=0
那么再次调用内核foo_bar1”毫无意义,并且与您显示的代码不一致。您显示的代码非常不连贯。要初始化
\uuuu设备\uuuu
变量,一种方法是使用。您还可以静态初始化它:
\uuuuu设备\uuuuu int converged=0我已在内核中将设备变量初始化为0。我仍然看到这个错误。我的标志是:
NVCCFLAGS=-O3-使用快速数学-m64-ptxas选项=-v-lineinfo
GENCODE\u SM20:=-GENCODE-arch=compute\u 20,code=sm\u 20 GENCODE\u SM30:=-GENCODE-arch=compute\u 30,code=sm\u 30-GENCODE-arch=compute\u 35,code=sm\u 35 GENCODE\u标志:=$(GENCODE\u SM30)
然后我建议提供一个简短、完整的,重现问题的可编译代码。您还应该使用
cuda memcheck
添加并运行代码。