روشهای مختلفی برای بررسی ویژگیهای CPU در کد شما وجود دارد که هر کدام مجموعهی متفاوتی از بدهبستانها را دارند.
ABI: از ماکروهای از پیش تعریف شده پیش پردازنده استفاده کنید
معمولاً راحتترین روش تعیین ABI در زمان ساخت با استفاده از #ifdef به همراه موارد زیر است:
-
__arm__برای ARM 32 بیتی -
__aarch64__برای ARM 64 بیتی -
__i386__برای معماری ۳۲ بیتی X86 -
__x86_64__برای نسخه ۶۴ بیتی X86
توجه داشته باشید که X86 32 بیتی __i386__ نامیده میشود، نه __x86__ آنطور که ممکن است انتظار داشته باشید!
تعداد هستههای پردازنده: از sysconf(3) در libc استفاده کنید
sysconf(3) به شما امکان میدهد هم _SC_NPROCESSORS_CONF (تعداد هستههای CPU در سیستم) و هم _SC_NPROCESSORS_ONLN (تعداد هستههای CPU فعال فعلی) را جستجو کنید.
ویژگیها: استفاده از getauxval(3) در libc
در API سطح ۱۸ و جدیدتر، getauxval(3) در کتابخانه C اندروید موجود است. آرگومانهای AT_HWCAP و AT_HWCAP2 ، بیتماسکهایی را برمیگردانند که ویژگیهای خاص CPU را فهرست میکنند. برای مشاهده ثابتهای قابل مقایسه، به هدرهای مختلف hwcap.h در NDK مراجعه کنید، مانند HWCAP_SHA512 برای دستورالعملهای SHA512 مربوط به arm64، یا HWCAP_IDIVT برای دستورالعملهای تقسیم عدد صحیح Thumb مربوط به arm.
کتابخانهی cpu_features گوگل
یکی از مشکلات AT_HWCAP این است که گاهی اوقات دستگاهها اشتباه میکنند. برای مثال، برخی از دستگاههای قدیمی ادعا میکنند که دستورالعملهای تقسیم عدد صحیح دارند، اما اینطور نیست.
کتابخانه cpu_features گوگل با بهکارگیری دانش خود در مورد SoCهای خاص (با تجزیه /proc/cpuinfo برای یافتن SoC خاص مورد نظر) چنین مشکلاتی را حل میکند.
این کتابخانه برای استفاده تیمهای توسعهدهندهی برنامههای شخص ثالث گوگل نگهداری میشود و برای هر دستگاه مشکلداری که در طبیعت با آن مواجه شدهاند، راهحلهایی دارد.
کتابخانه NDK cpufeatures (منسوخ شده)
NDK هنوز یک کتابخانه منسوخشده به نام cpufeatures را برای سازگاری منبع با برنامههایی که از آن استفاده میکنند، ارائه میدهد. برخلاف کتابخانه جدیدتر و کاملتر cpu_features ، این کتابخانه قدیمی برای بسیاری از SoCهای خاص، راهحلهای جایگزین ندارد.
روشهای مختلفی برای بررسی ویژگیهای CPU در کد شما وجود دارد که هر کدام مجموعهی متفاوتی از بدهبستانها را دارند.
ABI: از ماکروهای از پیش تعریف شده پیش پردازنده استفاده کنید
معمولاً راحتترین روش تعیین ABI در زمان ساخت با استفاده از #ifdef به همراه موارد زیر است:
-
__arm__برای ARM 32 بیتی -
__aarch64__برای ARM 64 بیتی -
__i386__برای معماری ۳۲ بیتی X86 -
__x86_64__برای نسخه ۶۴ بیتی X86
توجه داشته باشید که X86 32 بیتی __i386__ نامیده میشود، نه __x86__ آنطور که ممکن است انتظار داشته باشید!
تعداد هستههای پردازنده: از sysconf(3) در libc استفاده کنید
sysconf(3) به شما امکان میدهد هم _SC_NPROCESSORS_CONF (تعداد هستههای CPU در سیستم) و هم _SC_NPROCESSORS_ONLN (تعداد هستههای CPU فعال فعلی) را جستجو کنید.
ویژگیها: استفاده از getauxval(3) در libc
در API سطح ۱۸ و جدیدتر، getauxval(3) در کتابخانه C اندروید موجود است. آرگومانهای AT_HWCAP و AT_HWCAP2 ، بیتماسکهایی را برمیگردانند که ویژگیهای خاص CPU را فهرست میکنند. برای مشاهده ثابتهای قابل مقایسه، به هدرهای مختلف hwcap.h در NDK مراجعه کنید، مانند HWCAP_SHA512 برای دستورالعملهای SHA512 مربوط به arm64، یا HWCAP_IDIVT برای دستورالعملهای تقسیم عدد صحیح Thumb مربوط به arm.
کتابخانهی cpu_features گوگل
یکی از مشکلات AT_HWCAP این است که گاهی اوقات دستگاهها اشتباه میکنند. برای مثال، برخی از دستگاههای قدیمی ادعا میکنند که دستورالعملهای تقسیم عدد صحیح دارند، اما اینطور نیست.
کتابخانه cpu_features گوگل با بهکارگیری دانش خود در مورد SoCهای خاص (با تجزیه /proc/cpuinfo برای یافتن SoC خاص مورد نظر) چنین مشکلاتی را حل میکند.
این کتابخانه برای استفاده تیمهای توسعهدهندهی برنامههای شخص ثالث گوگل نگهداری میشود و برای هر دستگاه مشکلداری که در طبیعت با آن مواجه شدهاند، راهحلهایی دارد.
کتابخانه NDK cpufeatures (منسوخ شده)
NDK هنوز یک کتابخانه منسوخشده به نام cpufeatures را برای سازگاری منبع با برنامههایی که از آن استفاده میکنند، ارائه میدهد. برخلاف کتابخانه جدیدتر و کاملتر cpu_features ، این کتابخانه قدیمی برای بسیاری از SoCهای خاص، راهحلهای جایگزین ندارد.