CUDA模板内核和纹理
CUDA template kernels and textures
我正在努力在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类型的全局内存上操作,因此,短数组,int数组等。来执行任何类型的拷贝。我想将此移动到使用其他内核的纹理内存,但是,我不确定如何才能正确访问正确的纹理。我已经提供了可用的全局纹理引用,适用于我希望支持的每种类型,并且我有逻辑来绑定CPU端的正确纹理。我的问题是,什么是正确的方法来告诉我的内核纹理参考使用在tex2D函数调用;当然,这个决定取决于内核的模板参数(例如,我应该使用float纹理,还是int纹理)。我正在寻找一个模式或设计遵循,因为我不确定最好的方法来解决这个问题。
使用纹理对象而不是纹理引用。使用纹理对象,所有纹理参数都在运行时定义,而不是在编译时定义。
如果你需要坚持纹理引用,另一种可能性是像这样包装纹理获取调用:
template <typename T>
__device__ T myTextureFetch(float x, float y, float z)
{
return tex3D(tex_ref_to_T_type, x, y, z);
}
(代码是在浏览器中编写的,没有检查…)对于您想要使用的每种类型,您都需要这些短包装器中的一个…
此外,如果您只需要纹理作为全局内存的缓存读取,请检查__restrict__
关键字是否更适合您的需求。
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- CUDA内核和数学函数的显式命名空间
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- C++内核出现Jupyter笔记本错误
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 使用 CUDA 和纹理进行图像减法
- 内存围栏是否涉及内核
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- 3D纹理的OpenGL高斯内核
- CUDA模板内核和纹理