2

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

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

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

由于我需要处理每个块中的不同数据子集,因此我正在考虑(在内核中)做一些事情,例如

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)

似乎也不完全正确,因为我相信纹理引用是全局的,而不是线程私有的。

还有其他选择吗?谢谢你。

4

1 回答 1

1

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

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

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

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

于 2012-08-24T00:31:57.070 回答