El NDK admite Advanced SIMD de ARM, más conocida como Neon, una extensión opcional del conjunto de instrucciones para ARMv7 y ARMv8. NEON proporciona instrucciones escalares y vectoriales, así como registros (que se comparten con la FPU) similares a MMX/SSE/3DNow! en el entorno x86.
Casi todos los dispositivos Android basados en ARMv7 admiten Neon, incluidos todos los dispositivos que se lanzaron con nivel de API 21 o versiones posteriores. El NDK habilita Neon de forma predeterminada.
Todos los dispositivos Android basados en ARMv8 admiten Neon.
El NDK admite la compilación de módulos o, incluso, de archivos de origen específicos que admiten Neon. Puedes usar las funciones intrínsecas de Neon en el código C y C++ para aprovechar la extensión Advanced SIMD. La Guía del programador de Neon para Armv8-A proporciona más información sobre los objetos intrínsecos de Neon y la programación de Neon en general.
Compilación
Cómo habilitar Neon a nivel global
ndk-build
ndk-build no permite habilitar Neon a nivel global. Para habilitar Neon en toda una aplicación ndk-build, implementa los pasos por módulo en cada módulo de tu aplicación.
CMake
Pasa -DANDROID_ARM_NEON=ON
cuando invoques a CMake. Si compilas con Android Studio o Gradle, configura la siguiente opción en tu archivo build.gradle:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=ON"
}
}
}
}
Cómo habilitar Neon por módulo
ndk-build
Para compilar todos los archivos de origen en un módulo ndk-build con NEON, agrega lo siguiente a la definición del módulo en tu archivo Android.mk:
LOCAL_ARM_NEON := true
CMake
Para compilar todos los archivos de origen en un destino CMake con NEON, agrega lo siguiente a tu archivo CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()
${TARGET}
se reemplaza por el nombre de tu biblioteca.
Puede resultarte muy útil compilar todos los archivos de origen de manera que admitan Neon si quieres compilar una biblioteca compartida o estática que contenga específicamente solo código Neon.
Cómo habilitar Neon por archivo fuente
ndk-build
Cuando detallas los archivos de origen para tu variable LOCAL_SRC_FILES
, puedes usar el sufijo .neon
a fin de indicar que quieres compilar archivos individuales que admiten Neon. Por ejemplo, a continuación, se compila un archivo (foo.c
) que admite Neon y otro (bar.c
) que no:
LOCAL_SRC_FILES := foo.c.neon bar.c
Puedes combinar el sufijo .neon
con .arm
, que especifica el conjunto de instrucciones de ARM de 32 bits (en lugar de Thumb2) para las instrucciones que no son de Neon.
En ese caso, .arm
debe aparecer antes que .neon
. Por ejemplo: foo.c.arm.neon
funciona, pero foo.c.neon.arm
no.
CMake
Para compilar un archivo de origen específico con Neon, agrega lo siguiente a tu archivo CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()
Detección del tiempo de ejecución
Casi todos los dispositivos Android basados en ARMv7 admiten Neon, incluidos todos los dispositivos que se lanzaron con nivel de API 21 o versiones posteriores. El NDK habilita Neon de forma predeterminada. Para lograr máxima compatibilidad, el código de 32 bits puede realizar la detección del tiempo de ejecución para confirmar que se puede ejecutar el código de Neon en el dispositivo de destino. La app puede realizar esta verificación con cualquiera de las opciones mencionadas en Funciones de CPU.
Como opción alternativa, se pueden filtrar dispositivos no compatibles en Google Play Console. Además, puedes usar la consola para ver cuántos dispositivos se verían afectados.
Compatibilidad entre plataformas para x86
El NDK admite la compilación entre plataformas de tus funciones intrínsecas existentes de ARM SIMD (Neon) en código x86 de SSE por medio del archivo NEON_2_SSE.h de terceros. Para obtener más información sobre este tema, consulta De ARM NEON a Intel SSE: la solución de portabilidad automática, sugerencias y trucos (en inglés).
Código de muestra
La muestra hello-neon proporciona un ejemplo de cómo usar la biblioteca cpufeatures
y las funciones intrínsecas de Neon al mismo tiempo. En esta muestra, se implementa una pequeña referencia para un bucle de filtros FIR con una versión C y una optimizada para Neon correspondiente a dispositivos compatibles con Neon.