拷贝数组没问题:
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取地址)。
感谢来访,周末愉快。