是否有一种解决方法,在CUDA中不灵活地使用纹理引用

时间:2012-03-14 21:49:59

标签: textures cuda

我想在一些内核启动时读取一些纹理。文档说这些必须在全球范围内定义。麻烦的是我想用不同的纹理源调用相同的内核函数(非常复杂)。

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()。

还有其他解决方案吗?感谢。

2 个答案:

答案 0 :(得分:2)

除了纹理参考API,CUDA 5.0现在还支持纹理对象API。使用这个新API,您现在可以在本地定义纹理对象并将其作为函数参数传递给内核,而不是全局定义纹理引用。请查看CUDA编程指南(第3.2.10.1.1节)。

答案 1 :(得分:1)

在使用纹理参考之前,必须将其映射到内存,例如使用cudaBindTextureToArray()。您可以在映射中决定要对哪些数据进行操作。