安卓浮点数运算性能

7
我有一个使用NDK执行大量浮点数计算的Android应用程序
我刚刚获得了一台新的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重新编译我的代码,但我不明白为什么这会有如此显著的差异。你知道是什么问题吗?


你能量化“慢得多”吗? - WarrenFaith
@WarrenFaith 我已经更新了问题并附上了实际数字。 - dbyrne
3个回答

7

是的,这正是问题所在。标星了。 - dbyrne

5
你可以尝试使用以下代码来强制仅使用v7a指令:APP_ABI:= armeabi-v7a。我可以想象,新的CPU可能没有被识别为支持v7a指令,因此在运行时会使用无FPU代码作为后备方案。

这个可以用。但这真的令人沮丧,因为现在我没有办法发布一个所有手机都支持的应用程序了。我不想因为这个原因发布两个不同的应用程序。 - dbyrne
就个人而言,我一直在研究渲染脚本方向以实现兼容性。这不仅是为了支持不同类型的CPU,还为了实现易于实现的多处理器支持和可能的GPU利用。 - harism
1
您可以在同一应用程序中包含不同版本的本地库;请记住,这些库是通过您的Java代码在运行时加载的。也许可以在您的应用程序内部执行FPU检测,例如像这里描述的,然后加载相应的本地库。 - JimmyB

0

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


我曾经看到过一款被宣传为“2 GHz”的手机,但实际上它只是一款双核1 GHz的手机。但是我向您保证,Galaxy Nexus确实搭载了两颗1.2 GHz的处理器。 - dbyrne
你提出了一个很好的观点,我应该将我的计算代码多线程化。特别是因为它很容易并行化。 - dbyrne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接