CPU-Funktionen

Es gibt mehrere Möglichkeiten, um in Ihrem Code nach CPU-Features zu suchen, die jeweils unterschiedliche Vor- und Nachteile haben.

ABI: Vordefinierte Makros des Präprozessors verwenden

In der Regel ist es am einfachsten, die ABI beim Build mithilfe von #ifdef in Verbindung mit folgenden Faktoren zu ermitteln:

  • __arm__ für 32-Bit-ARM
  • __aarch64__ für 64-Bit-ARM
  • __i386__ für 32-Bit-X86
  • __x86_64__ für 64-Bit-X86

Hinweis: 32-Bit-X86 heißt __i386__ und nicht __x86__, wie du vielleicht erwarten kannst.

Anzahl der CPU-Kerne: sysconf(3) von libc verwenden

Mit sysconf(3) können Sie sowohl _SC_NPROCESSORS_CONF (die Anzahl der CPU-Kerne im System) als auch _SC_NPROCESSORS_ONLN (die Anzahl der derzeit online verfügbaren CPU-Kerne) abfragen.

Features: getauxval(3) von libc verwenden

Ab API-Level 18 ist getauxval(3) in der C-Bibliothek von Android verfügbar. Die Argumente AT_HWCAP und AT_HWCAP2 geben Bitmasken zurück, die CPU-spezifische Funktionen auflisten. Die verschiedenen hwcap.h-Header im NDK finden Sie über die Konstanten, die verglichen werden sollen, z. B. HWCAP_SHA512 für die SHA512-Anweisungen von Arm64 oder HWCAP_IDIVT für die Thumb-Ganzzahldivision von Verzweigung.

Die Google-Bibliothek „cpu_features“

Ein Problem mit AT_HWCAP ist, dass manchmal Geräte falsch sind. Einige alte Geräte behaupten beispielsweise, Anweisungen zur Division nach Ganzzahl zu haben, tun dies aber nicht.

Diese Probleme werden von der CPU_features-Bibliothek von Google umgangen, indem ihr eigenes Wissen über bestimmte SoCs angewendet wird. Dabei wird /proc/cpuinfo geparst, um das betreffende SoC zu ermitteln.

Diese Bibliothek wird für die Nutzung durch die Google-Teams für eigene Apps gepflegt. Sie bietet Problemumgehungen für jedes problematische Gerät, auf das sie gestoßen sind.

Die NDK-cpufeatures-Bibliothek (verworfen)

Das NDK stellt weiterhin eine verworfene Bibliothek mit dem Namen cpufeatures für die Quellkompatibilität mit Anwendungen bereit, die sie bereits verwenden. Im Gegensatz zur neueren und umfassenderen cpu_features-Bibliothek bietet diese historische Bibliothek keine Behelfslösungen für so viele spezifische SoCs.