코드에서 CPU 기능을 확인하는 방법에는 여러 가지가 있으며 각각 서로 다른 장단점이 있습니다.
ABI: 전처리기의 사전 정의된 매크로 사용
일반적으로 다음과 함께 #ifdef
를 사용하여 빌드 시 ABI를 결정하는 것이 가장 편리합니다.
__arm__
(32비트 ARM)__aarch64__
(64비트 ARM)__i386__
(32비트 X86)__x86_64__
(64비트 X86)
32비트 X86은 __x86__
일 것으로 생각할 수 있지만 __i386__
입니다.
CPU 코어 수: libc의 sysconf(3) 사용
sysconf(3)를 사용하면 _SC_NPROCESSORS_CONF
(시스템의 CPU 코어 수)와 _SC_NPROCESSORS_ONLN
(현재 온라인 상태인 CPU 코어 수)을 모두 쿼리할 수 있습니다.
기능: libc의 getauxval(3) 사용
API 수준 18 이상에서는 Android의 C 라이브러리에서 getauxval(3)을 사용할 수 있습니다. AT_HWCAP
및 AT_HWCAP2
인수는 CPU별 기능 목록을 나열하는 비트마스크를 반환합니다. 비교할 상수(예: arm64 SHA512 명령의 HWCAP_SHA512
또는 arm Thumb 정수 나눗셈 명령의 HWCAP_IDIVT
)는 NDK의 다양한 hwcap.h
헤더를 참조하세요.
Google cpu_features 라이브러리
AT_HWCAP
에는 한 가지 문제가 있는데 기기를 잘못 인식할 때가 있다는 것입니다. 예를 들어 일부 구형 기기는 정수 나눗셈 명령이 있다고 주장하지만 사실은 없습니다.
Google의 cpu_features 라이브러리는 특정 SoC의 자체 지식을 적용하여(문제의 특정 SoC를 해결하기 위해 /proc/cpuinfo
를 파싱하여) 이러한 문제를 해결합니다.
이 라이브러리는 Google의 자사 앱 팀에서 사용하기 위해 유지되며 문제가 발생한 모든 기기와 관련한 해결 방법이 있습니다.
NDK cpufeatures 라이브러리(지원 중단됨)
NDK는 이미 사용 중인 앱과의 소스 호환성을 위해 지원이 중단된 cpufeatures
라는 라이브러리를 계속 제공합니다. 더 새롭고 완전한 cpu_features 라이브러리와 달리 이 기존 라이브러리에는 특정 SoC만큼의 해결 방법이 없습니다.