在多个cuda源文件(*.cu)里共用一个texture

在编写cuda程序中,用到了纹理texture。为了更好地组织代码结构,我想在一个cuda源文件(a.cu)中初始化texture,在另一个cuda源文件(b.cu)的核函数中使用texture。

最初的尝试是在头文件中使用extern声明纹理mTableTex2D。另外两个cuda源文件引用这个头文件,从而实现在两个cuda源文件中都能使用mTableTex2D的目的。

extern texture<float, cudaTextureType2D, cudaReadModeElementType> mTableTex2D;

 按照这种方式编写代码,发现在a.cu被正常初始化的mTableTex2D,在b.cu的核函数中引用时,数值居然全是0。

通过网上搜索和分析,上面的方法中,虽然两个cuda源文件都能使用在头文件中声明的外部纹理mTableTex2D,但是在不同的cuda源文件中,mTableTex2D被分配了不同的内存空间。所以导致在b.cu中引用的mTableTex2D并不是在a.cu中初始化的mTableTex2D。

为了解决这个问题,可以在一个cuda源文件中定义一个纹理,在另一个cuda源文件中外部声明相同名称的纹理。并且在编译选项中将Generate Relocatable Device Code选项设置为true(-rdc = true)。这样就能实现两个cuda源文件共用一个纹理了。

// a.cu中定义纹理
texture<float, cudaTextureType2D, cudaReadModeElementType> mTableTex2D;

// b.cu中声明外部纹理
extern texture<float, cudaTextureType2D, cudaReadModeElementType> mTableTex2D;

 在project的属性页,将CUDA C/C++ | Common | Generate Relocatable Device Code" 设置为 "是"。

 在project的属性页,将CUDA C/C++ | Common | Generate Relocatable Device Code" 设置为 "是"

参考:

1.CUDA extern texture declaration:c - CUDA extern texture declaration - Stack Overflow

2.CUDA6.5 Can't extern the value of texture:Cuda - CUDA6.5 Can't extern the value of texture

3.Configure CUDA Project Properties:Configure CUDA Project Properties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值