我正在开发一个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方法的应用)
  • 地震法(在压力条件下平均FPS略有增加)
  • NEON (这是一个非常接近的通话,但Quake似乎快一点了)
  • 1/sqrtf()(差异更明显,下降1-3 FPS)。
  • “正式”测试(一个占用我手机CPU的应用程序。每种方法经过10000000个随机生成的浮点数组需要花费多长时间)
  • Neon(显然是最快的,并且如果用于一次执行两个sqrt,则速度要加倍)。
  • 1/sqrtf()(仅比Neon慢一点。这个令人惊讶的结果使我认为此测试“不确定”,直到我进一步研究为止)
  • Quake(令人惊讶的是,此方法比其他两种方法慢几个数量级。考虑到它在其他测试中的性能,这尤其令人惊讶。)

  • 尽管在应用程序性能测试中,quake vs neon几乎无法肯定地说什么,但在第一个测试中却很清楚地将quas vs 1/sqrtf()切掉了,第二个测试与其输出的值极其一致。不过,最重要的是应用性能,因此我将根据该测试做出最终决定。

    最佳答案

    accepted answerquestion you've linked已经提供了答案,但没有给出答案:

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

    header 和功能已由iOS SDK提供。

    关于ios - iPhone上最快的逆平方根,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21038641/

    10-12 13:55