gpt4 book ai didi

c++ - 优化头痛 - 从查找表中删除 if's

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:52 25 4
gpt4 key购买 nike

我正在尝试优化以下代码,这是我的应用程序中的瓶颈。它的作用:它采用 double 值 value1 和 value2 并尝试找到包含校正因子的最大值。如果两个值之间的差异大于 5.0(LUT 按因子 10 缩放),我可以取这两个值的最大值。如果差异小于 5.0,我可以使用 LUT 中的校正因子。

有没有人知道什么是这段代码的更好风格?我不知道我在哪里浪费了时间 - 是大量的 ifs 还是乘以 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)];
}
}

最佳答案

花几分钟使用 Excel 生成一个近似方程,看起来可能具有您需要的精度,因此您可以完全取消查找表。您仍然需要一个条件来确保方程的参数保持在优化的范围内。

double diff = abs(value1 - value2);
double dmax = (value1 + value2 + diff) * 0.5; // same as (min+max+(max-min))/2
if (diff > 5.0)
return dmax;
return dmax + 4.473865638/(2.611112371+diff) + 0.088190879*diff + -1.015046114;

附言我不保证这会更快,只是它是一种足够不同的方法,值得进行基准测试。

附言可以更改约束以得出略有不同的常量,有很多变化。这是我做的另一组,其中您的表格和公式之间的差异将始终小于 0.008,而且每个值都将小于前面的值。

return dmax + 3.441318133/(2.296924445+diff) + 0.065529678*diff + -0.797081529;

编辑:我针对 0 到 10 之间的一百万个随机数以及问题的原始代码 MSalters currently accepted answer 对这段代码(第二个公式)进行了 100 次测试。 , 和一个蛮力实现 max(value1,value2)+log(1.0+exp(-abs(value1-value2)))。我在双核 AMD 速龙和英特尔四核 i7 上进行了测试,结果大致一致。这是一个典型的运行:

  • 原始:1.32 秒。
  • MSalters:1.13 秒。
  • 我的:0.67 秒。
  • 蛮力:4.50 秒。

这些年来,处理器的速度快得令人难以置信,现在速度如此之快,以至于它们执行几个浮点乘法和除法的速度比在内存中查找值的速度还快。这种方法不仅在现代 x86 上更快,而且更准确;方程中的近似误差远小于为查找截断输入而导致的步长误差。

当然,结果仍然会因您的处理器和编译器而异;您自己的特定目标仍然需要进行基准测试。

关于c++ - 优化头痛 - 从查找表中删除 if's,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7388758/

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