opengl计算着色器中barrier()的语义

时间:2017-11-23 15:03:46

标签: opengl synchronization gpgpu compute-shader

假设我有一个用GLSL编写的opengl计算着色器,在NVidia Geforce 970上执行。

在着色器的开头,单个调用将写入"着色器存储缓冲区对象" (SSBO)。

然后我发出了一个合适的障碍,比如我的GLSL中的memoryBarrier()。

然后我在每次调用时从第一步写入的内存中读取。

第一次写入是否对当前计算操作中的所有调用都可见?

https://www.khronos.org/opengl/wiki/Memory_Model#Ensuring_visibility,Khronos说:

"如果你使用像屏障这样的机制在调用之间进行同步,则使用相干和适当的memoryBarrier *或groupMemoryBarrier调用。"

我非常确定可以在工作组中以这种方式同步。但它是否适用于整个计算操作中每个工作组中的所有调用?

我不确定如何安排整套工作组。我希望它们可能会按顺序运行,这使得我不可能进行同步的那种同步吗?

1 个答案:

答案 0 :(得分:5)

  

但它是否适用于整个计算操作中每个工作组中的所有调用?

没有。 scope of barrier is explicitly within a work grouphere。并且您无法看到尚未确定的操作。工作组相对于彼此的执行顺序是未定义的,因此您不知道是否有一个工作组已执行。

你想要的是不可能的。相反,您需要更改着色器的工作方式,以便工作组不会相互依赖。在这种情况下,您可以让每个工作组执行此计算。而不是通过SSBO将其存储在全局内存中,而是将结果存储在shared变量中。

是的,您将在每个组中计算相同的值。但是,与所有这些工作组等待一个工作组相比,这将产生更好的性能。特别是因为那不是你真正可以做的事情。