Neon desteği

NDK, ARMv7 ve ARMv8 için isteğe bağlı bir talimat seti uzantısı olan ve genellikle Neon olarak bilinen ARM Advanced SIMD'yi destekler. Neon, x86 dünyasındaki MMX/SSE/3DNow! ile karşılaştırılabilir, skaler/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ümlerle birlikte gönderilen tüm cihazlar da dahil olmak üzere, ARMv7 tabanlı ("32 bit") Android cihazların neredeyse tamamı Neon'u destekler. NDK, her iki Arm ABI'si için de Neon'u varsayılan olarak etkinleştirir.

Çok eski cihazları hedefliyorsanız Google Play Console'da uyumsuz cihazları 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 kodunun hedef cihazda çalıştırılabileceğini doğrulamak üzere çalışma zamanı algılaması gerçekleştirebilir. Bir uygulama, CPU özellikleri bölümünde belirtilen seçeneklerden herhangi birini kullanarak bu kontrolü gerçekleştirebilir.

C/C++ kodunuza açık Neon intrinsikleri yazmamalısınız. Clang'in taşınabilir vektör türleri, Neon talimatlarını otomatik olarak kullanır. Clang'in Neon intrinsikleri aslında taşınabilir türler etrafındaki taşınabilir olmayan bir sarmalayıcıdır. Bu nedenle, Neon intrinsikleri yazmak kodunuzu taşınabilir türleri kullanmaktan daha hızlı hale getirmez, yalnızca daha az taşınabilir hale getirir.

Derle

Neon'u genel olarak devre dışı bırakma

ndk-build

ndk-build, Neon'un genel olarak devre dışı bırakılmasını desteklemez. Neon'u tamamen devre dışı bırakmak için bir ndk-build uygulamasında modül başına uygulanan adımları uygulamanızdaki her modüle uygulayın.

CMake

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

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

Neon'u modül bazında devre dışı bırakma

ndk-build

Bir ndk-build modülündeki tüm kaynak dosyaları Neon olmadan oluşturmak için Android.mk dosyanızdaki modül tanımına aşağıdakileri ekleyin:

LOCAL_ARM_NEON := false

CMake

Neon olmadan bir CMake hedefindeki tüm kaynak dosyaları oluşturmak için CMakeLists.txt dosyanıza aşağıdakileri ekleyin:

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

${TARGET} yerine kitaplığınızın adı yazılır.

x86 için platformlar arası destek

NDK, üçüncü taraf NEON_2_SSE.h kullanılarak mevcut ARM SIMD (Neon) intrinsic işlevlerinizin x86 SSE koduna platformlar arası derlenmesini destekler. Bu konu hakkında daha fazla bilgi için From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks (ARM NEON'dan Intel SSE'ye: Otomatik taşıma çözümü, ipuçları ve püf noktaları) başlıklı makaleyi inceleyin.

Örnek kod

Vektörleştirme örneği, matris çarpımını uygulamak için çeşitli vektörleştirme araçlarının nasıl kullanılacağını gösterir ve bu araçların performansını karşılaştırır.