联锁平均值 (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默认平均参数不适用于多类目标变量