使用Android NDK获取硬件浮点数

13

我开始学习使用Android NDK。我刚学到的一件事是创建application.mk文件来指定armv7 abi。

我正在使用以下参数构建san-angeles示例。

APP_MODULES      := sanangeles
APP_PROJECT_PATH := $(call my-dir)/../
APP_OPTIM        := release
APP_ABI          := armeabi-v7a

但是这似乎与以前一样运行速度很慢。 我只是受到了GL限制而不是CPU限制,还是这里出了些问题?

我注意到当我编译时,会发出以下命令行选项:

-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb 

让我担心的是 "softfp"。虽然提到了 v7 abi,VFP fpu 等内容,但我猜 "thumb" 指的是 "thumb-2" 指令(尽管我不知道这些指令具体是什么)。然而, "softfp" 仍然让我担心。难道不应该是 "hardfp" 吗?

有人对这些问题有什么想法吗?我想为我的 HTC Desire 实现一些 GL ES 2.0 代码,但我希望确保我能获得最佳速度 :)

提前致谢!

1个回答

33
NDK提供的选项只会影响代码编译方式,不会改变GL库或平台中的其他任何内容,这些内容总是以适当的方式生成。如果您只是将几何图形传递给GL硬件,则不会看到任何区别。
如果您想查看选项是否生效,请下载(或创建)一个简单的基准测试,执行一堆双精度浮点值操作,并计算执行前后所需的时间。
"-mfloat-abi = softp"参数确定如何在函数之间传递浮点值。softfp表示它们始终在整数寄存器或堆栈上传递。如果Android没有指定softfp,则ARMv7-A版本的库将期望浮点值显示在硬件寄存器中,并且为ARMv5TE构建的任何代码都将中断。
"softfp"会对某些函数产生一些额外开销,但在ARM上移动值进出fp寄存器的指令很便宜,并且提供的ABI兼容性使其值得。
"-mthumb"启用Thumb / Thumb2代码的生成。Thumb代码往往比等效的ARM慢一些,但有时较小意味着可以更好地适应CPU i-cache并实际运行更快。大小始终是这些设备上的问题,因此默认情况下启用Thumb。
如果有疑问,“arm-eabi-objdump -d whatever.o”将向您显示代码的反汇编结果。

更新:NDK r9b增加了对-mhard-float的支持。这使得您可以为armeabi-v7a目标构建具有硬浮点API约定的NDK库。


1
抱歉,我可能错过了你回答这个问题的事实。非常好的答案 :) - Goz

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