【问题标题】:CUDA template kernels and texturesCUDA 模板内核和纹理
【发布时间】: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 个纹理中的一个,我需要一种方法来告诉内核碰巧绑定了哪个。

标签: c++ templates cuda


【解决方案1】:

使用纹理对象而不是纹理引用。使用纹理对象,所有纹理参数都是在运行时而不是在编译时定义的。

如果您需要坚持使用纹理引用,另一种可能性是像这样包装纹理获取调用:

template <typename T>
__device__  T myTextureFetch(float x, float y, float z)
{
    return tex3D(tex_ref_to_T_type, x, y, z);
}

(代码是在浏览器中编写的,无需检查...)对于您要使用的每种类型,您都需要这些短包装器之一...

此外,如果您只需要将纹理作为全局内存的缓存读取,请检查 __restrict__ 关键字是否更适合您的需求。

【讨论】:

  • 我确实喜欢纹理对象,但是我想支持 fermi GPU,因此必须使用不同的解决方案。对于您的方法,这将需要对我所有支持的类型进行模板专业化,不是吗?如果我想要一个内核使用两个纹理,两者都是“短”类型怎么办。然后我不能再指出要抓取哪个纹理了。
  • 你需要对你想要使用的每个纹理进行专业化。如果它们具有相同的类型,则需要另一个鉴别器,例如另一个模板参数。
猜你喜欢
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
相关资源
最近更新 更多