ฟีเจอร์ของ CPU

การตรวจสอบฟีเจอร์ 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 รุ่นใหม่กว่าและสมบูรณ์กว่า