OpenGL 计算着色器同步不同的工作组

OpenGL Compute shader sync different work groups

如果您有一个计算着色器,其中同一分派中的不同工作组被置于一个连续的循环中,并且您想通过其中任何一个设置标志来通知它们全部退出所述循环。这真的可能吗?

我试过在 SSBO 中使用标记为连贯和易变的标志来触发它们的退出。有时这似乎不适用于 AMD。当其中一个工作组想要触发所有这些退出时,我只需将标志从零直接设置为一(因为只要有人设置它就没关系)而不使用原子,然后调用 memoryBarrier() .

从 memoryBarrier() 的文档来看,在我看来它将保证集合最终对同一调度中的其他工作组可见?

From the documentation of memoryBarrier() it seems to me like it will guarantee the eventual visibility of the set to other work groups within the same dispatch?

能见度,是的。但是他们的 执行 呢?

您是否可以保证将触发此关闭的工作组将与循环工作组一起执行?编号

在来自不同工作组的调用之间根本 没有顺序保证。因此,GPU 完全有可能用循环工作组填满其所有执行时间。这意味着他们将等待 永远不会 出现的信号。

计算着色器不保证所有线程都会进行。因此,您不能编写假设它们会的代码。唯一控制计算着色器执行的工具是 barrier,它只控制 工作组内的调用执行。