我有一些要处理的数据,每个块负责给定的数据子集。
由于我的应用程序的性质,我希望这些数据驻留在纹理内存中。但是,数据太大,无法放入单个纹理参考中。
如果我理解正确,我可以有多个纹理引用,但不能有纹理引用数组。
因为我需要在每个块中处理不同的数据子集,所以我在考虑做某事(在内核中),如
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)
也不太正确,因为我认为纹理引用是全局的而不是线程的私有。
还有其他选择吗?谢谢。
答案 0 :(得分:1)
如果可能,您应该尝试将纹理数据保存在单个纹理中,并根据需要对坐标应用一些转换以适应硬件限制。
否则,您可以通过预测从多个纹理参考中进行选择。只有非谓词指令才会实际生成纹理内存引用。
CUDA手册中的tex1dfetch_big.cu示例显示了如何执行此操作,以增加超出硬件支持的27位索引的寻址。
https://github.com/ArchaeaSoftware/cudahandbook/blob/checkpoint/texturing/tex1dfetch_big.cu