当我在计算着色器中分配多个小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。
发布于 2018-02-25 05:42:41
GPU内存关心您使用哪种类型的数据存储。您必须首先问自己,为什么总体上需要SSBO?SSBO数据可以存储在GPU的全局内存中,而UBO存储在on chip shared memory中,访问速度要快得多。我会使用SSBO来处理非常大量的数据,因为您的应用程序不能与UBO blocks size limits共存。
现在,关于你的问题-你必须尝试和分析。很难说你是通过使用几个缓冲区还是只使用一个缓冲区来获得收益。但是,我会选择一个长缓冲区,因为它需要更少的记账,更少的装订槽,并且由于视频内存中数据的空间局部性,可能会执行得更快。但我把实际的测试留给了你。
https://stackoverflow.com/questions/48961357
复制相似问题