आपके कोड में सीपीयू की सुविधाओं की जांच करने के कई तरीके हैं. हर तरीके के अपने फ़ायदे और नुकसान हैं.
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 के लिए वर्कअराउंड नहीं हैं.