CUDA C中定义全局变量的注意事项

C\C++中,可以通过在头文件中声明全局变量,或extern某个变量,使编译单元以外可以访问该全局变量。相对的,通过static限制全局变量只能用于所述的编译单元。
但在CUDA C中,千万要注意不能随便外露全局变量。这里的全局变量可能为常量内存、纹理内存、全局内存、共享内存。不同的内存由不同的特性,只有吃透了其原理,才能避免错误使用。
亲身踩坑:常量内存。
为了方便编码,将多个.cu文件中的常量内存变量都放在一个头文件里,这些变量即在.cu文件的kernel中用到,也在.cpp中的host端中函数中用到。这就导致一个问题,在.cpp中对其赋值,在.cu中无法取到正确的值。这是因为,cuda的常量内存是有限的,而这个限制条件是对应于运行中的kernel的,即,每个kernel所在的.cu文件(一个编译单元)均需要满足其占用的常量内存是不超出限制的。kernel只认在编译单元内定义的常量内存变量,在其它编译单元中定义的常量内存变量,即使名称相同,对于该kernnel也是无意义的。名称相同,只能骗过编译器(fk!为什么cuda 编译器不禁止该行为!)
正确的做法是,kernel用到的全局变量,通通定义在同一文件中,对这些变量的操作,一律通过函数接口进行,通过extern暴露这些函数即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值