avl*_*den 3 opengl synchronization gpgpu compute-shader
假设我有一个用GLSL编写的opengl计算着色器,在NVidia Geforce 970上执行。
在着色器的开始处,单个调用将写入“着色器存储缓冲区对象”(SSBO)。
然后,我发出合适的屏障,例如GLSL中的memoryBarrier()。
然后,在每次调用时,我将从第一步编写的内存中读取。
第一次写入对当前计算操作中的所有调用都可见吗?
在https://www.khronos.org/opengl/wiki/Memory_Model#Ensuring_visibility上,Khronos说:
“如果您使用诸如barrier这样的机制在调用之间进行同步,请使用一致且适当的memoryBarrier *或groupMemoryBarrier调用。”
我很确定可以在工作组中以这种方式进行同步。但是,它是否适用于整个计算操作中每个工作组中的所有调用?
我不确定如何安排整个工作组。我希望它们可能按顺序运行,从而使我要问的那种同步成为不可能?
但是,它是否适用于整个计算操作中每个工作组中的所有调用?
否。范围barrier明确在工作组内。而且,您无法了解尚未确保已经发生的操作。工作组相对于彼此的执行顺序是不确定的,因此您不知道一个工作组是否已经执行。
您真正想要的是不可能的。相反,您需要更改着色器的工作方式,以使工作组不相互依赖。在这种情况下,您可以让每个工作组都执行此计算。而不是通过SSBO将其存储在全局存储器中,而是将结果存储在shared变量中。
是的,您将在每个组中计算相同的值。但这将比让所有这些工作组等待一个工作组产生更好的性能。特别是因为那实际上不是您可以做的。