【问题标题】:Android floating point math performanceAndroid浮点数学性能
【发布时间】:2011-12-23 15:35:21
【问题描述】:

我有一个Android application,它使用 NDK 执行大量浮点数学运算。

我刚刚购买了一个新的 Galaxy Nexus。令我惊讶的是,我的应用程序运行速度比它应该运行的要慢得多。我怀疑这是因为大多数设备都在使用硬件加速,而 Galaxy Nexus 没有。如果我执行不需要浮点数学的操作,Galaxy Nexus 会按照我的预期执行。

以下是多款设备的 CPU/GPU 规格和采样时序。我已将统计数据标准化以考虑显示分辨率:

Droid
CPU: TI OMAP 3430 (ARM Cortex-A8 600 MHz underclocked to 550 MHz)
GPU: PowerVR SGX530
Instruction Set: ARMv7
Test Run: 1,980 pixels per second

Galaxy Nexus
CPU: TI OMAP 4460 (ARM Cortex-A9 dual-core 1.2 GHz)
GPU: PowerVR SGX540
Instruction Set: ARMv7
Test Run: 2,253 pixels per second

Droid Incredible
CPU: QSD8650 (Qualcomm Snapdragon 1 GHz)
GPU: Adreno 200
Instruction Set: ARMv7
Test Run: 4,571 pixels per second

我的Application.mk 文件中有这个配置:

APP_ABI := armeabi armeabi-v7a

我没有使用 NDK-r7 重新编译我的代码,但我不明白为什么这会产生如此巨大的差异。知道有什么问题吗?

【问题讨论】:

  • 你能量化一下MUCH slower吗?
  • @WarrenFaith 我已经用实际数字更新了问题。

标签: android android-ndk


【解决方案1】:

这个 StackOverflow 问题可能是导致 Galaxy Nexus 性能不佳的原因:Galaxy Nexus - wrong CPU ABI being selected during install time。

这似乎是一个错误。我还通过使用本机代码创建一个小项目对其进行了测试,实际上 Galaxy Nexus 选择了错误的库(armeabi 而不是 armeabi-v7a)。

我已在 http://code.google.com/p/android/issues/detail?id=25321 报告了此错误,并附上了该错误的示例项目。请为它加注星标以引起 Android 工程师的注意。

【讨论】:

  • 是的,这正是问题所在。已加星标。
【解决方案2】:

您可以尝试使用 APP_ABI := armeabi-v7a 仅强制使用 v7a 指令。
我可以想象新的 CPU 没有被检测为支持 v7a 指令,因此在运行时使用无 FPU 代码作为后备。

【讨论】:

  • 这行得通。但是,这很令人沮丧,因为现在我无法将一款所有手机都支持的应用程序投放市场。我不想仅仅因为这个而发布两个不同的应用程序。
  • 就我个人而言,我一直在研究渲染脚本方向的兼容性。而且不仅可以支持不同类型的 CPU,而且还可以轻松实现多处理器支持和可能的 GPU 利用率。
  • 您可以在同一个应用程序中包含不同版本的本地库;请记住,这些库是通过您的 Java 代码在运行时加载的。也许可以在您的应用程序中进行 FPU 检测,例如likedescribed here,然后加载对应的native lib。
【解决方案3】:

我认为问题在于处理器中有 2 个内核。因此,一个核心有 600 Mhz。因此,如果您的数学方法只使用一个线程,这可能是一个答案。虽然,我不明白为什么它慢了 2 倍(可以解释可比较的时间)。

【讨论】:

  • 我见过一款标有“2 GHz”的手机,但实际上它是双核 1 GHz 手机,但我向您保证 Galaxy Nexus 有两个 1.2 GHz 处理器。
  • 您提出了一个很好的观点,即我应该对计算代码进行多线程处理。特别是因为并行化它是微不足道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2022-10-02
相关资源
最近更新 更多