iPhone上最快的反方形根

时间:2014-01-10 07:41:35

标签: ios objective-c optimization physics neon

我正在开发一款涉及某些物理计算的iPhone应用程序,每秒进行数千次。我正在努力优化代码以提高帧速率。我正在寻求改进的其中一个方面是反平方根。现在,我正在使用Quake 3 fast inverse square root方法。然而,在做了一些研究之后,我听到了there is a faster way by using the NEON指令集。我不熟悉内联汇编,无法弄清楚如何使用NEON。我尝试实现math-neon库,但是由于大多数基于NEON的函数缺少return,我遇到了编译器错误。

编辑:我突然得到一些“不明确的问题”关闭投票。虽然我认为它很清楚,而且那些回答明显的人都明白了,也许有些人需要明确说明: 如何使用Neon执行更快的计算?它是否真的是在iPhone上获得反平方根的最快方法?

编辑:我今天在Neon VS Quake上进行了一些更正式的测试,但如果有的话,我现在对结果更加不确定了:

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

    1. 地震法(在压力条件下平均FPS略有增加)
    2. 霓虹灯(这是一个非常接近的电话,但似乎Quake稍快一点)
    3. 1 / sqrtf()(差异更明显,1-3 FPS下降)。
  • “正式”测试(吞噬我的手机CPU的应用程序。计算每种方法通过1​​0000000随机生成的花车阵列所需的时间)

    1. 霓虹灯(显然是最快的,如果用来同时做两个sqrts,速度加倍)。
    2. 1 / sqrtf()(只比霓虹灯慢一点。这个惊人的结果让我认为这个测试“没有结果”,直到我进一步调查)
    3. Quake(令人惊讶的是,这种方法比其他两种方法慢了几个数量级。考虑到它在其他测试中的表现,这尤其令人惊讶。)

虽然在应用程序性能测试中,地震与霓虹灯的距离太近而无法确定,但在第一次测试中,地震对比1 / sqrtf()非常明显,第二次测试与其值非常一致输出。但最重要的是应用程序性能,所以我将根据该测试做出最终决定。

2 个答案:

答案 0 :(得分:5)

accepted answerquestion you've linked已经提供了答案,但没有说清楚:

#import <arm_neon.h>

void foo() {
    float32x2_t inverseSqrt = vrsqrte_f32(someFloat);
}

iOS SDK已经提供了标题和功能。

答案 1 :(得分:2)

https://code.google.com/p/math-neon/source/browse/trunk/math_sqrtf.c&lt; - 那里有一个invsqrt的霓虹灯实现,你应该能够按原样复制汇编位