CPU 機能

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 に対する回避策は含まれていません。