【问题标题】:Fastest Inverse Square Root on iPhoneiPhone 上最快的平方根平方根
【发布时间】: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 方法已修改)

    1. Quake 方法(在压力条件下平均 FPS 略有增加)
    2. Neon(这是一个非常接近的电话,但似乎 Quake 稍微快一点)
    3. 1/sqrtf()(更明显的差异,1-3 FPS 下降)。
  • “正式”测试(一个占用我手机 CPU 的应用程序。计算每种方法通过 10000000 个随机生成的浮点数的数组所花费的时间)

    1. Neon(显然是最快的,如果用于一次执行两个 sqrts,速度会加倍)。
    2. 1/sqrtf()(只比 Neon 慢一点。这个令人惊讶的结果让我认为这个测试“不确定”,直到我进一步调查)
    3. Quake(令人惊讶的是,这种方法比其他两种方法慢了几个数量级。考虑到它在其他测试中的表现,这尤其令人惊讶。)

虽然在应用程序性能测试中 quake vs neon 太接近无法确定,但在第一次测试中,quake vs 1/sqrtf() 非常明显,第二次测试与它的值非常一致输出。不过,最终重要的是应用性能,因此我将根据该测试做出最终决定。

【问题讨论】:

  • 您是否在仪器下运行您的应用程序以查看实际花费的时间?除非您的意思是“三十万”之类的东西,否则您不太可能花费大量 CPU 时间每秒处理“数千”(反)平方根。
  • 我的应用程序中的“压力条件”每秒运行大约 122500 次计算。在我的目标场景中,它将每秒运行 594000 次。更改平方根方法产生了明显的效果,但我也在努力解决其他瓶颈。

标签: ios objective-c optimization physics neon


【解决方案1】:

question you've linked 中的accepted answer 已经提供了答案,但没有说明:

#import <arm_neon.h>

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

iOS SDK 已经提供了标头和函数。

【讨论】:

  • 如何在float32x2_tfloat 之间进行转换?我找不到任何关于 float32x2_t 到底是什么的好的文档。
  • 它实际上是一个float32_t,它是一个float(在Xcode中,按住命令键并单击一个类型以跳转到它的定义)。我已经相应地编辑了我的答案。
  • 编译器错误:“将'float'传递给不兼容类型float32x2_t的参数”
  • 找到答案:float32x2_t vectorFloat = {someFloat, 1.0f};float outputFloat = vectorFloat[0]; 所以它可以用来同时做两个浮点数,虽然这对我当前的代码结构没有用。
  • @Unheilig 所以 Quake 在我的应用程序中使用时看起来最好,Neon 然后 1/sqrtf,但是当我进行更受控制的实验时,顺序是 neon>1/sqrtf>quake,然后地震和其他两个之间的差异是巨大的。 (2 秒对 2 毫秒)
【解决方案2】:

【讨论】:

  • 我是内联汇编的新手。我如何从中获得输出以及如何给它输入?
  • 据我所知,它只是从第一个参数寄存器中读取参数。但是你应该看看DarkRust提到的函数:vrsqrte_f32
  • @WolfLink:@fyolnish 链接的函数似乎是更好/更精确的实现(据我了解另一个问题中的一些 cmets,单独的 vrsqrte_f32 是不够的精确的结果)。您可以简单地复制整个函数sqrtf_neon_hfp(我不明白包装器sqrtf_neon_sfp 在做什么)。它已经完成了你需要的一切。但是,问题是该文件是在与 iOS AppStore 不兼容的 LGPL3 下获得许可的,因此您通过复制该功能将违反 LGPL3...
  • vrsqrte_f32 只是牛顿方法的快速迭代吗?
  • 我应该如何使 vrsqrte_f32 的结果更精确?
猜你喜欢
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2016-03-15
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多