android ndk NEON Support

NEON Support

On this page

  1. Using LOCAL_ARM_NEON
  2. Using the .neon Suffix
  3. Build Requirements
  4. Runtime Detection
  5. Sample Code

The NDK supports the ARM Advanced先进,高级 SIMD单指令多数据玲构(Single Instruction Multiple Data), an optional instruction-set extension of the ARMv7 spec. NEON provides a set of scalar无向量 /vector instructions and registers (shared with the FPU浮点运算单元(Float Point Unit)) comparable to MMX多媒体增强指令集(Multi Media Extension)/SSE扩展(Streaming Simd Extensions)/3DNow! in the x86 world. To function, it requires VFP( 可变因素编程Variable Factor Programming)v3-D32 (32 hardware FPU 64-bit registers, instead of the minimum of 16).

The NDK supports the compilation of modules or even specific source files with support for NEON. As a result, a specific compiler flag enables the use of GCC ARM NEON intrinsics(内联函数 函数)and VFPv3-D32 at the same time.

Not all ARMv7-based Android devices support NEON, but devices that do may benefit significantly有意义的,显著的 from its support for scalar/vector instructions. For x86 devices, the NDK can also translate NEON instructions into SSE, although with several restrictions. For more information, see x86 Support for ARM NEON Intrinsics.

Using LOCAL_ARM_NEON


To have the NDK build all its source files with NEON support, include the following line in your module definition:

LOCAL_ARM_NEON := true

It can be especially特别 useful to build all source files with NEON support if you want to build a static or shared library that specifically contains NEON code paths.

Using the .neon Suffix后缀


When listing source files for your LOCAL_SRC_FILES variable, you have the option of using the .neon suffix to indicate that you want to build binaries with NEON support. For example, the following example builds one file with .neon support, and another without it:

LOCAL_SRC_FILES := foo.c.neon bar.c

You can combine the .neon suffix with the .arm suffix, which specifies the 32-bit ARM instruction set for non-NEON instructions. In such a definition, arm must come before neon. For example: foo.c.arm.neon works, butfoo.c.neon.arm does not.

Build Requirements


NEON support only works with the armeabi-v7a and x86 ABIs. If the NDK build scripts encounter遭遇 other ABIs while attempting to build with NEON support, the NDK build scripts exit. x86 provides partial NEON support viatranslation header. It is important to use checks like the following in your Android.mk file:

# 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

Runtime Detection检测


Your app must perform runtime detection to confirm that NEON-capable machine code can be run on the target device. This is because not all ARMv7-based Android devices support NEON. The app can perform this check using the cpufeatures library that comes with this NDK.

You should explicitly明确的 check that android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, and thatandroid_getCpuFeatures() returns a value including the ANDROID_CPU_ARM_FEATURE_NEON flag set. For example:

#include 
...
...
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
    ...
}

...

Sample Code


The source code for the NDK's hello-neon sample provides an example of how to use the cpufeatures library and NEON intrinsics at the same time. This sample implements a tiny微小的 benchmark(基准;标准检查程序) for a FIR filter loop using a C version, and a NEON-optimized优化 one for devices that support it.

你可能感兴趣的:(ndk)