L'NDK supporta ARM Advanced SIMD, comunemente nota come Neon, un'estensione facoltativa per il set di istruzioni per ARMv7 e ARMv8. Neon fornisce istruzioni scalari/vettoriali e registri (condivisi con la FPU) paragonabili a MMX/SSE/3DNow! nel mondo x86.
Quasi tutti i dispositivi Android basati su ARMv7 supportano Neon, inclusi tutti i dispositivi con livello API 21 o successivi. L'NDK abilita Neon per impostazione predefinita.
Tutti i dispositivi Android basati su ARMv8 supportano Neon.
L'NDK supporta la compilazione di moduli o anche di file di origine specifici con supporto per Neon. Puoi utilizzare Neon Intrinsics nel codice C e C++ per sfruttare l'estensione SIMD avanzata. La Guida ai programmi per neon per Armv8-A fornisce ulteriori informazioni sugli aspetti al neon e sulla programmazione al neon in generale.
Build
Abilita Neon a livello globale
build-ndk
La funzionalità ndk-build non supporta l'attivazione di Neon a livello globale. Per abilitare Neon un'intera applicazione ndk-build, applica i passaggi per modulo a ogni modulo nell'applicazione.
C-Make
Supera -DANDROID_ARM_NEON=ON
quando richiami CMake. Se crei con Android Studio/Gradle, imposta la seguente opzione in build.gradle:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=ON"
}
}
}
}
Abilita Neon per modulo
build-ndk
Per creare tutti i file di origine in un modulo ndk-build con NEON, aggiungi quanto segue alla definizione del modulo nel tuo Android.mk:
LOCAL_ARM_NEON := true
C-Make
Per creare tutti i file di origine in una destinazione CMake con NEON, aggiungi quanto segue al file CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()
Dove ${TARGET}
è sostituito dal nome della tua raccolta.
Può essere particolarmente utile creare tutti i file di origine con il supporto di Neon se vuoi creare una libreria statica o condivisa che contiene specificamente il codice solo per Neon.
Attiva Neon per file di origine
build-ndk
Quando elenchi i file di origine per la variabile LOCAL_SRC_FILES
, hai la possibilità di utilizzare il suffisso .neon
per indicare che vuoi creare singoli file con il supporto di Neon. Ad esempio, quanto segue crea un
file (foo.c
) con il supporto del Neon e un altro (bar.c
) senza:
LOCAL_SRC_FILES := foo.c.neon bar.c
Puoi combinare il suffisso .neon
con il suffisso .arm
, che specifica
il set di istruzioni ARM a 32 bit (anziché Thumb2) per le istruzioni non neon.
In questo caso, .arm
deve precedere .neon
. Ad esempio: foo.c.arm.neon
funziona, ma foo.c.neon.arm
no.
C-Make
Per creare un file di origine specifico con Neon, aggiungi quanto segue al file CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()
Rilevamento runtime
La maggior parte dei dispositivi Android basati su ARMv7 supporta Neon, inclusi tutti i dispositivi con livello API 21 o versioni successive. L'NDK abilita Neon per impostazione predefinita. Per la massima compatibilità, il codice a 32 bit può eseguire il rilevamento del runtime per verificare che il codice Neon possa essere eseguito sul dispositivo di destinazione. L'app può eseguire questo controllo utilizzando una delle opzioni indicate in Funzionalità della CPU.
In alternativa, è possibile filtrare i dispositivi non compatibili su Google Play Console. Puoi utilizzare la console anche per vedere quanti dispositivi potrebbero essere interessati.
Supporto multipiattaforma per x86
NDK supporta la compilazione multipiattaforma delle tue funzioni intrinseche ARM SIMD (Neon) nel codice x86 SSE, utilizzando l'uso di terze parti di NEON_2_SSE.h. Per ulteriori informazioni su questo argomento, consulta Da ARM NEON a Intel SSE, la soluzione di trasferimento automatico, suggerimenti utili.
Codice campione
L'esempio di hello-neon fornisce un esempio di come utilizzare contemporaneamente la libreria cpufeatures
e gli elementi intrinseci al neon. Questo esempio implementa un piccolo benchmark per un loop di filtri FIR con una versione C e una versione ottimizzata al neon per i dispositivi che supportano Neon.