【问题标题】:Semantics of barrier() in opengl compute shaderopengl计算着色器中barrier()的语义
【发布时间】:2018-05-07 14:14:58
【问题描述】:

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

在着色器开始时,一次调用会写入“着色器存储缓冲区对象”(SSBO)。

然后我发出一个合适的屏障,例如我的 GLSL 中的 memoryBarrier()。

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

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

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

“如果您使用屏障等机制在调用之间进行同步,请使用一致且适当的 memoryBarrier* 或 groupMemoryBarrier 调用。”

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

我不确定整套工作组是如何安排的。我希望它们可能按顺序运行,从而使我所询问的那种同步变得不可能?

【问题讨论】:

    标签: opengl synchronization gpgpu compute-shader


    【解决方案1】:

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

    没有。 scope of barrier is explicitly within a work group。而且您无法看到尚未确保已经发生的操作。工作组之间的执行顺序是不确定的,所以你不知道一个工作组是否已经执行了。

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

    是的,您将在每个组中计算相同的值。但这将比让所有这些工作组等待一个工作组产生更好的性能。尤其是因为这不是你能真正做到的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2020-11-22
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多