NDK编译——NEON支持

来源:互联网 发布:郭德纲网络剧 编辑:程序博客网 时间:2024/06/05 08:33

文章的内容是从Android开发者官网扒的,为了防止再登不上去,记录一下。官网网址:https://developer.android.com/ndk/guides/cpu-arm-neon.html


NEON 支持

本页内容

  1. 使用 LOCAL_ARM_NEON
  2. 使用 .neon 后缀
  3. 构建要求
  4. 运行时检测
  5. 示例代码

NDK 支持 ARM Advanced SIMD ,即 ARMv7 规范可选的指令集扩展。NEON 提供一组标量/矢量指令和寄存器(与 FPU 共享),堪比 x86 中的 MMX/SSE/3DNow!。 要使其运行,需要 VFPv3-D32(32 个硬件 FPU 64 位寄存器,而非最小值 16 个)。

NDK 支持编译模块甚至支持 NEON 的具体源文件。因此,特定编译器标志支持同时使用 GCC ARM NEON 内联函数和 VFPv3-D32。

并非所有基于 ARMv7 的 Android 设备都支持 NEON,但支持的设备可能会因其支持标量/矢量指令而明显受益。 对于 x86 设备,NDK 还可将 NEON 指令转换为 SSE,但有多项限制。 如需了解详细信息,请参阅 x86 对 ARM NEON 内联函数的支持。

使用 LOCAL_ARM_NEON


要让 NDK 构建支持 NEON 的所有源文件,请在模块定义中包含以下行:

LOCAL_ARM_NEON := true

如果您要构建特别包含 NEON 代码路径的静态或共享库,构建支持 NEON 的所有源文件可能特别有用。

使用 .neon 后缀


为您的 LOCAL_SRC_FILES 变量列出源文件时,您可以选择使用 .neon 后缀表示要构建支持 NEON 的二进制文件。例如,以下示例构建一个支持 .neon 的文件,以及另一个不支持 NEON 的文件:

LOCAL_SRC_FILES := foo.c.neon bar.c

可以将 .neon 后缀与 .arm 后缀合并,以指定用于非 NEON 指令的 32 位 ARM 指令集。 在此定义中,arm 必须在 neon 前面。 例如:foo.c.arm.neon 可以运行,但 foo.c.neon.arm 无法运行。

构建要求


NEON 支持只适用于 armeabi-v7a 和 x86 ABI。如果 NDK 构建脚本在尝试构建 NEON 支持时遇到其他 ABI,NDK 构建脚本将退出。x86 通过转换标头提供部分 NEON 支持。 在 Android.mk 文件中使用如下检查很重要:

# define a static library containing our NEON codeifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86))include $(CLEAR_VARS)LOCAL_MODULE    := mylib-neonLOCAL_SRC_FILES := mylib-neon.cLOCAL_ARM_NEON  := trueinclude $(BUILD_STATIC_LIBRARY)endif # TARGET_ARCH_ABI == armeabi-v7a || x86

运行时检测


您的应用必须执行运行时检测,以确认支持 NEON 的机器代码能够在目标设备上运行。 这是因为并非所有基于 ARMv7 的 Android 设备都支持 NEON。应用可以使用此 NDK 随附的 cpufeatures 库执行此检查。

应显式确认 android_getCpuFamily() 返回 ANDROID_CPU_FAMILY_ARMandroid_getCpuFeatures() 返回包含 ANDROID_CPU_ARM_FEATURE_NEON flag 集的值。 例如: 

#include <cpu-features.h>......if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&    (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0){    // use NEON-optimized routines    ...}else{    // use non-NEON fallback routines instead    ...}...

示例代码


NDK 的 hello-neon 示例的源代码举例说明了如何同时使用 cpufeatures 库和 NEON 内联函数。 此示例对使用 C 版本的 FIR 过滤循环实现微小基准,对支持 NEON 的设备实现 NEON 优化的基准。


原创粉丝点击