การตรวจสอบฟีเจอร์ CPU ในโค้ดทำได้หลายวิธี โดยแต่ละวิธีมีข้อดีข้อเสียแตกต่างกัน
ABI: ใช้มาโครที่กำหนดไว้ล่วงหน้าของตัวประมวลผลล่วงหน้า
โดยปกติแล้ว การกำหนด ABI ในเวลาบิลด์โดยใช้ #ifdef
ร่วมกับรายการต่อไปนี้จะสะดวกที่สุด
__arm__
สำหรับ ARM 32 บิต__aarch64__
สำหรับ ARM 64 บิต__i386__
สำหรับ X86 32 บิต__x86_64__
สำหรับ X86 64 บิต
โปรดทราบว่า X86 32 บิตเรียกว่า __i386__
ไม่ใช่ __x86__
อย่างที่คุณอาจคาดไว้
จำนวนแกนของ CPU: ใช้ sysconf(3) ของ libc
sysconf(3) ช่วยให้คุณ
ค้นหาทั้ง _SC_NPROCESSORS_CONF
(จำนวนแกน CPU ในระบบ)
และ _SC_NPROCESSORS_ONLN
(จำนวนแกน CPU ที่ออนไลน์อยู่ในปัจจุบัน)
ฟีเจอร์: ใช้ getauxval(3) ของ libc
ใน API ระดับ 18 ขึ้นไป
getauxval(3)
จะพร้อมใช้งานในไลบรารี C ของ Android อาร์กิวเมนต์ AT_HWCAP
และ AT_HWCAP2
จะแสดงผลบิตมาสก์ที่แสดงฟีเจอร์เฉพาะของ CPU ดูส่วนหัวต่างๆ hwcap.h
ใน NDK เพื่อดูค่าคงที่ที่จะใช้เปรียบเทียบ เช่น HWCAP_SHA512
สำหรับคำสั่ง SHA512 ของ arm64 หรือ HWCAP_IDIVT
สำหรับคำสั่งหารจำนวนเต็ม Thumb ของ arm
ไลบรารี cpu_features ของ Google
ปัญหาอย่างหนึ่งของ AT_HWCAP
คือบางครั้งระบบอาจระบุอุปกรณ์ผิด อุปกรณ์รุ่นเก่าบางรุ่น เช่น อ้างว่ามีคำสั่งการหารจำนวนเต็ม แต่จริงๆ แล้วไม่มี
ไลบรารี cpu_features ของ Google แก้ปัญหาดังกล่าวโดยใช้ความรู้ของตนเองเกี่ยวกับ SoC ที่เฉพาะเจาะจง (โดยการแยกวิเคราะห์ /proc/cpuinfo
เพื่อหา SoC ที่เฉพาะเจาะจงที่เป็นปัญหา)
ไลบรารีนี้ได้รับการดูแลรักษาเพื่อให้ทีมแอปบุคคลที่หนึ่งของ Google ใช้งาน และ มีวิธีแก้ปัญหาสำหรับอุปกรณ์ทุกเครื่องที่พบปัญหา
ไลบรารี cpufeatures ของ NDK (เลิกใช้งานแล้ว)
NDK ยังคงมีไลบรารีที่เลิกใช้งานแล้วชื่อ cpufeatures
สำหรับแหล่งที่มา
ที่เข้ากันได้กับแอปที่ใช้ไลบรารีนี้อยู่แล้ว ไลบรารีนี้เป็นไลบรารีเก่า
จึงไม่มีวิธีแก้ปัญหาสำหรับ SoC บางรุ่นมากเท่ากับไลบรารี cpu_features รุ่นใหม่กว่าและสมบูรณ์กว่า