Neon 支援

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

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

如果您指定的是非常舊的裝置,可以在 Google Play 管理中心篩除不相容的裝置。您也可以使用應用程式的控制台,查看有多少裝置受到影響。

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

您可以在 C 和 C++ 程式碼中使用 Neon 內建函式,就能充分運用進階 SIMD 擴充功能。針對 Armv8-A 的 Neon 程式設計師指南中詳細介紹 Neon 內建函式,並提供 Neon 程式設計概覽。

建構

全域停用 Neon

ndk-build

ndk-build 不支援全域停用 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 最佳化版本的基準。