【发布时间】:2011-11-15 08:51:14
【问题描述】:
我正在尝试优化以下代码,这是我的应用程序的瓶颈。 它的作用:它采用双值 value1 和 value2 并尝试找到包括校正因子在内的最大值。如果两个值之间的差异大于 5.0(LUT 被缩放 10 倍),我可以取这两个值的最大值。如果差值小于 5.0,我可以使用 LUT 中的校正因子。
有谁知道这段代码有什么更好的风格?我不知道我在哪里浪费时间 - 是大量的 if 还是乘以 10?
double value1, value2;
// Lookup Table scaled by 10 for (ln(1+exp(-abs(x)))), which is almost 0 for x > 5 and symmetrical around 0. LUT[0] is x=0.0, LUT[40] is x=4.0.
const logValue LUT[50] = { ... }
if (value1 > value2)
{
if (value1 - value2 >= 5.0)
{
return value1;
}
else
{
return value1 + LUT[(uint8)((value1 - value2) * 10)];
}
}
else
{
if (value2 - value1 >= 5.0)
{
return value2;
}
else
{
return value2 + LUT[(uint8)((value2 - value1) * 10)];
}
}
【问题讨论】:
-
既然你已经知道了结果,为什么还要计算
max()? -
哇...谢谢,那真是太愚蠢了...纠正了!
-
如果这是一个真正的瓶颈,GPU 非常擅长这个(饱和度加法和查找表)。
-
与其将查找表截断为 50,不如考虑将其扩展到最大可能值。使用扩展的 LUT,您可以摆脱 if 测试和分支。内存通常很便宜,而分支通常不是。
-
@David:内存没那么便宜;它将东西推出缓存。我更倾向于使用非线性键来缩小 LUT。不过,我必须绘制 LUT 才能找到便宜的密钥转换。