Neon-Unterstützung

Das NDK unterstützt ARM Advanced SIMD, allgemein bekannt als Neon, eine optionale Befehlssatzerweiterung für ARMv7 und ARMv8. Neon bietet Skalar-/Vektorbefehle und -Register (gemeinsam mit der FPU genutzt), die mit MMX/SSE/3DNow! in der x86-Welt vergleichbar sind.

Alle ARMv8-basierten Android-Geräte („arm64“) unterstützen Neon. Fast alle ARMv7-basierten Android-Geräte („32-Bit“) 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 in der Google Play Console inkompatible Geräte herausfiltern. In der Console 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-Funktionengenannten Optionen durchführen.

Sie sollten in Ihrem C/C++-Code keine expliziten Neon-Intrinsics schreiben. Die portablen Vektortypen von Clang verwenden automatisch Neon-Befehle. Die Neon-Intrinsics von Clang sind eigentlich nur ein nicht portabler Wrapper um die portablen Typen. Das Schreiben von Neon-Intrinsics macht Ihren Code also nicht schneller als die Verwendung der portablen Typen, sondern nur weniger portabel.

Build

Neon global deaktivieren

ndk-build

ndk-build unterstützt das globale Deaktivieren von Neon nicht. Wenn Sie Neon für eine gesamte ndk-build-Anwendung deaktivieren möchten, wenden Sie die Schritte pro Modul auf jedes Modul in Ihrer Anwendung an.

CMake

Übergeben Sie beim Aufrufen von CMake -DANDROID_ARM_NEON=ON. Wenn Sie mit Android Studio/Gradle erstellen, legen Sie die folgende Option in Ihrer build.gradle 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 Folgendes hinzu:

LOCAL_ARM_NEON := false

CMake

Wenn Sie alle Quelldateien in einem CMake-Ziel ohne Neon erstellen möchten, fügen Sie Ihrer CMakeLists.txt Folgendes hinzu:

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-Intrinsics (Neon) in x86 SSE-Code mithilfe der Drittanbieter- Headerdatei NEON_2_SSE.h. Weitere Informationen finden Sie unter From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks.

Beispielcode

Im Beispiel zur Vektorisierung wird gezeigt, wie Sie verschiedene Vektorisierung tools verwenden, um eine Matrixmultiplikation zu implementieren, und die Leistung der Tools wird verglichen.