Assistenza al neon

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 scegli 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 verificare che il codice Neon possa essere eseguito sul dispositivo di destinazione. Un'app può eseguire questo controllo utilizzando una delle opzioni menzionate in Funzionalità della CPU.

Non devi scrivere intrinseci Neon espliciti nel tuo codice C/C++. I tipi di vettori portabili di Clang utilizzeranno automaticamente le istruzioni Neon. Gli intrinseci Neon di Clang sono in realtà solo un wrapper non portabile intorno ai tipi portabili, quindi scrivere intrinseci Neon non renderà il tuo codice più veloce dell'utilizzo dei tipi portabili, ma solo meno portabile.

Crea

Disattivare Neon a livello globale

ndk-build

ndk-build non supporta la disattivazione globale di Neon. 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 compilazione con Android Studio/Gradle, imposta la seguente opzione in build.gradle:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=OFF"
            }
        }
    }
}

Disattivare Neon per modulo

ndk-build

Per creare tutti i file sorgente in un modulo ndk-build senza Neon, aggiungi quanto segue alla definizione del modulo in Android.mk:

LOCAL_ARM_NEON := false

CMake

Per compilare tutti i file sorgente 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 tua libreria.

Supporto multipiattaforma per x86

NDK supporta la compilazione cross-platform delle funzioni intrinseche ARM SIMD (Neon) esistenti in codice x86 SSE, tramite l'utilizzo di NEON_2_SSE.h di terze parti. Per saperne di più su questo argomento, consulta Da ARM NEON a Intel SSE: la soluzione di porting automatico, suggerimenti e trucchi.

Codice di esempio

L'esempio di vettorizzazione mostra come utilizzare una serie di strumenti di vettorizzazione per implementare una moltiplicazione di matrici e confronta il loro rendimento.