HLSL:内存与结构化缓冲区合并

时间:2012-08-08 07:56:23

标签: memory buffer hlsl coalescing

我目前正在研究受全局内存带宽限制的HLSL着色器。我需要在每个内存事务中合并尽可能多的内存。根据NVIDIA针对CUDA和OpenCL的指导原则(DirectCompute文档非常缺乏),计算能力2.0的最大内存事务大小为128字节,而可访问的最大字是16字节。当经线中的线程访问的数据落入相同的128字节段时,可以合并全局存储器访问。考虑到这一点,如果结构大于16个字节,结构化缓冲区不会对内存合并产生不利影响吗?

假设您有两个float4的结构,将它们称为A和B.您可以访问A或B,但不能同时访问非发散warp中发出的指令的单个内存事务。内存的布局看起来像ABABABAB。如果您尝试将连续结构读入共享内存,那么通过以这种方式存储数据不会浪费内存带宽吗?例如,您只能访问A元素,但硬件会合并内存事务,因此它会读取128个字节的连续数据,其中一半是B元素。从本质上讲,你浪费了一半的内存带宽。存储像AAAABBBB这样的数据不是更好吗,AAAABBBB是缓冲结构而不是结构缓冲区?或者这是由L1缓存处理的,其中B元素被缓存,因此当下一条指令要读取B元素时,您可以更快地访问它们?唯一的其他解决方案是使偶数编号的线程访问A元素,而奇数编号的元素访问B元素。

如果确实浪费了内存带宽,我不明白为什么有人会使用结构化缓冲区而不是为了方便。希望我能够很好地解释这一点,以便有人能理解。我会在NVIDIA开发者论坛上问这个问题,但我认为他们仍然失败了。当我尝试运行NVIDIA Nsight帧分析器时,Visual Studio会一直崩溃,因此很难看到内存带宽如何受到数据存储方式变化的影响。 P.S.,有没有人能够成功运行NVIDIA Nsight帧分析器?

0 个答案:

没有答案