cudaMemcpyToSymbol()的invalid device symbol问题

这个问题调试了好久,也从网上查了不少资料,但一直没找到解决方法,直到最近修改完成。因为查找解决方案花费很大功夫,为了方便,特此记录。

下面是问题描述。

我写一个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, 
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值