您不需要符号名称上的&符号。符号与指针或变量不同。
而不是这个:
cudaStatus = cudaMemcpyToSymbol((void*)&var1,p1,sizeof(double),0,cudaMemcpyHostToDevice);
Do this:
cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));
我还根据某些参数具有默认值的事实简化了上述调用,如中所示文档 http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1g2a229a704ade54887f7784e2e2dbd895.
这是一个围绕代码修改版本的完整示例(需要 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
$