O NDK é compatível com o ARM Advanced SIMD, mais conhecido como Neon, uma extensão de conjunto de instruções opcional para ARMv7 e ARMv8. O Neon oferece registros e instruções de escala/vetor (compartilhados com a FPU) comparáveis a MMX/SSE/3DNow! da arquitetura x86.
Todos os dispositivos Android baseados em ARMv8 ("arm64") são compatíveis com o Neon. Quase todos os dispositivos Android baseados em ARMv7 ("32 bits") são compatíveis com o Neon, incluindo todos os dispositivos com API de nível 21 ou mais recente. O NDK ativa o Neon por padrão para as duas ABIs do Arm.
Se você segmentar dispositivos muito antigos, filtre os incompatíveis no Google Play Console. Você também pode usar o console do app para ver quantos dispositivos isso afetaria.
Como alternativa, para compatibilidade máxima, o código de 32 bits pode realizar detecção no ambiente de execução para confirmar se o código NEON pode ser executado no dispositivo de destino. Um app pode realizar essa verificação usando qualquer uma das opções mencionadas em Recursos da CPU.
Não escreva intrínsecos explícitos do Neon no seu código C/C++. Os tipos de vetores portáteis do Clang usam automaticamente instruções Neon. Os intrínsecos do Neon do Clang são apenas um wrapper não portátil em torno dos tipos portáteis. Portanto, escrever intrínsecos do Neon não torna seu código mais rápido do que usar os tipos portáteis, apenas menos portátil.
Criar
Desativar o Neon globalmente
ndk-build
O ndk-build não é compatível com a desativação do Neon globalmente. Para desativar o Neon em todo o app ndk-build, aplique as etapas a cada módulo no app.
CMake
Transmita -DANDROID_ARM_NEON=ON
ao invocar o CMake. Ao criar com o Android
Studio/Gradle, defina a seguinte opção no build.gradle:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Desativar o Neon por módulo
ndk-build
Para criar todos os arquivos de origem em um módulo ndk-build sem Neon, adicione o seguinte à definição do módulo no Android.mk:
LOCAL_ARM_NEON := false
CMake
Para criar todos os arquivos de origem em um destino do CMake sem Neon, adicione o seguinte ao CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Em que ${TARGET}
é substituído pelo nome da sua biblioteca.
Compatibilidade entre plataformas para x86
O NDK é compatível com a compilação entre plataformas das funções intrínsecas ARM SIMD (Neon) existentes para o código SSE x86 por meio do uso de NEON_2_SSE.h de terceiros. Para mais informações sobre esse assunto, consulte Do ARM NEON para o Intel SSE: a solução de portabilidade automática, dicas e sugestões (links em inglês).
Exemplo de código
O exemplo de vetorização demonstra como usar várias ferramentas de vetorização para implementar uma multiplicação de matrizes e compara o desempenho delas.