NDK编译——NEON支持

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


NEON 支持

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 code
ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86))
include $(CLEAR_VARS)
LOCAL_MODULE    := mylib-neon
LOCAL_SRC_FILES := mylib-neon.c
LOCAL_ARM_NEON  := true
include $(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 优化的基准。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值