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

Posted

技术标签:

【中文标题】联锁平均值 (CAS) 不适用于 HLSL【英文标题】:Interlocked average (CAS) not working on HLSL 【发布时间】:2014-04-21 02:11:00 【问题描述】:

大家好。我尝试在 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】:

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

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

【讨论】:

以上是关于联锁平均值 (CAS) 不适用于 HLSL的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn fbeta_score默认平均参数不适用于多类目标变量

Math.floor 不适用于 cartian 测试用例

根据数据验证选择更改公式中的值

Google Sheets ArrayFormula - 前行的平均值

带有 np.mean 的大列表的平均值

在多个维度上平均 numpy 掩码数组