Memory HLSL:使用结构化缓冲区的内存聚合

Memory HLSL:使用结构化缓冲区的内存聚合,memory,buffer,hlsl,coalescing,Memory,Buffer,Hlsl,Coalescing,我目前正在开发一个受全局内存带宽限制的HLSL着色器。我需要在每个内存事务中合并尽可能多的内存。根据NVIDIA针对CUDA和OpenCL的指南(DirectCompute文档非常缺乏),compute capability 2.0的最大内存事务大小为128字节,而可访问的最大字为16字节。当扭曲中的线程访问的数据落入同一128字节段时,可以合并全局内存访问。考虑到这一点,如果结构大于16字节,结构化缓冲区对内存合并不是有害的吗 假设您有一个由两个float4组成的结构,将它们称为a和B。对于在

我目前正在开发一个受全局内存带宽限制的HLSL着色器。我需要在每个内存事务中合并尽可能多的内存。根据NVIDIA针对CUDA和OpenCL的指南(DirectCompute文档非常缺乏),compute capability 2.0的最大内存事务大小为128字节,而可访问的最大字为16字节。当扭曲中的线程访问的数据落入同一128字节段时,可以合并全局内存访问。考虑到这一点,如果结构大于16字节,结构化缓冲区对内存合并不是有害的吗

假设您有一个由两个float4组成的结构,将它们称为a和B。对于在非发散扭曲中发出的指令,您可以在单个内存事务中访问a或B,但不能同时访问两者。内存的布局看起来像ABABABAB。如果您试图将连续结构读入共享内存,那么以这种方式存储数据不会浪费内存带宽吗?例如,您只能访问A元素,但硬件合并内存事务,以便它读取128字节的连续数据,其中一半是B元素。基本上,你在浪费一半的内存带宽。像aabbbb那样存储数据不是更好吗?aabbbbb是缓冲区的结构,而不是结构的缓冲区?或者这是由一级缓存处理的,其中缓存了B元素,以便在下一条指令读取B元素时可以更快地访问它们?唯一的其他解决方案是让偶数编号的线程访问A元素,而奇数编号的元素访问B元素


如果内存带宽确实被浪费了,我不明白除了为了方便,为什么会有人使用结构化缓冲区。希望我解释得足够好,以便有人能理解。我会在英伟达开发者论坛上问这个问题,但我认为他们仍然在下降。VisualStudio在尝试运行英伟达NVIEW框架剖析器时,总是崩溃,因此很难看到内存带宽如何受数据存储方式的变化的影响。P.S.,有没有人能成功运行英伟达NFILE框架剖析器?

nVIEW不应该崩溃VisualStudio。您正在使用哪个版本的Nsight和Visual Studio?Nsight不应该使Visual Studio崩溃。您正在使用哪个版本的Nsight和Visual Studio?