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_HWCAP
引数と AT_HWCAP2
引数は、CPU 固有の機能のリストを示すビットマスクを返します。NDK 内の各種 hwcap.h
ヘッダーで、各機能を示す定数を確認できます(arm64 の SHA512 命令の場合は HWCAP_SHA512
、arm の Thumb 整数除算命令の場合は HWCAP_IDIVT
)。
Google cpu_features ライブラリ
AT_HWCAP
の問題の 1 つとして、デバイスが誤って解釈されることがあります。たとえば、古いデバイスの場合に「整数除算命令をサポートしている」と示されても、実際にはサポートしていないことがあります。
Google の cpu_features ライブラリは、各 SoC に関する独自のナレッジを適用することで(/proc/cpuinfo
を解析して、対象の SoC を判別することで)、このような問題を回避します。
このライブラリは Google のファーストパーティ アプリチーム用に保持されており、これまでに同チームが実際に遭遇した、問題のある各デバイスについての回避策を備えています。
NDK cpufeatures ライブラリ(サポート終了)
NDK では cpufeatures
ライブラリ(サポート終了)を引き続き提供しています。これは、すでにこのライブラリを使用しているアプリとのソースの互換性を維持するためです。より完全な新しい cpu_features ライブラリとは異なり、この古いライブラリには多くの特定の SoC に対する回避策は含まれていません。