这个问题调试了好久,也从网上查了不少资料,但一直没找到解决方法,直到最近修改完成。因为查找解决方案花费很大功夫,为了方便,特此记录。
下面是问题描述。
我写一个cuda程序需要用到__constant__常量,而在host端给__constant__常量赋值的函数是cudaMemcpyToSymbol()函数。我在文件中声明了2个__constant__常量和3个__constant__二维数组,在host函数中把数据从host端传递到device端。为了更好说明,下面附上关键代码:
// ...
// 声明
__constant__ double cd;
__constant__ int ci;
__constant__ double ca1[4][4];
__constant__ double ca2[4][4];
__constant__ double ca3[4][4];
void init()
{
// 声明host端与__constant__对应变量并赋值
// 数据传递
size_t sized = sizeof(double);
sizei = sizeof(int);
cudaMemcpyToSymbol(&cd, &hd, sized, 0, cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(&ci, &hi, sizei, 0, cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(ca1, ha1, sized*4*4, 0, cudaMemcpyHostToDevice);
// ca2和ca3的数据传递...
}
之后在kernel函数中使用ca1,ca2,ca3(二维数组)的时候都没问题,但等到使用cd和ci的时候,取值都是0。经过检查,是使用cudaMemcpyToSymbol函数的时候出了问题。
// ...
cudaError_t err;
err = cudaMemcpyToSymbol(&cd, &hd, sized, 0, cudaMemcpyHostToDevice);
printf("%d: %s.\n", err,