0

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

texture<unsigned char, 3, cudaReadModeElementType>  volumeTexture;

但是,我需要能够交换纹理的类型。我已经对内核进行了模板化,因此它能够处理不同的类型。但是我无法在保持旧状态的同时交换纹理的类型或纹理本身(即能够同时处理unsigned charunsigned short

这就是我想到使用纹理对象 API 的原因。但是,此 API 似乎不支持 3d 纹理。可用的资源类型是LinearArray和。它们似乎都不是为 3d 纹理设计的。纹理对象 API 真的根本不支持 3d 纹理吗?MipMappedArrayPitch2D

有什么解决方法吗?我可以使用 2d 纹理,其中切片只是堆叠在一起。但是,512³ 条目体积(=512*512=262,144)的必要高度超过了最大 texture2d 高度(我的设备上为 65,536)。因此,我必须将切片彼此相邻和彼此叠加,这将导致我想避免的非常脏的地址计算。

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

4

1 回答 1

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, ...);
}

然后,传入一个标志,在内核中使用哪个标志::

my_kernel<<...>>(use_short, ...);
于 2013-12-03T18:00:10.680 回答