目前我有一个使用以下纹理参考的内核(类型为unsigned char
的3d纹理):
texture<unsigned char, 3, cudaReadModeElementType> volumeTexture;
但是,我需要能够交换纹理的类型。我已经模仿了内核,因此它能够处理不同的类型。但是我在保持旧状态的同时无法交换纹理的类型或纹理本身(即能够同时处理unsigned char
和unsigned short
)。
这就是我想到使用纹理对象API的原因。但是,此API似乎不支持3d纹理。可用的资源类型为Linear
,Array
,MipMappedArray
和Pitch2D
。它们似乎都不是为3D纹理设计的。纹理对象API是否真的不支持3d纹理?
有任何变通方法吗?我可以使用2d纹理,其中切片只是堆叠在彼此之上。但是,512³条目卷(= 512 * 512 = 262,144)的必要高度超过了最大texture2d高度(我的设备上为65,536)。因此,我必须将切片彼此相邻并且彼此叠加,这将导致相当脏的地址计算,我想避免。
另一种方法是复制内核代码并交换纹理引用。但那不是一个非常干净的解决方案。引用本身可以以某种方式模板化吗?
答案 0 :(得分:1)
这个怎么样?
创建两个纹理参考:
texture<unsigned char, 3, cudaReadModeElementType> volumeTexture_char;
texture<unsigned short, 3, cudaReadModeElementType> volumeTexture_short;
然后,动态绑定到主机代码中所需的那个:
if (...) {
cudaBindTexture(0, volumeTexture_char, ...);
}
else {
cudaBindTexture(0, volumeTexture_short, ...);
}
然后,传入一个在kernel ::
中使用的标志my_kernel<<...>>(use_short, ...);