我想在一些内核启动时读取一些纹理。文档说这些必须在全球范围内定义。麻烦的是我想用不同的纹理源调用相同的内核函数(非常复杂)。
texture<unsigned char, 2, cudaReadModeElementType> g_tex_a;
texture<unsigned char, 2, cudaReadModeElementType> g_tex_b;
__global__ void gpu_kernel_1()
{
// long complicated kernel
foo = tex2D(g_tex_a, x,y);
}
__global__ void gpu_kernel_2()
{
// long complicated kernel
bar = tex2D(g_tex_a, x,y);
}
main()
{
gpu_kernel_1<<<grid, block>>>();
gpu_kernel_2<<<grid, block>>>();
}
是不是可以通过tex2D将一个纹理传递到内核的方法,例如: g_tex_a还是g_tex_b?看起来编译器需要在编译时知道纹理引用。我希望能够重用gpu_kernel_1和gpu_kernel_2的代码来处理不同的纹理。
我真的不明白主机和设备代码使用纹理参考对象的方式。目前,我有一个可怕的解决方案,复制每个内核的所有代码,唯一的变化是tex2D函数使用不同的纹理参考,例如gpu_kernel_1_with_tex_a(),gpu_kernel_1_with_tex_b()。
还有其他解决方案吗?感谢。
答案 0 :(得分:2)
除了纹理参考API,CUDA 5.0现在还支持纹理对象API。使用这个新API,您现在可以在本地定义纹理对象并将其作为函数参数传递给内核,而不是全局定义纹理引用。请查看CUDA编程指南(第3.2.10.1.1节)。
答案 1 :(得分:1)
在使用纹理参考之前,必须将其映射到内存,例如使用cudaBindTextureToArray()。您可以在映射中决定要对哪些数据进行操作。