iPhone上最快的平方根倒数



我正在开发一款iPhone应用程序,该应用程序涉及每秒数千次的某些物理计算。我正在优化代码以提高帧速率。我正在考虑改进的部分之一是平方根倒数。现在,我正在使用Quake3快速平方根倒数方法。然而,经过一些研究,我听说有一种更快的方法可以使用NEON指令集。我不熟悉内联汇编,也不知道如何使用NEON。我尝试实现数学neon库,但我遇到了编译器错误,因为大多数基于neon的函数都缺少return

编辑:我突然得到了一些"不清楚的问题"的接近票。尽管我认为这很清楚,那些回答的人显然也理解,但也许有些人需要明确说明:如何使用霓虹灯进行更快的计算?这真的是在iPhone上获得平方根倒数的最快方法吗

编辑:我今天对霓虹灯VS地震做了一些更正式的测试,但如果有什么不同的话,我现在更不确定结果:

  • 应用内测试:(当前在应用商店中修改invsqrt方法的应用)

    1. 地震法(在压力条件下,平均FPS略有增加)
    2. 霓虹灯(这是一个非常接近的决定,但似乎地震稍微快一点)
    3. 1/sqrtf()(一个更明显的差异,1-3 FPS下降)
  • "正式"测试(一个吞噬我手机CPU的应用程序。乘以每个方法通过10000000个随机生成的浮点数组所需的时间)

    1. 霓虹灯(显然是最快的,如果它一次做两个平方英尺,速度会翻倍)
    2. 1/sqrtf()(只比霓虹灯慢一点。这个令人惊讶的结果让我认为这个测试"没有结论",直到我进一步调查为止)
    3. 地震(令人惊讶的是,这种方法比其他两种方法慢了几个数量级。考虑到它在另一种测试中的性能,这尤其令人惊讶。)

虽然在应用程序性能测试中,quake与neon的对比太过接近,无法确定任何内容,但在第一次测试中,quake与1/sqrtf()的对比非常明显,第二次测试与它输出的值非常一致。不过,最终重要的是应用程序的性能,所以我将根据测试做出最终决定。

您链接的问题的已接受答案已经提供了答案,但没有拼写出来:

#import <arm_neon.h>
void foo() {
float32x2_t inverseSqrt = vrsqrte_f32(someFloat);
}

iOS SDK已经提供了标头和函数。

https://code.google.com/p/math-neon/source/browse/trunk/math_sqrtf.c<-这里有invsqrt的neon实现,您应该能够像一样复制汇编位

最新更新