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.
Todos los dispositivos Android basados en ARMv8 ("arm64") admiten Neon. Casi todos los dispositivos Android basados en ARMv7 ("32 bits") admiten Neon, incluidos todos los dispositivos que se lanzaron con el nivel de API 21 o versiones posteriores. El NDK habilita Neon de forma predeterminada para ambas ABI de Arm.
Si segmentas tu app para dispositivos muy antiguos, puedes filtrar los dispositivos no compatibles en Google Play Console. También puedes usar la consola de tu app para ver cuántos dispositivos se verían afectados.
Como alternativa, 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. Una app puede realizar esta verificación con cualquiera de las opciones mencionadas en Funciones de CPU.
No debes escribir funciones intrínsecas de Neon explícitas en tu código C/C++. Los tipos de vectores portátiles de Clang usarán automáticamente instrucciones de Neon. Las funciones intrínsecas de Neon de Clang son, en realidad, solo un wrapper no portátil alrededor de los tipos portátiles, por lo que escribir funciones intrínsecas de Neon no hará que tu código sea más rápido que usar los tipos portátiles, sino menos portátil.
Compilación
Cómo inhabilitar Neon a nivel global
ndk-build
ndk-build no permite inhabilitar Neon a nivel global. Para inhabilitar 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=OFF"
}
}
}
}
Cómo inhabilitar Neon por módulo
ndk-build
Para compilar todos los archivos de origen en un módulo ndk-build sin Neon, agrega lo siguiente a la definición del módulo en tu archivo Android.mk:
LOCAL_ARM_NEON := false
CMake
Para compilar todos los archivos de origen en un destino CMake sin Neon, agrega lo siguiente a tu archivo CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
${TARGET}
se reemplaza por el nombre de tu biblioteca.
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
El ejemplo de vectorización muestra cómo usar diversas herramientas de vectorización para implementar una multiplicación de matrices y compara su rendimiento.