ميزات وحدة المعالجة المركزية (CPU)
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
هناك عدة طرق للتحقق من ميزات وحدة المعالجة المركزية (CPU) في التعليمات البرمجية، ولكل منها مجموعة مختلفة من المُقايضات.
واجهة التطبيق الثنائية (ABI): استخدام وحدات الماكرو المحدّدة مسبقًا للمعالج المسبق
عادةً ما يكون من الأنسب تحديد واجهة التطبيق الثنائية (ABI) في وقت الإصدار باستخدام #ifdef
إلى جانب ما يلي:
__arm__
لـ ARM 32 بت
__aarch64__
لـ ARM 64 بت
__i386__
لـ X86 32 بت
__x86_64__
لـ X86 64 بت
يُرجى ملاحظة أنّ الإصدار 32 بت X86 يُسمّى __i386__
، وليس __x86__
كما قد تتوقع.
أعداد وحدة المعالجة المركزية (CPU): استخدام sysconf(3) في libc
يتيح لك sysconf(3) الاستعلام عن كل من
_SC_NPROCESSORS_CONF
(عدد نوى وحدة المعالجة المركزية (CPU) في النظام)
و_SC_NPROCESSORS_ONLN
(عدد نوى وحدة المعالجة المركزية (CPU) المتصلة حاليًا).
الميزات: استخدام getauxval(3) في libc
في المستوى 18 من واجهة برمجة التطبيقات والإصدارات الأحدث، يتوفّر getauxval(3) في مكتبة C على Android. تعرض الوسيطات AT_HWCAP
وAT_HWCAP2
أقنعة بت تسرد الميزات الخاصة بوحدة المعالجة المركزية (CPU). انظر إلى رؤوس hwcap.h
المختلفة في NDK لتحديد الثوابت للمقارنة بها، مثل HWCAP_SHA512
لتعليمات SHA512 لـ Arm64 أو HWCAP_IDIVT
للحصول على تعليمات قسمة العدد الصحيح للإبهام في الشكل.
مكتبة cpu_features من Google
إنّ المشكلة في AT_HWCAP
هي أنّ الأجهزة أحيانًا ما تكون خاطئة. على سبيل المثال، تدّعي بعض الأجهزة
القديمة أن لديها تعليمات قسمة الأعداد الصحيحة ولكنها لا تحتوي عليها.
تعالج مكتبة cpu_features من Google هذه المشاكل من خلال تطبيق معرفتها الخاصة بشرائح المنظومة على الرقاقة (SoC) المحددة (من خلال تحليل /proc/cpuinfo
لمعرفة المنظومة على الرقاقة (SoC) المحددة المعنية).
وتتوفر هذه المكتبة لتستخدمها فِرق تطبيقات الطرف الأول في Google، وتحتوي على حلول بديلة لكل جهاز واجه المشكلة أثناء الاستخدام.
مكتبة NDK cpufeatures (متوقّفة نهائيًا)
لا يزال NDK يوفّر مكتبة متوقّفة نهائيًا باسم cpufeatures
لضمان توافق المصدر مع التطبيقات التي تستخدمها حاليًا. على عكس مكتبة cpu_features الأحدث والأكثر اكتمالاً، لا تحتوي هذه المكتبة السابقة على حلول بديلة لعدد كبير من عمليات المنظومة على الرقاقة (SoC) المحددة.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# CPU features\n\nThere are several ways to check for CPU features in your code, each with a\ndifferent set of trade-offs.\n\nABI: Use the preprocessor's pre-defined macros\n----------------------------------------------\n\nIt's usually most convenient to determine the ABI at build time using `#ifdef`\nin conjunction with:\n\n- `__arm__` for 32-bit ARM\n- `__aarch64__` for 64-bit ARM\n- `__i386__` for 32-bit X86\n- `__x86_64__` for 64-bit X86\n\nNote that 32-bit X86 is called `__i386__`, not `__x86__` as you might expect!\n\nCPU core counts: Use libc's sysconf(3)\n--------------------------------------\n\n[sysconf(3)](http://man7.org/linux/man-pages/man3/sysconf.3.html) lets you\nquery both `_SC_NPROCESSORS_CONF` (the number of CPU cores in the system)\nand `_SC_NPROCESSORS_ONLN` (the number of CPU cores currently online).\n\nFeatures: Use libc's getauxval(3)\n---------------------------------\n\nIn API level 18 and newer,\n[getauxval(3)](http://man7.org/linux/man-pages/man3/getauxval.3.html)\nis available in Android's C library. The `AT_HWCAP` and `AT_HWCAP2` arguments\nreturn bitmasks listing CPU-specific features. See the various `hwcap.h`\nheaders in the NDK for the constants to compare against, such as `HWCAP_SHA512`\nfor arm64's SHA512 instructions, or `HWCAP_IDIVT` for arm's Thumb integer\ndivision instructions.\n\nThe Google cpu_features library\n-------------------------------\n\nOne problem with `AT_HWCAP` is that sometimes devices are mistaken. Some old\ndevices, for example, claim to have integer division instructions but do not.\n\n[Google's cpu_features](https://github.com/google/cpu_features) library works\naround such issues by applying its own knowledge of specific SoCs (by parsing\n`/proc/cpuinfo` to work out the specific SoC in question).\n\nThis library is maintained for use by Google's first-party app teams, and\nhas workarounds for every problematic device they've encountered in the wild.\n\nThe NDK cpufeatures library (deprecated)\n----------------------------------------\n\nThe NDK still provides a deprecated library named `cpufeatures` for source\ncompatibility with apps that already use it. Unlike the newer and more complete\n[cpu_features](https://github.com/google/cpu_features) library, this historical\nlibrary does not have workarounds for as many specific SoCs."]]