CPU 功能

如要檢查程式碼中的 CPU 功能,有多種方法可以選擇,但每種方法都各有優缺點。

ABI:使用前置處理器的預先定義巨集

如要確定 ABI,最方便的做法通常是在建構時使用 #ifdef 與以下項目:

  • 針對 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 提供解決方法。