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.