关于cudaMemcpyToSymbol()

拷贝数组没问题:
device double d_a[2];

int main()
{
double h_a[2];

h_a[0]=0.1;
h_a[1]=0.2;

cudaMemcpyToSymbol(d_a, h_a, 2*sizeof(double));

return 0;
}

但拷贝变量就不行:
device double d_a;
int main()
{
double h_a;

h_a=0.1;;

cudaMemcpyToSymbol(&d_a, &h_a, sizeof(double));

return 0;
}
运行也不出错,但是如果放一个kernel进去,将d_a打印出来显示是0

求大神指导!

补充一句,在第二个程序中调用
void checkCUDAError()
{
cudaError_t err = cudaGetLastError();
if( cudaSuccess != err)
{
fprintf(stderr, “Cuda error: %s.\n”, cudaGetErrorString( err) );
exit(EXIT_FAILURE);
}
}
出现"Cuda error: invalid device symbol."
在第一个程序调用时是正常的

楼主您好,

cudaMemcpyToSymbol(d_a, …); 因为实际上是在host code中将device variable作为参数,这里的d_a实际上将被cuda编译器做特殊处理的。

您这样改写就正确了:
cudaMemcpyToSymbol(d_a, &h_a, sizeof(double));

也就是说,无论d_a是数组还是单个变量,您都不需要使用&符号。您只需要直接给出名字即可。
(而不是您想象的将d_a取地址)。

感谢来访,周末愉快。

嗯,按版主说的做确实可OK了,感谢版主