gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:51:35 25 4
gpt4 key购买 nike

大家好。我尝试在 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 进行破解,但这确实很麻烦,正如你可以想象的那样。不过效果还是不错的。

最佳答案

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

如果将其替换为“uint old; InterlockedAdd(irradianceVolume[vpos], 0,”

关于concurrency - 联锁平均值 (CAS) 不适用于 HLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23189808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com