opengl 计算着色器中 barrier() 的语义
Semantics of barrier() in opengl compute shader
假设我有一个用 GLSL 编写的 opengl 计算着色器,在 NVidia Geforce 970 上执行。
在着色器开始时,单次调用写入 "Shader Storage Buffer Object" (SSBO)。
然后我发出一个合适的屏障,比如我的 GLSL 中的 memoryBarrier()。
然后我在每次调用时从第一步写入的内存中读取。
第一次写入是否对当前计算操作中的所有调用可见?
在 https://www.khronos.org/opengl/wiki/Memory_Model#Ensuring_visibility 处,Khronos 说:
"Use coherent and an appropriate memoryBarrier* or groupMemoryBarrier call if you use a mechanism like barrier to synchronize between invocations."
我很确定可以在工作组中以这种方式进行同步。但它是否适用于整个计算操作中每个工作组中的所有调用?
我不确定整组工作组是如何安排的。我希望它们可能 运行 按顺序进行,使我所问的那种同步成为不可能?
But does it work for all invocations in every work group, in the entire compute operation?
没有。 scope of barrier
is explicitly within a work group。而且您无法看到您尚未确保已经发生的操作。工作组之间的执行顺序是不确定的,所以你不知道一个工作组是否已经执行了。
你想要的真的不可能。相反,您需要更改着色器的工作方式,以便工作组不相互依赖。在这种情况下,您可以让每个工作组执行此计算。而不是通过 SSBO 将其存储在全局内存中,而是将结果存储在 shared
变量中。
是的,您将在每个组中计算相同的值。但这将产生比让所有这些工作组等待一个工作组更好的性能。特别是因为那不是您实际可以做的事情。
假设我有一个用 GLSL 编写的 opengl 计算着色器,在 NVidia Geforce 970 上执行。
在着色器开始时,单次调用写入 "Shader Storage Buffer Object" (SSBO)。
然后我发出一个合适的屏障,比如我的 GLSL 中的 memoryBarrier()。
然后我在每次调用时从第一步写入的内存中读取。
第一次写入是否对当前计算操作中的所有调用可见?
在 https://www.khronos.org/opengl/wiki/Memory_Model#Ensuring_visibility 处,Khronos 说:
"Use coherent and an appropriate memoryBarrier* or groupMemoryBarrier call if you use a mechanism like barrier to synchronize between invocations."
我很确定可以在工作组中以这种方式进行同步。但它是否适用于整个计算操作中每个工作组中的所有调用?
我不确定整组工作组是如何安排的。我希望它们可能 运行 按顺序进行,使我所问的那种同步成为不可能?
But does it work for all invocations in every work group, in the entire compute operation?
没有。 scope of barrier
is explicitly within a work group。而且您无法看到您尚未确保已经发生的操作。工作组之间的执行顺序是不确定的,所以你不知道一个工作组是否已经执行了。
你想要的真的不可能。相反,您需要更改着色器的工作方式,以便工作组不相互依赖。在这种情况下,您可以让每个工作组执行此计算。而不是通过 SSBO 将其存储在全局内存中,而是将结果存储在 shared
变量中。
是的,您将在每个组中计算相同的值。但这将产生比让所有这些工作组等待一个工作组更好的性能。特别是因为那不是您实际可以做的事情。