我正在开发一款iPhone应用程序,该应用程序涉及每秒数千次的某些物理计算。我正在优化代码以提高帧速率。我正在考虑改进的部分之一是平方根倒数。现在,我正在使用Quake3快速平方根倒数方法。然而,经过一些研究,我听说有一种更快的方法可以使用NEON指令集。我不熟悉内联汇编,也不知道如何使用NEON。我尝试实现数学neon库,但我遇到了编译器错误,因为大多数基于neon的函数都缺少return
。
编辑:我突然得到了一些"不清楚的问题"的接近票。尽管我认为这很清楚,那些回答的人显然也理解,但也许有些人需要明确说明:如何使用霓虹灯进行更快的计算?这真的是在iPhone上获得平方根倒数的最快方法吗
编辑:我今天对霓虹灯VS地震做了一些更正式的测试,但如果有什么不同的话,我现在更不确定结果:
-
应用内测试:(当前在应用商店中修改invsqrt方法的应用)
- 地震法(在压力条件下,平均FPS略有增加)
- 霓虹灯(这是一个非常接近的决定,但似乎地震稍微快一点)
- 1/sqrtf()(一个更明显的差异,1-3 FPS下降)
-
"正式"测试(一个吞噬我手机CPU的应用程序。乘以每个方法通过10000000个随机生成的浮点数组所需的时间)
- 霓虹灯(显然是最快的,如果它一次做两个平方英尺,速度会翻倍)
- 1/sqrtf()(只比霓虹灯慢一点。这个令人惊讶的结果让我认为这个测试"没有结论",直到我进一步调查为止)
- 地震(令人惊讶的是,这种方法比其他两种方法慢了几个数量级。考虑到它在另一种测试中的性能,这尤其令人惊讶。)
虽然在应用程序性能测试中,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实现,您应该能够像一样复制汇编位