CUDA:为什么必须在文件范围内全局声明Texture引用?

时间:2016-10-28 04:51:56

标签: cuda

我试图了解纹理内存的工作原理。我在CUDA-By-Example书中读到了

  

必须在文件范围

全局声明纹理引用

我找不到原因。那么任何指点都可以通过一些细节来理解这一点?

正如njuffa在评论中所指出的,一些硬件限制导致这种限制强加于HLL级别,但这些限制是什么以及这种限制是如何产生的?

1 个答案:

答案 0 :(得分:1)

免责声明:根据我的图形编程经验,我在这里推测可能的原因。它不应被视为基本事实甚至是正确的。

这是多年来在着色器中完成的。

图形管道是状态机,每个状态转换都是全局的。当前快照反映了驱动程序和硬件的当前状态,并影响整个程序。 传统上,资源在着色器语言中以顶部的文件范围引用。无论是纹理缓冲区,采样器还是任何其他资源。从应用程序端,将适当的缓冲区绑定到适当的纹理槽并绑定采样器对象。然后,通常,您可以在任何着色器阶段中使用绑定资源。

我想,当CUDA开发出来时,没有人愿意改变高级代表性,但当然可能。例如,可以在任何范围内的任何地方声明纹理资源,但最后,从硬件的角度来看,资源绑定无论如何都将保持全局,并且在离开范围时需要未绑定或反弹到另一个资源。当然,这些指令可以由编译器插入。实现类似于C ++中的析构函数。

不改变API的原因可能是明确反映状态转换是全局的并且通常非常昂贵的事实,因此将其隐藏在API用户之外并不明智(出于性能原因)。