【发布时间】:2014-01-10 07:41:34
【问题描述】:
我正在开发一个 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 方法已修改)
- Quake 方法(在压力条件下平均 FPS 略有增加)
- Neon(这是一个非常接近的电话,但似乎 Quake 稍微快一点)
- 1/sqrtf()(更明显的差异,1-3 FPS 下降)。
-
“正式”测试(一个占用我手机 CPU 的应用程序。计算每种方法通过 10000000 个随机生成的浮点数的数组所花费的时间)
- Neon(显然是最快的,如果用于一次执行两个 sqrts,速度会加倍)。
- 1/sqrtf()(只比 Neon 慢一点。这个令人惊讶的结果让我认为这个测试“不确定”,直到我进一步调查)
- Quake(令人惊讶的是,这种方法比其他两种方法慢了几个数量级。考虑到它在其他测试中的表现,这尤其令人惊讶。)
虽然在应用程序性能测试中 quake vs neon 太接近无法确定,但在第一次测试中,quake vs 1/sqrtf() 非常明显,第二次测试与它的值非常一致输出。不过,最终重要的是应用性能,因此我将根据该测试做出最终决定。
【问题讨论】:
-
您是否在仪器下运行您的应用程序以查看实际花费的时间?除非您的意思是“三十万”之类的东西,否则您不太可能花费大量 CPU 时间每秒处理“数千”(反)平方根。
-
我的应用程序中的“压力条件”每秒运行大约 122500 次计算。在我的目标场景中,它将每秒运行 594000 次。更改平方根方法产生了明显的效果,但我也在努力解决其他瓶颈。
标签: ios objective-c optimization physics neon