CPU 特性

在您的代码中有几种方法可以检查 CPU 特性,每种方法都有不同的权衡。

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

通常最方便的方法是在构建时使用 #ifdef 结合以下宏来确定 ABI:

  • __arm__ 表示 32 位 ARM
  • __aarch64__ 表示 64 位 ARM
  • __i386__ 表示 32 位 X86
  • __x86_64__ 表示 64 位 X86

请注意,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 的解决方法。