计算着色器 OpenGL 中的一个大 SSBO 或多个小 SSBO
One big SSBO or multiple small ones in Compute Shaders OpenGL
当我分配多个小型 SSBO 用于计算着色器而不是一个内部映射到许多数组的大型 SSBO 时,有什么不同吗?
我所说的差异是指 read/write 性能。 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 则在 on chip shared memory,access to which is much faster. I would use SSBOs for really HUGE amount of data,where your application cannot live with UBO blocks size limits.
中
现在,关于您的问题 - 您必须尝试进行分析。很难说您是通过使用多个缓冲区还是只使用一个缓冲区来获益。但是,我会选择一个长缓冲区,因为它需要更少的簿记,占用更少的绑定槽,并且由于视频内存中数据的空间局部性,它可能会执行得更快。但我把实际测试留给你。
当我分配多个小型 SSBO 用于计算着色器而不是一个内部映射到许多数组的大型 SSBO 时,有什么不同吗?
我所说的差异是指 read/write 性能。 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 则在 on chip shared memory,access to which is much faster. I would use SSBOs for really HUGE amount of data,where your application cannot live with UBO blocks size limits.
中现在,关于您的问题 - 您必须尝试进行分析。很难说您是通过使用多个缓冲区还是只使用一个缓冲区来获益。但是,我会选择一个长缓冲区,因为它需要更少的簿记,占用更少的绑定槽,并且由于视频内存中数据的空间局部性,它可能会执行得更快。但我把实际测试留给你。