Assistenza al neon

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.