CPU 功能

您可以通过多种方式检查代码中的 CPU 功能,但每种方式都需要做出不同的取舍。

ABI:使用预处理器的预定义宏

通常,在构建时使用 #ifdef 及以下各项确定 ABI 最为方便:

  • 对于 32 位 ARM,使用 __arm__
  • 对于 64 位 ARM,使用 __aarch64__
  • 对于 32 位 X86,使用 __i386__
  • 对于 64 位 X86,使用 __x86_64__

请注意:32 位 X86 称为 __i386__,而不是 __x86__,这可能与您预想的有所不同!

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 功能的位掩码。请参阅 NDK 中的各种 hwcap.h 头文件以获取要进行比较的常量,如用于 arm64 SHA512 指令的 HWCAP_SHA512,或用于 arm Thumb 整数除法指令的 HWCAP_IDIVT

Google cpu_features 库

AT_HWCAP 的一个问题是有时设备会出错。例如,一些旧设备宣称拥有整数除法指令,但实际上并没有。

Google 的 cpu_features 库凭借其对特定 SoC 的了解(通过解析 /proc/cpuinfo 掌握相应的 SoC),解决了此类问题。

维护此库是为了供 Google 的第一方应用团队使用,并且此库中包含针对这些团队实际遇到的所有问题设备的解决方法。

NDK cpufeatures 库(已弃用)

NDK 仍然提供了一个名为 cpufeatures 的已废弃库,以便与已经使用此库的应用实现源代码兼容。与更新且更完善的 cpu_features 库不同,此旧库没有针对很多特定 SoC 设置权宜解决方法。