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 les appareils Android basés sur ARMv7 ("32 bits") sont compatibles avec Neon, y compris tous les appareils livrés avec le niveau d'API 21 ou supérieur. Le NDK active Neon par défaut dans les deux cas.

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

Pour une compatibilité optimale, le code 32 bits peut également effectuer une détection de l'environnement d'exécution afin de vérifier que le code Neon peut être exécuté sur l'appareil cible. Une application peut effectuer cette vérification à l'aide de 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 dans l'ensemble d'une application ndk-build, appliquez la procédure par module à chaque module de l'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 ce qui suit à la définition du module dans votre fichier Android.mk:

LOCAL_ARM_NEON := false

CMake

Pour compiler tous les fichiers sources dans une cible CMake sans Neon, ajoutez les éléments suivants à 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.