我想通过使用一个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写入共享数组,然后在数组上运行显式缩减算法。我的直觉天真地告诉我,这将比上面慢,但是也许它真的不会......但是,无论如何,我只是在这里询问上述是否正确,无论其效率如何。)
答案 0 :(得分:0)
共享内存总是很昂贵。你可以从false sharing文章中看到很好的解释原因。
但如果您仍想使用共享内存,则支持它。只有它们的问题是不连贯的内存和执行顺序。但是你的例子解决了内存障碍和执行障碍。如果你想用共享内存做更复杂的操作,那么你必须使用原子内置函数。有关详细信息,请参阅OGL wiki。