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.
Presque tous les appareils Android basés sur ARMv7 sont compatibles avec Neon, y compris l'ensemble les appareils livrés avec le niveau d'API 21 ou supérieur. Le NDK active Neon par défaut.
Tous les appareils Android basés sur 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 (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.
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
Presque tous les appareils Android basés sur ARMv7 sont compatibles avec Neon, y compris l'ensemble les appareils livrés avec le niveau d'API 21 ou supérieur. Le NDK active Neon par défaut. Pour assurer une compatibilité maximale, le code 32 bits peut 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.