哪个效率更高,atan2或sqrt?

时间:2012-02-16 18:32:47

标签: performance geometry floating-point

在某些情况下,有多种方法可以计算相同的值。

现在我想出一个算法来“扩展”2D凸多边形。为此,我想找到扰乱每个顶点的方向。为了产生使多边形具有相同厚度的“皮肤”的多边形扩展的结果,在该方向上扰动的量也取决于顶点处的角度。但是现在我只是担心方向。

一种方法是使用atan2:设B是我的顶点,A是前一个顶点,C是下一个顶点。我的方向是angle(B-A)angle(B-C)的“角度平均值”。

另一种方法涉及sqrt:unit(B-A)+unit(B-C)其中unit(X)X/length(X)会产生一个带有我方向的向量。

我倾向于方法2,因为平均角度值需要一些工作。但我基本上是在两次调用atan2和两次调用sqrt之间做出选择。哪个一般更快?如果我在着色器程序中这样做呢?

我不打算优化我的程序本身,我想知道这些函数通常是如何实现的(例如在标准的c库中),所以我一般都能知道什么是更好的选择。

据我所知,sqrt和trig函数都需要迭代方法才能得出答案。这就是我们尽可能避免使用它们的原因。人们已经提出了“近似”函数,它们使用查找表和插值等来尝试产生更快的结果。我当然不会理会这些,除非我发现我的代码中存在瓶颈的严重证据,因为这些例程或例程严重涉及它们,但sqrt,trig funcs和inverse trig funcs之间的差异可能与讨论有关。

3 个答案:

答案 0 :(得分:20)

在常见的现代硬件上使用典型的库,sqrtatan2快。 atan2速度较快的情况可能存在,但它们很少见。

最近的x86实现实际上具有相当高效的sqrt指令,并且在该硬件上,差异可能非常大。英特尔优化手册在Sandybridge上引用单精度平方根作为14个周期,并且在22个周期内引用双精度平方根。有一个好的数学库atan2时间通常在100个或更多周期附近。

答案 1 :(得分:1)

听起来您拥有所需的所有信息,可以自行分析并找到答案。

如果您没有寻找确切的结果,并且不介意使其工作所需的其他逻辑,您可以使用RSQRTSSRSQRTPS等专门的操作来计算{ {1}},将两个昂贵的操作结合起来。

答案 2 :(得分:0)

实际上,sqrt优于atan2,1 / sqrt优于sqrt。

对于非内置解决方案,您可能会对CORDIC approximations感兴趣。

但是在你的情况下,你应该在得出任何结论之前开发完整的公式并对它们进行全局优化,因为超越函数只是计算的一小部分。