Compatibilité avec Neon

Le NDK est compatible avec ARM Advanced SIMD, communément appelé Neon, une extension facultative contenant un ensemble d'instructions pour ARMv7 et ARMv8. Neon fournit des instructions et des registres scalaires/vectoriels (partagés avec le FPU) comparables à MMX/SSE/3DNow! dans un environnement x86.

Tous les appareils Android basés sur ARMv8 ("arm64") sont compatibles avec Neon. Presque tous basés sur ARMv7 Appareils Android ("32 bits") compatibles avec Neon, y compris tous les appareils livrés avec Niveau d'API 21 ou ultérieur. Le NDK active Neon par défaut pour les deux.

Si vous ciblez des appareils très anciens, vous pouvez filtrer les appareils incompatibles sur le Google Play Console. Vous pouvez également utiliser la console de votre application pour voir combien sur les appareils concernés.

Pour une compatibilité maximale, le code 32 bits peut également exécuter pour confirmer que le code Neon peut être exécuté sur l'appareil cible. Une application peut effectuez cette vérification en utilisant l'une des options mentionnées dans Fonctionnalités du processeur.

Vous pouvez utiliser les fonctionnalités intrinsèques de Neon dans le code C et C++ pour tirer parti de l'extension Advanced SIMD. Le document Neon Programmer's Guide for Armv8-A (Guide du programmeur Neon pour Armv8-A) fournit plus d'informations sur les fonctionnalités intrinsèques de Neon et la programmation Neon en général.

Créer

Désactiver Neon de manière globale

ndk-build

ndk-build ne permet pas de désactiver Neon de manière globale. Pour désactiver Neon ndk-build, appliquez la procédure par module à chaque module de votre application.

CMake

Transmettez -DANDROID_ARM_NEON=ON lors de l'appel de CMake. Si vous compilez votre application à l'aide d'Android Studio/Gradle, définissez l'option suivante dans votre fichier build.gradle :

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=OFF"
            }
        }
    }
}

Désactiver Neon pour un module

ndk-build

Pour compiler tous les fichiers sources d'un module ndk-build sans Neon, ajoutez le à la définition du module dans votre fichier Android.mk:

LOCAL_ARM_NEON := false

CMake

Pour compiler tous les fichiers sources d'une cible CMake sans Neon, ajoutez la classe à votre fichier CMakeLists.txt:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()

Remplacez ${TARGET} par le nom de votre bibliothèque.

Compatibilité multiplate-forme pour x86

Le NDK est compatible avec la compilation multiplate-forme de vos fonctionnalités intrinsèques ARM SIMD (Neon) dans le code SSE x86 à l'aide du fichier tiers NEON_2_SSE.h. Pour plus d'informations sur ce sujet, consultez l'article From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks.

Exemple de code

L'exemple hello-neon illustre l'utilisation simultanée de la bibliothèque cpufeatures et des fonctionnalités intrinsèques de Neon. Il met en œuvre une petite analyse comparative en créant une boucle de filtre RIF (réponse impulsionnelle finie) avec une version C et une version optimisée pour Neon pour les appareils compatibles.