文章的内容是从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_ARM,android_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 优化的基准。
本文介绍了如何在Android NDK中利用ARM NEON指令集来优化应用程序性能,包括配置支持NEON的源文件、构建要求及运行时检测方法。

587

被折叠的 条评论
为什么被折叠?



