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

标签 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 调用。”

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

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

最佳答案

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 中。多变的。

是的,您将在每个组中计算相同的值。但这比让所有这些工作组等待一个工作组产生更好的性能。尤其是因为那不是您实际上可以做的事情。

关于opengl - opengl计算着色器中barrier()的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458449/

相关文章:

opengl - OpenGL 对四元数的支持是什么?

c++ - 使用 GL_LINE_LOOP 绘制多个圆

git-svn : keeping git repo and svn repo in sync

cuda - 如何使用 CUDA C 快速重新分组/透视数据?

CUDA高效划分?

cuda - 具有映射内存、统一虚拟寻址和统一内存的 GPU 内存超额订阅

opengl - GLSL:关于连贯的限定词

c++ - GL_32F 和 glReadPixels

java - ruby 线程编程,ruby 相当于 java wait/notify/notifyAll

asp.net - 不确定用于同步的 SQL Server 锁的类型