是否可以滚动明显更快的sqrt版本

Mr.*_*Boy 26 c++ optimization sqrt

在我正在分析的应用程序中,我发现在某些情况下,此功能可以占用总执行时间的10%.

我已经看到多年来使用偷偷摸摸的浮点技巧进行了更快的sqrt实现的讨论,但我不知道现代CPU上是否有这样的东西已经过时了.

正在使用MSVC++ 2008编译器,以供参考......虽然我认为sqrt不会增加太多开销.

有关modf函数的类似讨论,另请参见此处.

编辑:作为参考,是一种广泛使用的方法,但它实际上更快?这些天SQRT有多少个周期?

Jam*_*mes 24

是的,即使没有欺骗也有可能:

1)牺牲速度的准确性:sqrt算法是迭代的,以较少的迭代重新实现.

2)查找表:要么只是迭代的起点,要么与插值相结合,一直到达那里.

3)缓存:你总是在使用相同的有限值集吗?如果是这样,缓存可以很好地工作.我发现这在图形应用程序中非常有用,其中对于大量相同大小的形状计算相同的东西,因此可以有效地缓存结果.

  • Milage因使用情况而异:)你真的需要描述你自己的使用场景,看看哪些有用.关于fsqrt指令,您可能仍然可以使用它,但是通过不检查错误条件来加快速度:取决于编译器正在生成的汇编器. (4认同)
  • 我总是觉得很难相信手动进行甚至少量的迭代可能比内置的SQRT指令更快......但是我猜SQRT并不神奇,它仍然会进行迭代. (2认同)

cel*_*ion 16

这里有一个很好的比较表:http: //assemblyrequired.crashworks.org/timing-square-root/

长话短说,SSE2的ssqrts比FPU fsqrt快约2倍,并且近似+迭代比这快4倍(整体8倍).

此外,如果您正在尝试采用单精度sqrt,请确保实际上是您获得的.我听说至少有一个编译器将float参数转换为double,调用双精度sqrt,然后转换回float.

  • 该链接现在已失效。它仍然可以在 archive.org 上找到:https://web.archive.org/web/20210208132927/http://assemblerequired.crashworks.org/timing-square-root/ (2认同)

sbi*_*sbi 10

通过更改算法而不是通过更改实现,您很可能获得更多的速度提升:尝试减少呼叫sqrt()而不是更快地拨打电话.(如果您认为这是不可能的 - sqrt()您提到的改进就是:用于计算平方根的算法的改进.)

由于它经常被使用,因此标准库的实现很可能sqrt()对于一般情况而言几乎是最佳的.除非你有一个受限制的域(例如,如果你需要更少的精度),算法可以采取一些快捷方式,所以不太可能有人想出一个更快的实现.

请注意,由于该函数使用了10%的执行时间,即使您设法实现仅占用75%时间的实现std::sqrt(),这仍然只会使执行时间减少2.5%.对于大多数应用程序,用户甚至不会注意到这一点,除非他们使用手表进行测量.

  • 为什么人们似乎认为原始海报是迟钝的?只是回答他们的问题,而不是告诉他们他们不应该尝试做他们正在做的事情.也许他们有充分的理由去做他们正在做的事情.代码时间的10%是一个函数的一大块时间,如果操作简单,则值得优化.我无法相信这种无益的回应得到了如此多的反响. (45认同)
  • "你没有问正确的问题"应该是一个评论而不是一个答案,因为它没有回答问题.这是正确的,但问题非常具体. (4认同)
  • +1为了实现对较少使用的代码的大幅改进最终导致*Big Picture*几乎可以忽略不计的改进. (2认同)
  • 实际上我发现这个答案经过深思熟虑,很好地解释了可能性,并且权衡了改进实施与选择可能更好的不同方法的利弊.+1真的很有帮助,很好的拼凑答案. (2认同)