所以,代码是这样的:
[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来破坏我的方式,但是你可以想象,这很糟糕。它的效果非常好。
答案 0 :(得分:0)
编译器可能没有意识到“uint old = irradianceVolume [vpos];”本质上是从共享内存中读取。它可能是 1)完全将其拉出环路 2)从陈旧的高速缓存行读取它,因为原子可能与原子未完成的读取不一致。
如果用“uint old; InterlockedAdd(irradianceVolume [vpos],0,
替换它)