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 ndk-build 應用程式,將各模組步驟套用至 應用程式。
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 程式碼中。如要進一步瞭解這個主題,請參閱從 ARM NEON 到 Intel SSE:自動移植解決方案、提示與秘訣。
程式碼範例
hello-neon 範例提供了例子,說明如何同時使用 cpufeatures
程式庫與 Neon 內建函式。這個範例實作了 C 版本的微小 FIR 篩選器迴圈基準,並針對支援 Neon 的裝置實作了 Neon 最佳化版本的基準。