联锁平均值(CAS)不适用于HLSL

时间:2014-04-21 02:11:01

标签: concurrency gpgpu atomic hlsl interlocked

大家好。我试图在HLSL上使用InterlockedCompareExchange实现一个互锁的移动平均线,但是我让GPU卡在无限循环上。

所以,代码是这样的:

[allow_uav_condition] while (true)
{
    // Get old value
    uint old = irradianceVolume[vpos];

    // Average
    float3 avg = saturate((UnpackR5G5B5A1(old) + irradiance) * 0.5f);
    uint final = PackR5G5B5A1(float4(avg, 1));

    // Try to store
    uint ret = -1;
    InterlockedCompareExchange(irradianceVolume[vpos], old, final, ret);

    if (ret == old)
        break;
}

以下是 InterlockedCompareExchange 函数的参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ff471409(v=vs.85).aspx

如果有人可以提供帮助,那将非常有帮助。我现在用一个InterlockedMax来破坏我的方式,但是你可以想象,这很糟糕。它的效果非常好。

1 个答案:

答案 0 :(得分:0)

编译器可能没有意识到“uint old = irradianceVolume [vpos];”本质上是从共享内存中读取。它可能是 1)完全将其拉出环路 2)从陈旧的高速缓存行读取它,因为原子可能与原子未完成的读取不一致。

如果用“uint old; InterlockedAdd(irradianceVolume [vpos],0,

替换它)