Assistenza al neon

L'NDK supporta ARM Advanced SIMD, comunemente noto come Neon, un'estensione opzionale del set di istruzioni per ARMv7 e ARMv8. Neon fornisce istruzioni e registri scalari/vettori (condivisi con l'FPU) paragonabili a MMX/SSE/3DNow! nel mondo x86.

Tutti i dispositivi Android basati su ARMv8 ("arm64") supportano il sistema Neon. Quasi tutti i dispositivi Android basati su ARMv7 ("32 bit") supportano Neon, compresi tutti quelli forniti con livello API 21 o successivo. NDK attiva il neon per impostazione predefinita per entrambi.

Se scegli come target dispositivi molto vecchi, puoi filtrare i dispositivi non compatibili su Google Play Console. Puoi anche usare la console dell'app per vedere quanti dispositivi potrebbero influire.

In alternativa, per la massima compatibilità, il codice a 32 bit può eseguire il rilevamento di runtime per confermare 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.

Puoi usare le funzioni intrinseche Neon nel codice C e C++ per sfruttare l'estensione SIMD avanzata. La Neon Programmer's Guide for Armv8-A fornisce ulteriori informazioni sulle funzioni intrinseche e sulla programmazione Neon in generale.

Crea

Disattiva Neon a livello globale

build ndk

ndk-build non supporta la disattivazione di Neon a livello globale. Per disabilitare Neon un'intera applicazione ndk-build, applica i passaggi per modulo a ogni modulo della tua applicazione.

CMake

Supera -DANDROID_ARM_NEON=ON quando si richiama CMake. Se crei con Android Studio/Gradle, imposta la seguente opzione in build.gradle:

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

Disattiva Neon per modulo

build ndk

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 una destinazione CMake senza Neon, aggiungi quanto segue al tuo 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 raccolta.

Supporto multipiattaforma per x86

NDK supporta la compilazione multipiattaforma delle funzioni intrinseche ARM SIMD (Neon) esistenti in codice SSE x86, 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 portabilità automatica, suggerimenti utili.

Codice di esempio

L'esempio hello-neon fornisce un esempio di come utilizzare contemporaneamente la libreria cpufeatures e le funzionalità intrinseche Neon. Questo esempio implementa un benchmark minuscolo per un loop di filtro FIR con una versione C e una versione ottimizzata per Neon per i dispositivi che supportano Neon.