cudaMemcpyToSymbol出现问题

3

我正在尝试将数据复制到常量内存。但是由于我对cudaMemcpyToSymbol函数的使用误解,无法成功。我试图按照这里的说明来操作。

下面是一些代码:

__device__ __constant__ double var1;
__device__ __constant__ int var2;

int main(){

   //... some code here...

   double var1ToCopy = 10.1;
   int var2ToCopy = 1; 

   void * p1 = &var1ToCopy; 
   void * p2 = &var2ToCopy;

   cudaStatus = cudaMemcpyToSymbol((void*)&var1,p1,sizeof(double),0,cudaMemcpyHostToDevice);
   if (cudaStatus != cudaSuccess){
      return -1;
   }

   cudaStatus = cudaMemcpyToSymbol((void*)&var2,p2,sizeof(int),0,cudaMemcpyHostToDevice);
   if (cudaStatus != cudaSuccess){
      return -1;
   }


   //... and some code here...
}

我知道这是一个非常愚蠢的问题,但我花了几个小时搜索答案,却没有任何进展。

1个回答

4

符号名称不需要加上&符号。符号不同于指针或变量。

不要这样写:

cudaStatus = cudaMemcpyToSymbol((void*)&var1,p1,sizeof(double),0,cudaMemcpyHostToDevice);

请执行以下操作:

cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));

根据文档的说明,我还简化了上述调用,基于某些参数具有默认值的事实。这是一个完整的例子,围绕着你代码的修改版本工作(需要cc2.0+ GPU):
$ cat t626.cu
#include <stdio.h>

__device__ __constant__ double var1;
__device__ __constant__ int var2;

__global__ void kernel(){

  printf("%f\n", var1);
  printf("%d\n", var2);
}


int main(){


   double var1ToCopy = 10.1;
   int var2ToCopy = 1;
   cudaError_t cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));
   if (cudaStatus != cudaSuccess) {printf("fail1\n"); return 1;}

   cudaStatus = cudaMemcpyToSymbol(var2,&var2ToCopy,sizeof(int));
   if (cudaStatus != cudaSuccess) {printf("fail2\n"); return 1;}
   kernel<<<1,1>>>();
   cudaDeviceSynchronize();
   return 0;

}
$ nvcc -arch=sm_20 -o t626 t626.cu
$ ./t626
10.100000
1
$

清晰明了的答案。谢谢!顺便说一下,我尝试过 cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double)); 但是Visual Studio用红线划掉了它。这让我感到困惑,所以我没有尝试编译项目。现在我认为有时候不听从VS的建议是一个好习惯。 - artur me
同意。CUDA C/C++不是纯粹的C/C++,在这个上下文中,Intellisense是一个C/C++语法检查器。因此,它在处理CUDA时可能会有问题。这个特定问题(库函数调用的下划线)可能可以通过包含某些头文件来解决,但在一般情况下,我理解Intellisense并不总是完全满意CUDA代码,因此如果代码编译和运行正确,我个人不会花太多时间担心intellisense的红色下划线。其他人可能有不同的看法。 - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接