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_HWCAPAT_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와 관련한 해결 방법이 없습니다.