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