麻烦与cudaMemcpyToSymbol

时间:2014-12-27 21:12:45

标签: cuda nvidia

我试图复制到常量内存。但我不能因为我对cudaMemcpyToSymbol函数的使用有误解。我试图关注this

这是一些代码

__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 个答案:

答案 0 :(得分:3)

您不需要符号名称上的&符号。符号与指针或变量不同。

而不是:

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

这样做:

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

我还基于以下事实简化了上述调用:某些参数具有the documentation中所示的默认值。

这是一个围绕修改后的代码版本的完整工作示例(需要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
$
相关问题