如要檢查程式碼中的 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_HWCAP
和 AT_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 提供解決方法。