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