【问题标题】:One big SSBO or multiple small ones in Compute Shaders OpenGL计算着色器 OpenGL 中的一个大 SSBO 或多个小 SSBO
【发布时间】:2018-02-24 09:32:15
【问题描述】:

当我分配多个小的 SSBO 用于计算着色器而不是一个大的,内部映射到许多数组时,有什么区别吗?

我所说的差异是指读/写性能。 GPU 内存是否关心 SSBO 分区或是否统一处理所有内容。

这是着色器中的示例:

layout (std430, binding=1) buffer bufferA
{int elementsA[]};

layout (std430, binding=2) buffer bufferB
{int elementsB[]};
...

//VS

layout (std430, binding=1) buffer buffers
{
int elementsA[MAXCOUNT_A];
int elementsB[MAXCOUNT_B];
...
};

一个大缓冲区可以避免 CPU 端的许多分配,并产生更清晰的代码,将内存分区留给着色器代码。当然,我需要为每个表示缓冲区的数组指定最大大小,这可能会导致不必要的内存分配。但是我更关心运行时访问速度。

这种合并是一个好习惯吗?现在在我的代码中,我得到了太多小的缓冲区分配,这很丑:D。

【问题讨论】:

    标签: opengl shader gpu gpgpu compute-shader


    【解决方案1】:

    GPU 内存关心您使用的数据存储类型。您必须首先问自己,为什么通常需要 SSBO? SSBO 数据可能存储在 GPU 的全局内存中,而 UBO 存储在on chip shared memory,访问速度要快得多。我会使用 SSBO 来处理大量数据,而您的应用程序无法使用 UBO blocks size limits

    现在,关于您的问题 - 您必须尝试分析。很难判断您是否会通过使用多个缓冲区或只使用一个缓冲区来获得收益。但是,我会选择一个长缓冲区,因为它需要更少的簿记,占用更少的绑定插槽,并且由于视频内存中数据的空间局部性,它可能会执行得更快。但我把实际测试留给你。

    【讨论】:

    • 非常感谢您的回答!我需要大量数据,并且我还在计算着色器中将数据写入 SSBO。
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多