NDK 支持 ARM 高级 SIMD(通常称为 Neon),一种适用于 ARMv7 和 ARMv8 的可选扩展指令集。Neon 提供标量/矢量指令和寄存器(与 FPU 共享),与 x86 中的 MMX/SSE/3DNow! 类似。
所有基于 ARMv8(“arm64”)的 Android 设备均支持 Neon。几乎所有基于 ARMv7 的设备 (“32 位”)Android 设备支持 Neon,包括搭载 API 级别 21 或更高级别。NDK 默认为这两者启用 Neon。
如果您要定位版本过旧的设备, Google Play 管理中心。您还可以使用应用的控制台 这会影响到这些设备。
或者,为实现最大兼容性,32 位代码可以执行运行时 以确认 Neon 代码能够在目标设备上运行。应用可以 使用 CPU 功能。
您可以在 C 和 C++ 代码中使用 Neon 内建函数来充分利用高级 SIMD 扩展指令集。针对 Armv8-A 的 Neon 程序员指南详细介绍了 Neon 内建函数和 Neon 编程的概况。
构建
全局停用 Neon
ndk-build
ndk-build 不支持全局停用 Neon。要对整个设备停用 Neon,请执行以下操作: 将模块级步骤应用于测试库中的每个模块, 应用。
CMake
调用 CMake 时传递 -DANDROID_ARM_NEON=ON
。如果使用 Android Studio/Gradle 进行构建,请在 build.gradle 中设置以下选项:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
为每个模块停用 Neon
ndk-build
要在不使用 Neon 的 ndk-build 模块中构建所有源文件,请将 添加到 Android.mk 中的模块定义中:
LOCAL_ARM_NEON := false
CMake
要在不使用 Neon 的情况下在 CMake 目标中构建所有源文件,请将 添加到您的 CMakeLists.txt 中:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
其中 ${TARGET}
替换为您的库名称。
对 x86 提供跨平台支持
NDK 支持使用第三方 NEON_2_SSE.h 将您现有的 ARM SIMD (Neon) 内建函数跨平台编译到 x86 SSE 代码中。要详细了解此内容,请参阅 From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks(从 ARM NEON 到 Intel SSE:自动移植解决方案、提示与技巧)。
示例代码
hello-neon 示例举例说明了如何同时使用 cpufeatures
库和 Neon 内建函数。此示例实现了 C 版本的微小 FIR 过滤器循环基准,并针对支持 Neon 的设备实现了经 Neon 优化的基准。