Neon desteği

NDK, ARMv7 ve ARMv8 için isteğe bağlı bir talimat grubu uzantısı olan ve yaygın olarak bilinen Neon olarak bilinen ARM Gelişmiş SIMD'i destekler. Neon, x86 dünyasında MMX/SSE/3DNow!'a benzer skaler/vektör talimatları ve kayıtları (FPU ile paylaşılır) sağlar.

API düzeyi 21 veya sonraki sürümleri içeren tüm cihazlar da dahil olmak üzere neredeyse tüm ARMv7 tabanlı Android cihazlar Neon'u destekler. NDK, Neon'u varsayılan olarak etkinleştirir.

Tüm ARMv8 tabanlı Android cihazlar Neon'u destekler.

NDK, Neon desteğiyle modüllerin ve hatta belirli kaynak dosyaların derlenmesini destekler. Gelişmiş SIMD uzantısından yararlanmak için C ve C++ kodunda Neon yerleşik özelliklerini kullanabilirsiniz. Neon Programcı'nın Armv8-A Kılavuzu'nda, genel olarak Neon yapıları ve Neon programlaması hakkında daha fazla bilgi yer alır.

Topluluk

Neon'u dünya genelinde etkinleştir

NK-build

ndk-build, Neon'un küresel olarak etkinleştirilmesini desteklemez. Neon'ı bir ndk-build uygulamasının tamamı için etkinleştirmek istiyorsanız modül başına adımları uygulamanızdaki her modüle uygulayın.

Yapay Zeka

CMake'i çağırırken -DANDROID_ARM_NEON=ON değerini iletin. Android Studio/Gradle ile oluşturuyorsanız build.gradle dosyanızda aşağıdaki seçeneği ayarlayın:

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

Modül başına Neon'u etkinleştir

NK-build

Tüm kaynak dosyaları NEON ile bir ndk-build modülünde oluşturmak için aşağıdaki kodu Android.mk dosyanızdaki modül tanımına ekleyin:

LOCAL_ARM_NEON := true

Yapay Zeka

NEON ile bir CMake hedefinde bulunan tüm kaynak dosyaları oluşturmak için aşağıdakileri CMakeLists.txt dosyanıza ekleyin:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()

Burada ${TARGET} yerine kitaplığınızın adı gelir.

Özellikle neon kod içeren statik veya paylaşılan bir kitaplık oluşturmak istiyorsanız tüm kaynak dosyalarınızı Neon desteğiyle oluşturmak özellikle yararlı olabilir.

Kaynak dosya başına Neon'u etkinleştir

NK-build

LOCAL_SRC_FILES değişkeniniz için kaynak dosyaları listelerken, Neon desteğiyle dosyaları ayrı ayrı oluşturmak istediğinizi belirtmek için .neon son ekini kullanabilirsiniz. Örneğin, aşağıda Neon destekli bir dosya (foo.c) ve aşağıdakileri içermeyen bir dosya (bar.c) oluşturulur:

LOCAL_SRC_FILES := foo.c.neon bar.c

.neon son ekini, Neon olmayan talimatlar için Thumb2 yerine 32 bit ARM talimat grubunu belirten .arm son ekiyle birleştirebilirsiniz. Böyle bir durumda, .arm, .neon tarihinden önce gelmelidir. Örneğin: foo.c.arm.neon çalışır, ancak foo.c.neon.arm çalışmaz.

Yapay Zeka

Neon ile belirli bir kaynak dosya oluşturmak için aşağıdaki kodu CMakeLists.txt dosyanıza ekleyin:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()

Çalışma zamanı algılama

API düzeyi 21 veya sonraki sürümleri içeren tüm cihazlar da dahil olmak üzere ARMv7 tabanlı Android cihazların neredeyse tamamı Neon'u destekler. NDK, Neon'u varsayılan olarak etkinleştirir. Maksimum uyumluluk için 32 bit kod, neon kodun hedef cihazda çalıştırılabileceğini onaylamak amacıyla çalışma zamanı algılaması gerçekleştirebilir. Uygulama, CPU özellikleri bölümünde belirtilen seçeneklerden herhangi birini kullanarak bu kontrolü gerçekleştirebilir.

Alternatif olarak, Google Play Console'da uyumsuz cihazları filtreleyebilirsiniz. Bu durumun kaç cihazı etkileyeceğini görmek için de konsolu kullanabilirsiniz.

x86 için platformlar arası destek

NDK, üçüncü taraf NEON_2_SSE.h kullanılarak mevcut ARM SIMD (Neon) yerleşik işlevlerinizin x86 SSE kodunda platformlar arası derlemesini destekler. Bu konu hakkında daha fazla bilgi edinmek için ARM NEON'dan Intel SSE'ye otomatik taşıma çözümü, ipuçları ve püf noktaları sayfasına göz atın.

Örnek kod

hello-neon örneği, cpufeatures kitaplığının ve Neon intrinsics'in aynı anda nasıl kullanılacağına dair bir örnek sunar. Bu örnekte, C sürümü ile FIR filtre döngüsü için küçük bir karşılaştırma ve Neon destekleyen cihazlar için Neon için optimize edilmiş bir sürüm uygulanmaktadır.