计算着色器是否可以将相同的值从多个线程写入相同的共享内存?

时间:2016-10-22 21:40:35

标签: glsl compute-shader

我想通过使用一个bool变量(不是数组)来模拟计算着色器中的布尔减少,只需使用false值初始化变量,所有线程都可以看到,然后让每个线程通过将其写入变量来为减少贡献true值,或者通过什么都不做贡献false值。

一个例子:

shared bool someNumberIsBig;

// ...

void main()
{
    uint id = gl_LocalInvocationID.x;
    uint gid = gl_GlobalInvocationID.x;

    if (id == 0) someNumberIsBig = false;
    memoryBarrierShared();
    barrier();

    uint oneNumber = someBuffer[gid];

    if (oneNumber > 5) someNumberIsBig = true; // WOW that's big
    memoryBarrierShared();
    barrier();

    if (someNumberIsBig)
    {
        // do some work, with dynamic uniformity even, and with an
        // assurance that at least one number was indeed big...  or not??
    }
}

对我而言似乎很简单,但也许竞争对同一位置的写入可能会以某种方式引起问题。我是否依赖于任何未定义或特定于实现的行为?

(做我想要做的另一种方法是将所有bool写入共享数组,然后在数组上运行显式缩减算法。我的直觉天真地告诉我,这将比上面慢,但是也许它真的不会......但是,无论如何,我只是在这里询问上述是否正确,无论其效率如何。)

1 个答案:

答案 0 :(得分:0)

共享内存总是很昂贵。你可以从false sharing文章中看到很好的解释原因。

但如果您仍想使用共享内存,则支持它。只有它们的问题是不连贯的内存和执行顺序。但是你的例子解决了内存障碍和执行障碍。如果你想用共享内存做更复杂的操作,那么你必须使用原子内置函数。有关详细信息,请参阅OGL wiki