计算着色器OpenGL中的一个大SSBO或多个小SSBO

计算着色器OpenGL中的一个大SSBO或多个小SSBO,opengl,shader,gpu,gpgpu,compute-shader,Opengl,Shader,Gpu,Gpgpu,Compute Shader,当我分配多个小型SSBO用于计算着色器而不是内部映射到多个数组的大型SSBO时,有什么区别吗 我所说的差异是指读/写性能。GPU内存是否关心SSBO分区,还是统一处理所有事情 以下是着色器中的一个示例: layout (std430, binding=1) buffer bufferA {int elementsA[]}; layout (std430, binding=2) buffer bufferB {int elementsB[]}; ... //VS layout (std430

当我分配多个小型SSBO用于计算着色器而不是内部映射到多个数组的大型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.

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


现在,关于你的问题,你必须试着描述一下。很难判断使用多个缓冲区或仅使用一个缓冲区是否会获得收益。但,我会选择一个长缓冲区,因为它需要更少的簿记,占用更少的绑定槽,并且由于视频内存中数据的空间位置,可能会执行得更快。但是我把实际测试留给你。

非常感谢你的回答!我需要大量的数据,我还将数据写入SSBO中的计算着色器中。