我试图了解纹理内存的工作原理。我在CUDA-By-Example书中读到了
必须在文件范围
全局声明纹理引用
我找不到原因。那么任何指点都可以通过一些细节来理解这一点?
正如njuffa在评论中所指出的,一些硬件限制导致这种限制强加于HLL级别,但这些限制是什么以及这种限制是如何产生的?
答案 0 :(得分:1)
免责声明:根据我的图形编程经验,我在这里推测可能的原因。它不应被视为基本事实甚至是正确的。
这是多年来在着色器中完成的。
图形管道是状态机,每个状态转换都是全局的。当前快照反映了驱动程序和硬件的当前状态,并影响整个程序。 传统上,资源在着色器语言中以顶部的文件范围引用。无论是纹理缓冲区,采样器还是任何其他资源。从应用程序端,将适当的缓冲区绑定到适当的纹理槽并绑定采样器对象。然后,通常,您可以在任何着色器阶段中使用绑定资源。
我想,当CUDA开发出来时,没有人愿意改变高级代表性,但当然可能。例如,可以在任何范围内的任何地方声明纹理资源,但最后,从硬件的角度来看,资源绑定无论如何都将保持全局,并且在离开范围时需要未绑定或反弹到另一个资源。当然,这些指令可以由编译器插入。实现类似于C ++中的析构函数。
不改变API的原因可能是明确反映状态转换是全局的并且通常非常昂贵的事实,因此将其隐藏在API用户之外并不明智(出于性能原因)。