Compatibilité avec Neon

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

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 ARMv7 ne sont pas compatibles avec Neon, mais ceux qui le sont bénéficient ainsi de la prise en charge des instructions scalaires/vectorielles par cette extension.

Tous les appareils ARMv8 sont compatibles avec Neon.

Le NDK permet de créer des modules ou des fichiers sources spécifiques compatibles avec Neon. 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 fournit plus d'informations sur les fonctionnalités intrinsèques de Neon et la programmation Neon en général.

Compilation

Activer Neon de manière globale

ndk-build

ndk-build ne permet pas d'activer Neon de manière globale. Pour activer Neon sur l'ensemble d'une application ndk-build, appliquez la procédure "Activer Neon pour un 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=ON"
            }
        }
    }
}

Activer Neon pour un module

ndk-build

Pour créer tous les fichiers sources d'un module ndk-build avec NEON, ajoutez ce qui suit à la définition du module dans votre fichier Android.mk :

LOCAL_ARM_NEON := true

CMake

Pour créer tous les fichiers sources d'une cible CMake avec NEON, ajoutez ce qui suit à votre fichier CMakeLists.txt :

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

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

Il peut être particulièrement utile de créer tous les fichiers sources de sorte qu'ils soient compatibles avec Neon si vous souhaitez compiler une bibliothèque statique ou partagée contenant spécifiquement du code Neon.

Activer Neon pour un fichier source

ndk-build

Lorsque vous répertoriez des fichiers sources pour votre variable LOCAL_SRC_FILES, vous pouvez utiliser le suffixe .neon pour indiquer que vous souhaitez créer des fichiers individuels compatibles avec Neon. Par exemple, le code suivant crée un fichier (foo.c) qui est compatible avec Neon et un autre (bar.c) qui ne l'est pas :

LOCAL_SRC_FILES := foo.c.neon bar.c

Vous pouvez associer le suffixe .neon au suffixe .arm, qui spécifie l'ensemble d'instructions ARM 32 bits (au lieu de Thumb2) pour les instructions non-Neon. Dans ce cas, .arm doit précéder .neon. Par exemple, foo.c.arm.neon fonctionne, mais pas foo.c.neon.arm.

CMake

Pour créer un fichier source spécifique avec Neon, ajoutez les éléments suivants à votre fichier CMakeLists.txt :

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()

Détecter l'environnement d'exécution

Tous les appareils Android basés sur ARMv7 ne sont pas compatibles avec Neon. Pour assurer une compatibilité maximale, le code 32 bits doit procéder à la détection de l'environnement d'exécution afin de vérifier que le code Neon peut être exécuté sur l'appareil cible. L'application peut effectuer cette vérification à l'aide de l'une des options mentionnées dans Fonctionnalités du processeur.

Une autre solution consiste à filtrer les appareils incompatibles dans la Google Play Console. Celle-ci peut également vous indiquer le nombre d'appareils concernés.

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.