مساعدة نيون

تتوافق حزمة NDK مع ARM Advanced SIMD، المعروفة باسم Neon، وهي إضافة اختيارية لمجموعة التعليمات في ARMv7 وARMv8. توفّر Neon تعليمات ومسجّلات عددية/متجهة (مشتركة مع وحدة الفاصلة العائمة) قابلة للمقارنة مع MMX/SSE/3DNow! في بنية x86.

تتوافق جميع أجهزة Android المستندة إلى ARMv8 ("arm64") مع Neon. تتوافق معظم أجهزة Android المستندة إلى ARMv7 ("32 بت") مع Neon، بما في ذلك جميع الأجهزة التي تم شحنها مع مستوى واجهة برمجة التطبيقات 21 أو مستوى أحدث. تفعِّل حزمة NDK ميزة Neon تلقائيًا لكلتا واجهتَي ABI في Arm.

إذا كنت تستهدف أجهزة قديمة جدًا، يمكنك فلترة الأجهزة غير المتوافقة على Google Play Console. يمكنك أيضًا استخدام وحدة التحكّم لتطبيقك لمعرفة عدد الأجهزة التي سيؤثر فيها ذلك.

بدلاً من ذلك، ولتحقيق أقصى قدر من التوافق، يمكن للرمز البرمجي الذي يبلغ 32 بت إجراء عملية رصد في وقت التشغيل للتأكّد من إمكانية تشغيل رمز Neon البرمجي على جهاز الاختبار. يمكن لأي تطبيق إجراء هذا الفحص باستخدام أي من الخيارات المذكورة في ميزات وحدة المعالجة المركزية.

يجب عدم كتابة Neon intrinsics الصريحة في رمز C/C++ البرمجي. ستستخدم أنواع المتجهات المحمولة في Clang's تعليمات Neon تلقائيًا. إنّ Neon intrinsics في Clang هي في الواقع مجرد برنامج تضمين غير محمول يلتف حول الأنواع المحمولة، لذا لن يؤدي كتابة Neon intrinsics إلى تسريع الرمز البرمجي أكثر من استخدام الأنواع المحمولة، بل سيجعله أقل قابلية للنقل.

إنشاء

إيقاف Neon على مستوى العالم

ndk-build

لا يتيح ndk-build إيقاف Neon على مستوى العالم. لإيقاف Neon في تطبيق ndk-build بالكامل، عليك تطبيق الخطوات الخاصة بكل وحدة على كل وحدة في تطبيقك.

CMake

مرِّر -DANDROID_ARM_NEON=ON عند استدعاء CMake. إذا كنت تنشئ باستخدام "استوديو Android"/Gradle، اضبط الخيار التالي في ملف build.gradle:

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

إيقاف Neon لكل وحدة

ndk-build

لإنشاء جميع ملفات المصدر في وحدة ndk-build بدون Neon، أضِف ما يلي إلى تعريف الوحدة في ملف Android.mk:

LOCAL_ARM_NEON := false

CMake

لإنشاء جميع ملفات المصدر في هدف CMake بدون Neon، أضِف ما يلي إلى ملف CMakeLists.txt:

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

يجب استبدال ${TARGET} باسم مكتبتك.

الدعم من عدّة منصات لبنية x86

تتيح حزمة NDK تجميع التعليمات البرمجية من عدّة منصات لوظائف ARM SIMD (Neon) instrinsic الحالية في رمز x86 SSE البرمجي، من خلال استخدام NEON_2_SSE.h التابعة لجهة خارجية. لمزيد من المعلومات حول هذا الموضوع، يُرجى الاطّلاع على المقالة From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks.

رمز نموذجي

يوضّح نموذج التحويل إلى متجهات كيفية استخدام مجموعة متنوعة من أدوات التحويل إلى متجهات لتنفيذ عملية ضرب مصفوفة، ويقارن بين أدائها.