CUDA中的多个纹理引用 - 在内核时间中使用

时间:2012-08-22 22:04:26

标签: cuda textures

我有一些要处理的数据,每个块负责给定的数据子集。

由于我的应用程序的性质,我希望这些数据驻留在纹理内存中。但是,数据太大,无法放入单个纹理参考中。

如果我理解正确,我可以有多个纹理引用,但不能有纹理引用数组。

因为我需要在每个块中处理不同的数据子集,所以我在考虑做某事(在内核中),如

while(counter < 10000) {

 if(blockIdx.x == 0)
     foo = tex2D(tex0, x, y);

 else if(blockIdx.x == 1)
     foo = tex2D(tex1, x, y);

 ...

}

但不仅看起来不好,我也不确定我是否会因分歧问题而招致。

做类似

的事情
texture<int, 2, cudaReadModeElementType> ref;

(..)

/* kernel code from now on */

if(blockIdx.x == 0)
    ref = tex0;

else if(blockIdx.x == 1)
    ref = tex1;

...

while(counter < 10000)
    foo = tex2D(ref, x, y)

也不太正确,因为我认为纹理引用是全局的而不是线程的私有。

还有其他选择吗?谢谢。

1 个答案:

答案 0 :(得分:1)

如果可能,您应该尝试将纹理数据保存在单个纹理中,并根据需要对坐标应用一些转换以适应硬件限制。

否则,您可以通过预测从多个纹理参考中进行选择。只有非谓词指令才会实际生成纹理内存引用。

CUDA手册中的tex1dfetch_big.cu示例显示了如何执行此操作,以增加超出硬件支持的27位索引的寻址。

https://github.com/ArchaeaSoftware/cudahandbook/blob/checkpoint/texturing/tex1dfetch_big.cu