代码之家  ›  专栏  ›  技术社区  ›  Goz

使用android ndk获取硬件浮点

  •  13
  • Goz  · 技术社区  · 14 年前

    我已经开始玩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 
    

    让我担心的是“软FP”。这里提到了V7ABI,vfpu的东西,我猜“thumb”指的是“thumb-2”指令(尽管我不知道具体是什么)。然而,“软计划”确实让我担心。不是应该是“强硬派”吗?

    有人对这些问题有什么看法吗?我想我可能已经准备好开始为我的HTC需求实现一些GLES2.0代码了,但是我想确保我能以最好的速度完成它:)

    提前干杯!

    1 回复  |  直到 11 年前
        1
  •  32
  •   fadden    11 年前

    提供给ndk的选项只会影响代码的编译方式。它不会改变gl libs或平台中的其他任何内容,这些内容总是以适当的方式生成的。如果你只是把几何图形扔到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库。