Tính năng CPU

Có một số cách để kiểm tra tính năng CPU trong mã, mỗi cách có những ưu nhược điểm khác nhau.

ABI: Dùng macro được xác định trước của bộ tiền xử lý

Thông thường, để thuận tiện nhất, bạn nên xác định ABI tại thời điểm xây dựng bằng cách sử dụng #ifdef cùng với:

  • __arm__ cho ARM 32 bit
  • __aarch64__ cho ARM 64 bit
  • __i386__ cho X86 32 bit
  • __x86_64__ cho X86 64 bit

Lưu ý: X86 32 bit được gọi là __i386__, không phải __x86__ như bạn có thể mong đợi!

Số lượng lõi CPU: Sử dụng sysconf(3) của libc

sysconf(3) cho phép bạn truy vấn cả _SC_NPROCESSORS_CONF (số lõi CPU trong hệ thống) và _SC_NPROCESSORS_ONLN (số lõi CPU đang được dùng trực tuyến).

Tính năng: Sử dụng getauxval(3) của libc

Trong API cấp 18 trở lên, getauxval(3) có trong thư viện C của Android. Các đối số AT_HWCAPAT_HWCAP2 trả về mặt nạ bit (bitmask) liệt kê các tính năng dành riêng cho CPU. Xem nhiều tiêu đề hwcap.h khác nhau trong NDK để biết các hằng số là cơ sở so sánh, chẳng hạn như HWCAP_SHA512 đối với hướng dẫn SHA512 của arm64 hoặc HWCAP_IDIVT đối với hướng dẫn chia số nguyên Thumb của arm.

Thư viện cpu_features của Google

AT_HWCAP có một vấn đề, đó là đôi khi các thiết bị sẽ bị nhầm lẫn. Ví dụ: Một số thiết bị cũ xác nhận có hướng dẫn phân chia số nguyên nhưng lại không có.

Thư viện cpu_features của Google nỗ lực giải quyết các vấn đề như vậy bằng cách áp dụng kiến thức riêng về các SoC cụ thể (bằng cách phân tích cú pháp /proc/cpuinfo để tìm ra SoC cụ thể đang được đề cập).

Thư viện này được duy trì cho các nhóm ứng dụng bên thứ nhất của Google sử dụng và có giải pháp cho mọi thiết bị có vấn đề mà họ gặp phải ở môi trường sau khi phát hành.

Thư viện cpufeatures của NDK (không dùng nữa)

NDK vẫn cung cấp một thư viện không dùng nữa tên là cpufeatures để đảm bảo khả năng tương thích về nguồn với các ứng dụng đã sử dụng thư viện này. Không giống như thư viện cpu_features mới và hoàn chỉnh hơn, thư viện cũ này không có giải pháp cho nhiều SoC cụ thể như vậy.