L'NDK supporta ARM Advanced SIMD, comunemente noto come Neon, un'estensione del set di istruzioni facoltativa per ARMv7 e ARMv8. Neon fornisce istruzioni e registri scalari/vettoriali (condivisi con la FPU) paragonabili a MMX/SSE/3DNow! nel mondo x86.
Tutti i dispositivi Android basati su ARMv8 ("arm64") supportano Neon. Quasi tutti i dispositivi Android basati su ARMv7 ("32 bit") supportano Neon, inclusi tutti i dispositivi forniti con il livello API 21 o versioni successive. L'NDK abilita Neon per impostazione predefinita per entrambe le ABI ARM.
Se hai come target dispositivi molto vecchi, puoi filtrare i dispositivi incompatibili su Google Play Console. Puoi anche utilizzare la console per la tua app per vedere quanti dispositivi sarebbero interessati.
In alternativa, per la massima compatibilità, il codice a 32 bit può eseguire il rilevamento in fase di runtime per confermare che il codice Neon può essere eseguito sul dispositivo di destinazione. Un'app può eseguire questo controllo utilizzando una delle opzioni menzionate in Funzionalità della CPU.
Non devi scrivere intrinsici Neon espliciti nel codice C/C++. I tipi di vettori portatili di Clang utilizzeranno automaticamente le istruzioni Neon. Gli intrinsici Neon di Clang sono in realtà solo un wrapper non portatile intorno ai tipi portatili, quindi la scrittura di intrinsici Neon non renderà il codice più veloce rispetto all'utilizzo dei tipi portatili, ma solo meno portatile.
Build
Disabilitare Neon a livello globale
ndk-build
ndk-build non supporta la disattivazione di Neon a livello globale. Per disattivare Neon per un'intera applicazione ndk-build, applica i passaggi per modulo a ogni modulo dell'applicazione.
CMake
Passa -DANDROID_ARM_NEON=ON quando richiami CMake. Se esegui la build con Android Studio/Gradle, imposta la seguente opzione in build.gradle:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Disabilitare Neon per modulo
ndk-build
Per creare tutti i file di origine in un modulo ndk-build senza Neon, aggiungi quanto segue alla definizione del modulo in Android.mk:
LOCAL_ARM_NEON := false
CMake
Per creare tutti i file di origine in un target CMake senza Neon, aggiungi quanto segue a CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Dove ${TARGET} viene sostituito con il nome della libreria.
Supporto multipiattaforma per x86
NDK supporta la compilazione multipiattaforma delle funzioni intrinseche ARM SIMD (Neon) esistenti nel codice x86 SSE, tramite l'utilizzo di NEON_2_SSE.h di terze parti. Per ulteriori informazioni su questo argomento, consulta Da ARM NEON a Intel SSE: la soluzione di porting automatico, suggerimenti e trucchi.
Codice campione
L'esempio di vettorializzazione mostra come utilizzare una varietà di strumenti di vettorializzazione per implementare una moltiplicazione di matrici e confronta le loro prestazioni.