Cuda 三维纹理对象

Cuda 三维纹理对象,cuda,textures,3d-texture,Cuda,Textures,3d Texture,目前,我有一个内核,它使用以下纹理引用(类型为unsigned char)的3d纹理: 纹理体纹理; 但是,我需要能够交换纹理的类型。我已经对内核进行了模板化,以便它能够处理不同的类型。但我无法在保持旧状态的同时交换纹理的类型或纹理本身(即能够同时处理无符号字符和无符号短字符) 这就是我想到使用纹理对象API的原因。但是,此API似乎不支持3d纹理。可用的资源类型有Linear、Array、MipMappedArray和Pitch2D。它们似乎都不是为3d纹理设计的。纹理对象API真的不支持3

目前,我有一个内核,它使用以下纹理引用(类型为
unsigned char
)的3d纹理:

纹理体纹理;
但是,我需要能够交换纹理的类型。我已经对内核进行了模板化,以便它能够处理不同的类型。但我无法在保持旧状态的同时交换纹理的类型或纹理本身(即能够同时处理
无符号字符
无符号短字符

这就是我想到使用纹理对象API的原因。但是,此API似乎不支持3d纹理。可用的资源类型有
Linear
Array
MipMappedArray
Pitch2D
。它们似乎都不是为3d纹理设计的。纹理对象API真的不支持3d纹理吗

有什么解决办法吗?我可以使用2d纹理,其中切片只是堆叠在彼此的顶部。但是,512³入口卷(=512*512=262144)的必要高度超过了最大纹理2D高度(在我的设备上为65536)。因此,我必须将这些片组织在彼此的旁边和顶部,这将导致非常脏的地址计算,我希望避免这种情况

另一种方法是复制内核代码并交换纹理引用。但这不是一个非常干净的解决方案。引用本身可以被模板化吗?

这个怎么样

创建两个纹理参照:

texture<unsigned char, 3, cudaReadModeElementType>  volumeTexture_char;
texture<unsigned short, 3, cudaReadModeElementType>  volumeTexture_short;
然后,传入一个在内核中使用的标志:

my_kernel<<...>>(use_short, ...);
my_内核(使用_-short,…);

好的,这是可能的。让我们看看是否还有其他选择。
if (...) {
   cudaBindTexture(0, volumeTexture_char, ...);
}
else {
   cudaBindTexture(0, volumeTexture_short, ...);
}
my_kernel<<...>>(use_short, ...);