iPhone上最快的逆平方根

我正在研究一个iPhone应用程序,涉及每秒完成数千次的某些物理计算。 我正在优化代码,以提高帧率。 我正在研究的其中一个部分是平方根的倒数。 现在,我正在使用Quake 3快速反平方根方法。 不过,经过一番研究,我听说使用NEON指令集有更快的方法 。 我不熟悉内联汇编,不知道如何使用NEON。 我试图实现math霓虹灯库,但我得到编译器错误,因为大多数基于NEON的function缺乏return

编辑:我突然得到一些“不清楚的问题”密切的选票。 虽然我觉得它很清楚,而且回答的人显然明白了,也许有人需要明确说明: 你怎么用氖来执行更快的计算? 这真的是得到iPhone上反平方根的最快方法吗?

编辑:我今天做了一些更正式的testing氖VS地震,但如果有的话,我现在更加不确定的结果:

  • 应用内testing:(一个当前在app store中的invsqrt方法被修改的应用)

    1. 地震方法(由于在压力条件下平均FPS略有增加而领先)
    2. 霓虹灯(这是一个非常接近的电话,但似乎地震稍快)
    3. 1 / sqrtf()(有点更显着的差异,1-3 FPS的下降)。
  • “正式”testing(一个吞噬我手机CPU的应用程序,每个方法需要花费多less时间才能通过10000000个随机生成的浮点数组)

    1. 霓虹灯(显然是最快的,如果它是用来做两个sqrt一次速度的两倍)。
    2. 1 / sqrtf()(只比氖慢一点,这个令人惊讶的结果让我认为这个testing“没有结果”,直到我进一步调查)
    3. Quake(令人惊讶的是,这种方法比其他两种方法慢了几个数量级,鉴于其他testing的性能,这一点尤其令人吃惊)。

虽然地震对霓虹灯在应用程序性能testing中太接近无法说出任何事情,但在第一次testing中,地震vs 1 / sqrtf()非常清晰,第二次testing与输出的值非常一致。 然而最重要的是应用程序的性能,所以我要根据这个testing做出最终决定。

你已经连接的问题已 被接受的答案已经提供了答案,但没有说出来:

 #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的霓虹灯实现,你应该能够按原样复制这个汇编位