Neon desteği

NDK, genellikle Neon olarak bilinen ve ARMv7 ve ARMv8 için isteğe bağlı bir talimat grubu uzantısı olan ARM Advanced SIMD'i destekler. Neon, x86 dünyasında MMX/SSE/3DNow! ile karşılaştırılabilir skalar/vektör talimatları ve kayıtları (FPU ile paylaşılır) sağlar.

Tüm ARMv8 tabanlı ("arm64") Android cihazlar Neon'u destekler. API düzeyi 21 veya sonraki sürümleri çalıştıran cihazlar da dahil olmak üzere, ARMv7 tabanlı ("32 bit") Android cihazların neredeyse tamamı Neon'u destekler. NDK, Neon'u her ikisi için de varsayılan olarak etkinleştirir.

Çok eski cihazları hedefliyorsanız uyumsuz cihazları Google Play Console'da filtreleyebilirsiniz. Bu durumun kaç cihazı etkileyeceğini görmek için uygulamanızın konsolunu da kullanabilirsiniz.

Alternatif olarak, maksimum uyumluluk için 32 bit kod, Neon kodun hedef cihazda çalıştırılabileceğini onaylamak için çalışma zamanı algılamayı gerçekleştirebilir. Bir uygulama, CPU özellikleri bölümünde bahsedilen seçeneklerden herhangi birini kullanarak bu kontrolü gerçekleştirebilir.

Gelişmiş SIMD uzantısından yararlanmak için C ve C++ kodunda Neon intrinsics özelliğini kullanabilirsiniz. Neon Programmer's Guide for Armv8-A (Arv8-A İçin Neon Programcı Kılavuzu) belgesinde, genel olarak Neon içsel öğeleri ve Neon programlama hakkında daha fazla bilgi yer alır.

Topluluk

Neon'u küresel olarak devre dışı bırak

ndk-build

ndk-build, Neon'un küresel olarak devre dışı bırakılmasını desteklemez. Neon'u bir ndk-build uygulamasının tamamını devre dışı bırakmak için uygulamanızdaki her modüle ayrı ayrı uygulanan adımları uygulayın.

CMake

CMake'i çağırırken -DANDROID_ARM_NEON=ON öğesini iletin. Android Studio/Gradle ile derliyorsanız build.gradle dosyanızda şu seçeneği ayarlayın:

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

Modül başına Neon'u devre dışı bırak

ndk-build

Tüm kaynak dosyaları Neon içermeyen bir ndk-build modülünde derlemek için aşağıdakileri Android.mk dosyanızdaki modül tanımına ekleyin:

LOCAL_ARM_NEON := false

CMake

Tüm kaynak dosyalarınızı Neon içermeyen bir CMake hedefinde 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=vfpv3-d16)
endif()

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

x86 için platformlar arası destek

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

Örnek kod

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