NEON サポート

NDK は、一般に NEON と呼ばれる ARM Advanced SIMD をサポートしています。NEON は、ARMv7 および ARMv8 向けのオプションの命令セット拡張です。NEON は、x86 環境の MMX / SSE / 3DNow! と同等のスカラー / ベクター命令とレジスタ(FPU と共有)を提供します。

ARMv8 ベース(「arm64」)の Android デバイスはすべて NEON をサポートしています。ほぼすべての ARMv7 ベース (「32 ビット」)Android デバイスは NEON をサポートしており、 API レベル 21 以降。NDK では、デフォルトで両方とも NEON が有効になっています。

非常に古いデバイスをターゲットにする場合は、 Google Play Console。また、コンソールを使用して、Google Cloud の 可能性があります。

または、最大限の互換性を確保するため、32 ビットコードでランタイム処理を実行可能 NEON コードを実行できることを確認します。アプリは 上記のいずれかの方法で、このチェックを実行します。 CPU 機能

C および C++ コードで NEON イントリンシックを使用して、Advanced SIMD 拡張機能を利用できます。NEON イントリンシックと NEON プログラミングの全般について詳しくは、Armv8-A 向け 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 sample は、cpufeatures ライブラリと NEON イントリンシックを同時に使用する方法の例です。このサンプルは、FIR フィルタループの小規模なベンチマークを、C バージョンと、NEON 対応デバイス向けの NEON 最適化バージョンで実装する例です。