相关疑难解决方法(0)

为什么在memoryBarrier没有时,barrier会同步共享内存?

以下GLSL计算着色器只是复制inImageoutImage.它源于更复杂的后处理过程.

在前几行中main(),单个线程将64个像素的数据加载到共享阵列中.然后,在同步之后,64个线程中的每一个将一个像素写入输出图像.

根据我的同步方式,我会得到不同的结果.我原本以为memoryBarrierShared()是正确的调用,但它会产生以下结果:

不同步的结果

这与没有同步或使用相同的结果相同memoryBarrier().

如果我使用barrier(),我得到以下(所需)结果:

在此输入图像描述

条带宽度为32像素,如果我将工作组大小更改为小于或等于32的任何值,我会得到正确的结果.

这里发生了什么?我误解了目的memoryBarrierShared()吗?为什么要barrier()工作?

#version 430

#define SIZE 64

layout (local_size_x = SIZE, local_size_y = 1, local_size_z = 1) in;

layout(rgba32f) uniform readonly  image2D inImage;
uniform writeonly image2D outImage;

shared vec4 shared_data[SIZE];

void main() {
    ivec2 base = ivec2(gl_WorkGroupID.xy * gl_WorkGroupSize.xy);
    ivec2 my_index = base + ivec2(gl_LocalInvocationID.x,0);

    if (gl_LocalInvocationID.x == 0) {
        for (int i = 0; i < SIZE; i++) …
Run Code Online (Sandbox Code Playgroud)

glsl

13
推荐指数
1
解决办法
5902
查看次数

GLSL:关于连贯限定符

我没有清楚地了解coherent限定符和原子操作是如何协同工作的。

我使用以下代码在同一个 SSBO 位置执行一些累加操作:

uint prevValue, newValue;
uint readValue = ssbo[index];
do
{
    prevValue = readValue;
    newValue = F(readValue);
}
while((readValue = atomicCompSwap(ssbo[index], prevValue, newValue)) != prevValue);
Run Code Online (Sandbox Code Playgroud)

这段代码对我来说很好用,但是,coherent在这种情况下,我是否需要使用限定符声明 SSBO(或图像)?

我是否需要coherent在我只打电话的情况下使用atomicAdd

我什么时候需要使用coherent限定符?我是否只需要在直接写入的情况下使用它:ssbo[index] = value;

opengl synchronization atomic glsl

5
推荐指数
1
解决办法
1402
查看次数

标签 统计

glsl ×2

atomic ×1

opengl ×1

synchronization ×1