Neon 支援

NDK 支援 ARM 進階 SIMD (通常稱為 Neon),這是一種適用於 ARMv7 和 ARMv8 的可選指令集擴充功能。Neon 提供純量/向量指令和暫存器 (與 FPU 共用),與 x86 中的 MMX/SSE/3DNow! 類似。

所有 ARMv8 型 (「arm64」) Android 裝置都支援 Neon。幾乎所有 ARMv7 型 (「32 位元」) Android 裝置都支援 Neon,包括搭載 API 級別 21 以上版本的所有裝置。NDK 預設會為 Arm ABI 啟用 Neon。

如果您以非常舊的裝置為目標,可以在 Google Play 管理中心篩選出不相容的裝置,您也可以透過應用程式的管理中心,查看受影響的裝置數量。

或者,為提高相容性,32 位元程式碼可以透過執行階段偵測功能,確認 Neon 程式碼可在目標裝置上執行。應用程式可以使用「CPU 功能」中提及的任一選項執行這項檢查。

您不應在 C/C++ 程式碼中編寫明確的 Neon 內建函式。Clang 的 可攜式向量型別會自動使用 Neon 指令。Clang 的 Neon 內建函式實際上只是可攜式型別的非可攜式包裝函式,因此編寫 Neon 內建函式不會讓程式碼比使用可攜式型別更快,只會降低可攜性。

建構

全域停用 Neon

ndk-build

ndk-build 不支援全域停用 Neon。如要為整個 ndk-build 應用程式停用 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 程式碼中。如要進一步瞭解這個主題,請參閱從 ARM NEON 到 Intel SSE:自動移植解決方案、提示與秘訣

程式碼範例

向量化範例會示範如何使用各種向量化工具實作矩陣乘法,並比較這些工具的效能。