我正在尝试在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纹理)。我正在寻找一种模式或设计,因为我不确定解决问题的最佳方法。
答案 0 :(得分:1)
使用纹理对象而不是纹理参考。使用纹理对象,所有纹理参数都是在运行时定义的,而不是在编译时定义的。
如果你需要坚持纹理引用,另一种可能性是包装纹理提取调用,如下所示:
template <typename T>
__device__ T myTextureFetch(float x, float y, float z)
{
return tex3D(tex_ref_to_T_type, x, y, z);
}
(代码是在浏览器中编写的,没有检查......)对于您要使用的每种类型,您需要其中一个短包装...
此外,如果您只需要将纹理作为全局内存的缓存读取,请检查__restrict__
关键字是否更适合您的需求。