NDK は、一般に NEON と呼ばれる ARM Advanced SIMD をサポートしています。NEON は、ARMv7 および ARMv8 向けのオプションの命令セット拡張です。NEON は、x86 環境の MMX / SSE / 3DNow! と同等のスカラー / ベクター命令とレジスタ(FPU と共有)を提供します。
ARMv8 ベース(「arm64」)の Android デバイスはすべて、NEON をサポートしています。API レベル 21 以降を搭載したすべてのデバイスを含め、ARMv7 ベース(「32 ビット」)のほぼすべての Android デバイスが NEON をサポートしています。NDK は、どちらもデフォルトで NEON を有効にしています。
非常に古いデバイスをターゲットにする場合は、Google Play Console で互換性のないデバイスを除外できます。アプリのコンソールを使用して、影響を受けるデバイスの数を確認することもできます。
または、最大限の互換性を確保するため、32 ビットコードでランタイム検出を実行して、ターゲット デバイスで NEON コードを実行できることを確認できます。このチェックは、CPU 機能で説明されているいずれかのオプションを使用して実行できます。
C および C++ コードで NEON イントリンシックを使用して、Advanced SIMD 拡張機能を利用できます。NEON イントリンシックと NEON プログラミングの全般について詳しくは、Armv8-A 向け 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 へ - 自動移植ソリューション、ヒントとコツをご覧ください。
サンプルコード
hello-neon sample は、cpufeatures
ライブラリと NEON イントリンシックを同時に使用する方法の例です。このサンプルは、FIR フィルタループの小規模なベンチマークを、C バージョンと、NEON 対応デバイス向けの NEON 最適化バージョンで実装する例です。