是否可以在计算机着色器中进行缩减/更新或原子操作。 mat3
,vec3
数据类型?
喜欢这个方案:
some_type mat3 A;
void main() {
A += mat3(1);
}
我已经尝试使用着色器存储缓冲区对象(SSBO
),但似乎更新不是原子的(至少我在读回缓冲区时会得到错误的结果)。
有没有人有想法实现这一点?也许创建一个小的3x3 image2D
并将结果按imageAtomicAdd
存储在那里?
答案 0 :(得分:0)
GLES 3.1中有基于缓冲的原子。
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
第7.7节。
也许创建一个小的3x3 image2D并将结果存储在imageAtomicAdd中?
图像原子不是核心,需要扩展。
感谢您的链接。我忘了提到我使用ARM Mali GPU,因此他们没有公开TLP,也没有像Wvid或AMD那样的warp / wave前端。也就是说,我可能需要找出另一种快速方法。
在你的帖子的评论中提出的技术(特别是你将结果的上半部分折叠的log(N)除数方法)在Mali上仍然可以正常工作。该技术不依赖于warp / wavefronts - 正如原始海报所说,你只需要同步(例如使用barrier()
而不是依赖于wavefronts会给你的隐含障碍。)