Das NDK unterstützt ARM Advanced SIMD, allgemein als Neon bekannt, eine optionale Befehlssatzerweiterung für ARMv7 und ARMv8. Neon bietet Skalar-/Vektor-Befehle und Register (die mit der FPU geteilt werden), die mit MMX/SSE/3DNow! in der x86-Welt vergleichbar sind.
Alle ARMv8-basierten („arm64“) Android-Geräte unterstützen Neon. Fast alle ARMv7-basierten („32-Bit“) Android-Geräte unterstützen Neon, einschließlich aller Geräte, die mit API-Level 21 oder höher ausgeliefert wurden. Das NDK aktiviert Neon standardmäßig für beide Arm-ABIs.
Wenn Sie sehr alte Geräte als Zielgruppe haben, können Sie inkompatible Geräte in der Google Play Console herausfiltern. In der Console für Ihre App können Sie auch sehen, wie viele Geräte davon betroffen wären.
Alternativ kann 32-Bit-Code zur maximalen Kompatibilität eine Laufzeiterkennung durchführen, um zu bestätigen, dass Neon-Code auf dem Zielgerät ausgeführt werden kann. Eine App kann diese Prüfung mit einer der unter CPU-Funktionen genannten Optionen durchführen.
Sie sollten in Ihrem C/C++-Code keine expliziten Neon-Intrinsics schreiben. Bei den portablen Vektortypen von Clang werden automatisch Neon-Befehle verwendet. Die Neon-Intrinsics von Clang sind eigentlich nur ein nicht portabler Wrapper um die portablen Typen. Wenn Sie also Neon-Intrinsics schreiben, wird Ihr Code nicht schneller als bei Verwendung der portablen Typen, sondern nur weniger portabel.
Entwickeln
Neon global deaktivieren
ndk-build
Mit ndk-build kann Neon nicht global deaktiviert werden. Wenn Sie Neon für eine gesamte ndk-build-Anwendung deaktivieren möchten, wenden Sie die Schritte für jedes Modul auf alle Module in Ihrer Anwendung an.
CMake
Übergeben Sie -DANDROID_ARM_NEON=ON
beim Aufrufen von CMake. Wenn Sie mit Android Studio/Gradle erstellen, legen Sie die folgende Option in Ihrer build.gradle-Datei fest:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Neon pro Modul deaktivieren
ndk-build
Wenn Sie alle Quelldateien in einem ndk-build-Modul ohne Neon erstellen möchten, fügen Sie der Moduldefinition in Ihrer Android.mk-Datei Folgendes hinzu:
LOCAL_ARM_NEON := false
CMake
Wenn Sie alle Quelldateien in einem CMake-Ziel ohne Neon erstellen möchten, fügen Sie Folgendes in Ihre CMakeLists.txt-Datei ein:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Dabei wird ${TARGET}
durch den Namen Ihrer Bibliothek ersetzt.
Plattformübergreifende Unterstützung für x86
Das NDK unterstützt die plattformübergreifende Kompilierung Ihrer vorhandenen ARM SIMD-Funktionen (Neon) in x86 SSE-Code mithilfe von NEON_2_SSE.h von Drittanbietern. Weitere Informationen zu diesem Thema finden Sie unter From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks.
Beispielcode
Im Vectorization Sample wird gezeigt, wie Sie verschiedene Vektorisierungstools verwenden, um eine Matrixmultiplikation zu implementieren, und es wird die Leistung der einzelnen Tools verglichen.