Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opengl计算着色器中barrier()的语义_Opengl_Synchronization_Gpgpu_Compute Shader - Fatal编程技术网

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

opengl计算着色器中barrier()的语义,opengl,synchronization,gpgpu,compute-shader,Opengl,Synchronization,Gpgpu,Compute Shader,假设我有一个用GLSL编写的opengl计算着色器,在NVidia Geforce 970上执行 在着色器开始时,单个调用会写入“着色器存储缓冲区对象”(SSBO) 然后,我发布一个合适的屏障,如GLSL中的memoryBarrier() 然后,在每次调用中,我从第一步中写入的内存中读取数据 第一次写入对当前计算操作中的所有调用都可见吗 至少,科罗诺斯说: “如果使用barrier等机制在调用之间进行同步,请使用一致且适当的memoryBarrier*或groupMemoryBarrier调用。

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

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

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

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

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

至少,科罗诺斯说:

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

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

我不确定整个工作组是如何安排的。我希望它们可能按顺序运行,使我所问的那种同步不可能实现

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

不,是的。而且,您无法看到尚未确保已发生的操作。工作组相对于其他工作组的执行顺序尚未定义,因此您不知道是否有一个工作组已经执行

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

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