【问题标题】:Is there any performance difference between Buffer, StructuredBuffer and ByteAddressBuffer (also their RW variants)?Buffer、StructuredBuffer 和 ByteAddressBuffer(也是它们的 RW 变体)之间是否存在性能差异?
【发布时间】:2022-08-15 16:14:05
【问题描述】:

我尝试在各种网站上查找此内容,包括有关 DirectX 11 Compute Shader 类型的 MS Docs;但我没有发现任何提及这些缓冲区类型的性能差异的内容。
它们在性能方面是否完全相同?
如果不是,在各种情况下使用每种方法的最佳方式是什么?

    标签: performance gpu directx-11 compute-shader


    【解决方案1】:

    性能最终将不同于 GPU/驱动程序组合。

    这里有一个项目可以对那些进行基准测试(线性/随机情况是最有用的)。

    如果您想比较 cbuffer 访问与其他缓冲区访问,常量访问也很有用(例如,在 NVidia 上,在执行昂贵的着色器之前执行缓冲区到 cbuffer gpu 复制是很常见的)。

    https://github.com/sebbbi/perftest

    请注意,不同的缓冲区(在 d3d11 土地上)也有不同的限制。 因此,性能优势可能会受到这些因素的阻碍。

    • 结构化缓冲区不能绑定为顶点/索引缓冲区。因此,如果您想使用它们,您需要执行额外的副本。 (对于顶点缓冲区,您可以只从顶点 id 中获取,这不会造成任何损失,可以读取索引缓冲区,但有一点问题)。
    • 字节地址允许以非结构化方式存储任何内容(只是某种基本指针)。读取仍然对齐到 4 个字节(int 大小)。转换为浮点数(读取)需要一个 asfloat,从浮点数(写入)需要一个 asuint,但在驱动程序情况下,这通常是一个 nop,因此不会影响性能。
    • 字节地址(和类型化缓冲区)可以用作索引缓冲区或顶点缓冲区。无需复制。
    • 类型化缓冲区不太支持互锁操作,在这种情况下,您需要使用结构化/字节地址缓冲区(请注意,您可以在小缓冲区上使用互锁,并在需要时在类型化缓冲区上执行读/写) .
    • 如果您有一个相同类型的元素数组,使用字节地址可能会更烦人(即使是 float4x4 与 StructuredBuffer 相比也是相当多的代码量 < float4x4 >
    • 结构化缓冲区允许您绑定“部分视图”。因此,即使您的缓冲区有 2048 个浮点数,您也可以绑定 4-456 的范围(它还允许您同时将 500-600 绑定为写入,因为它们不重叠)。
    • 对于所有缓冲区,如果您以只读方式使用它们,请不要将它们绑定为 RW,这通常会带来不错的惩罚。

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 2014-05-17
      • 2012-08-21
      • 2014-02-23
      • 2010-10-02
      • 2023-03-15
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多