OpenGL Compute着色器同步不同的工作组

时间:2016-08-25 08:13:33

标签: opengl synchronization compute-shader

如果你有一个计算着色器,同一个调度中的不同工作组被放在一个连续的循环中,你想要通过它们中的任何一个设置一个标志来指示它们全部退出所述循环。这实际上是可能的吗?

我尝试在SSBO中使用标记为coherent和volatile的标记来触发它们的退出。这似乎对AMD有时不起作用。当其中一个工作组想要触发所有这些工作组退出时,我只需将标志从零设置为一个直接(因为只要有人设置它就无关紧要)而不使用原子并在之后调用memoryBarrier()

在memoryBarrier()的文档中,我觉得它可以保证集合在同一个调度中对其他工作组的最终可见性吗?

1 个答案:

答案 0 :(得分:2)

  

在memoryBarrier()的文档中,我觉得它可以保证集合在同一个调度中对其他工作组的最终可见性吗?

可见性,是的。但是它们的执行呢?

您是否有任何保证将触发此关闭的工作组将与循环工作组一起执行?否。

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

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