【发布时间】:2015-10-24 22:54:57
【问题描述】:
我正在尝试在 CUDA 中实现使用纹理内存的通用内核,但遇到了问题。
template<typename T>
__global__(void){
tex3D( // correct texture for type T )
}
// host pseudo code
template <typename T>
__host__(void){
if(T == 'short')
bind(short_texture);
else if (T == 'int')
bind(int_texture);
invoke_kernel<>(); // <--- How do I tell the kernel which texture was just bound
}
基本上我需要根据模板参数 T 访问正确绑定的纹理。我知道我可以做一些复杂的事情,例如编写和调用不同的内核,或者可能传入一个指示哪个纹理的变量使用。我更喜欢更清洁的解决方案。有什么建议?我宁愿避免为很小的事情复制内核,因为这会破坏模板的目的。
编辑:
为了澄清,我有模板内核,比如数据复制内核,它在 T 类型的全局内存上运行。Ergo、短数组、int 数组等。为了执行任何类型的副本。我想移动它以将纹理内存用于其他内核,但是我不确定如何正确访问正确的纹理。我已经提供了可用的全局纹理引用,适用于我希望支持的每种类型,并且我有逻辑来绑定 CPU 端的正确纹理。我的问题是,告诉我的内核在 tex2D 函数调用中使用哪个纹理引用的正确方法是什么?决定当然取决于该内核的模板参数(即我应该使用浮点纹理还是 int 纹理)。我正在寻找可以遵循的模式或设计,因为我不确定解决问题的最佳方法。
【问题讨论】:
-
你遇到什么问题;什么是错误信息,等等等等。
-
我相信问题应该很清楚 - 我没有遇到任何错误消息,因为我处于设计阶段,而不是实施阶段。我想要一个内核,它可以使用几种不同纹理中的一种,但我不知道如何告诉它使用哪一种。
-
不清楚如何从
T或内核中获取纹理。 -
我不清楚如何访问内核中正确绑定的纹理。如果 CPU 能够绑定 10 个纹理中的一个,我需要一种方法来告诉内核碰巧绑定了哪个。