NDK از ARM Advanced SIMD که معمولاً با نام Neon شناخته میشود، پشتیبانی میکند. Neon یک افزونه مجموعه دستورالعمل اختیاری برای ARMv7 و ARMv8 است. Neon دستورالعملها و ثباتهای اسکالر/برداری (مشترک با FPU) را ارائه میدهد که قابل مقایسه با MMX/SSE/3DNow! در دنیای x86 است.
همه دستگاههای اندرویدی مبتنی بر ARMv8 ("arm64") از Neon پشتیبانی میکنند. تقریباً همه دستگاههای اندرویدی مبتنی بر ARMv7 ("32 بیتی") از Neon پشتیبانی میکنند، از جمله تمام دستگاههایی که با API سطح 21 یا بالاتر عرضه شدهاند. NDK به طور پیشفرض Neon را برای هر دو Arm ABI فعال میکند.
اگر دستگاههای بسیار قدیمی را هدف قرار میدهید، میتوانید دستگاههای ناسازگار را در کنسول گوگل پلی فیلتر کنید. همچنین میتوانید از کنسول برنامه خود استفاده کنید تا ببینید این موضوع روی چند دستگاه تأثیر میگذارد.
از طرف دیگر، برای حداکثر سازگاری، کد ۳۲ بیتی میتواند تشخیص زمان اجرا را انجام دهد تا تأیید کند که کد Neon میتواند روی دستگاه هدف اجرا شود. یک برنامه میتواند این بررسی را با استفاده از هر یک از گزینههای ذکر شده در ویژگیهای CPU انجام دهد.
شما نباید توابع ذاتی Neon را به طور صریح در کد C/C++ خود بنویسید. انواع بردار قابل حمل Clang به طور خودکار از دستورالعملهای Neon استفاده میکنند. توابع ذاتی Neon در Clang در واقع فقط یک پوشش غیر قابل حمل در اطراف انواع قابل حمل هستند، بنابراین نوشتن توابع ذاتی Neon کد شما را سریعتر از استفاده از انواع قابل حمل نمیکند، فقط قابلیت حمل آن را کاهش میدهد.
ساختن
غیرفعال کردن سراسری نئون
ساخت ndk
ndk-build از غیرفعال کردن سراسری Neon پشتیبانی نمیکند. برای غیرفعال کردن Neon در کل یک برنامه ndk-build، مراحل مربوط به هر ماژول را برای هر ماژول در برنامه خود اعمال کنید.
سیمیک
هنگام فراخوانی CMake، گزینه -DANDROID_ARM_NEON=ON را فعال کنید. اگر با Android Studio/Gradle در حال ساخت هستید، گزینه زیر را در build.gradle خود تنظیم کنید:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
غیرفعال کردن نئون در هر ماژول
ساخت ndk
برای ساخت تمام فایلهای منبع در یک ماژول ndk-build بدون Neon، کد زیر را به تعریف ماژول در Android.mk خود اضافه کنید:
LOCAL_ARM_NEON := false
سیمیک
برای ساخت تمام فایلهای منبع در یک هدف 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) موجود شما به کد x86 SSE، از طریق استفاده از NEON_2_SSE.h شخص ثالث، پشتیبانی میکند. برای اطلاعات بیشتر در مورد این موضوع، به «از ARM NEON تا Intel SSE - راهکار انتقال خودکار، نکات و ترفندها» مراجعه کنید.
کد نمونه
نمونه برداری نشان میدهد که چگونه میتوان از ابزارهای برداری متنوعی برای پیادهسازی ضرب ماتریس استفاده کرد و عملکرد آنها را مقایسه کرد.