cudaMemcpyToSymbol的问题

cudaMemcpyToSymbol的问题,cuda,nvidia,Cuda,Nvidia,我正试图复制到恒定的内存中。但是我不能,因为我对cudaMemcpyToSymbol函数的用法有误解。我正试着跟着 这里有一些代码 __device__ __constant__ double var1; __device__ __constant__ int var2; int main(){ //... some code here... double var1ToCopy = 10.1; int var2ToCopy = 1; void * p1 = &a

我正试图复制到恒定的内存中。但是我不能,因为我对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...
}

我知道这是一个非常愚蠢的问题,但我已经花了几个小时在谷歌上搜索答案,但没有任何成功。

您不需要在符号名称上添加符号。符号与指针或变量不同

与此相反:

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

cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));
我还简化了上面的调用,因为一些参数具有默认值,如中所示

下面是一个关于代码修改版本的完整示例(需要cc2.0+GPU):

$cat t626.cu
#包括
__装置常数双变量1;
__设备;
__全局无效内核(){
printf(“%f\n”,var1);
printf(“%d\n”,var2);
}
int main(){
双var1ToCopy=10.1;
int var2ToCopy=1;
cudaError_t cudaStatus=cudaMemcpyToSymbol(var1和var1ToCopy,sizeof(double));
如果(cudaStatus!=cudaSuccess){printf(“fail1\n”);返回1;}
cudaStatus=cudaMemcpyToSymbol(var2和var2ToCopy,sizeof(int));
if(cudaStatus!=cudaSuccess){printf(“fail2\n”);返回1;}
内核();
cudaDeviceSynchronize();
返回0;
}
$nvcc-arch=sm_20-o t626 t626.cu
美元/t626
10.100000
1.
$

答案清晰而精彩。非常感谢。顺便说一句,我试过
cudaStatus=cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double))但VisualStudio在它下面加了红线。它把我弄糊涂了,所以我并没有尝试编译这个项目。现在我认为有时候不去听VS说的是一个很好的做法。CUDA C/C++不是纯粹的C/C++,在这种情况下,Intellisense是一个C/C++语法检查器。因此,CUDA可能存在问题。这个特殊的问题(在库函数调用的下面加下划线)可能是您可以通过包含某些头文件来解决的问题,但在一般情况下,我的理解是Intellisense不会总是完全满意CUDA代码,因此,如果代码编译和运行正确,我个人不会花太多时间担心intellisense红色下划线。其他人可能有不同的看法。
$ 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
$