आपके कोड में सीपीयू की सुविधाओं की जांच करने के कई तरीके हैं. हर तरीके के अपने फ़ायदे और नुकसान हैं.
ABI: प्रीप्रोसेसर के पहले से तय किए गए मैक्रो का इस्तेमाल करें
आम तौर पर, बिल्ड टाइम पर #ifdef का इस्तेमाल करके, ABI का पता लगाना सबसे आसान होता है. इसके साथ-साथ, इनका भी इस्तेमाल किया जा सकता है:
- __arm__32-बिट ARM के लिए
- __aarch64__64-बिट ARM के लिए
- __i386__for 32-bit X86
- __x86_64__64-बिट X86 के लिए
ध्यान दें कि 32-बिट X86 को __i386__ कहा जाता है, न कि __x86__ जैसा कि आपको लग सकता है!
सीपीयू कोर की संख्या: libc के sysconf(3) का इस्तेमाल करें
sysconf(3) की मदद से, _SC_NPROCESSORS_CONF (सिस्टम में सीपीयू कोर की संख्या) और _SC_NPROCESSORS_ONLN (फ़िलहाल ऑनलाइन सीपीयू कोर की संख्या), दोनों के बारे में क्वेरी की जा सकती है.
सुविधाएँ: libc के getauxval(3) का इस्तेमाल करें
एपीआई लेवल 18 और इसके बाद के वर्शन में, Android की C लाइब्रेरी में getauxval(3) उपलब्ध है. AT_HWCAP और AT_HWCAP2 आर्ग्युमेंट, सीपीयू की खास सुविधाओं की सूची वाले बिटमास्क दिखाते हैं. तुलना करने के लिए, NDK में मौजूद अलग-अलग hwcap.h हेडर देखें. जैसे, arm64 के SHA512 निर्देशों के लिए HWCAP_SHA512 या arm के Thumb पूर्णांक भाग के निर्देशों के लिए HWCAP_IDIVT.
Google की cpu_features लाइब्रेरी
AT_HWCAP की एक समस्या यह है कि कभी-कभी डिवाइसों की पहचान गलत हो जाती है. कुछ पुराने डिवाइसों में, पूर्णांक भागफल निकालने के निर्देश होने का दावा किया जाता है, लेकिन ऐसा नहीं होता.
Google की cpu_features लाइब्रेरी, इस तरह की समस्याओं को हल करती है. इसके लिए, यह लाइब्रेरी कुछ खास एसओसी के बारे में अपनी जानकारी का इस्तेमाल करती है. यह जानकारी, /proc/cpuinfo को पार्स करके हासिल की जाती है, ताकि यह पता लगाया जा सके कि कौनसे एसओसी में समस्या है.
इस लाइब्रेरी को Google की पहले पक्ष की ऐप्लिकेशन टीमें इस्तेमाल करती हैं. साथ ही, इसमें उन सभी डिवाइसों के लिए वर्कअराउंड मौजूद हैं जिनमें उन्हें समस्याएं आई हैं.
NDK cpufeatures लाइब्रेरी (अब काम नहीं करती)
एनडीके अब भी cpufeatures नाम की एक ऐसी लाइब्रेरी उपलब्ध कराता है जिसका इस्तेमाल अब नहीं किया जाता. इससे उन ऐप्लिकेशन के साथ सोर्स कोड को कंपैटिबल बनाया जा सकता है जो पहले से ही इसका इस्तेमाल कर रहे हैं. नई और ज़्यादा जानकारी वाली cpu_features लाइब्रेरी के उलट, इस पुरानी लाइब्रेरी में कई खास SoC के लिए वर्कअराउंड नहीं हैं.
