CPU-Features

Es gibt mehrere Möglichkeiten, CPU-Funktionen in Ihrem Code zu prüfen. Jede hat ihre Vor- und Nachteile.

ABI: Vordefinierte Makros des Präprozessors verwenden

Normalerweise ist es am einfachsten, das ABI zur Build-Zeit mit #ifdef in Verbindung mit Folgendem zu bestimmen:

  • __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

32-Bit-X86 wird als __i386__ bezeichnet, nicht als __x86__, wie Sie vielleicht erwarten.

Anzahl der CPU-Kerne: libc-Funktion sysconf(3) 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 befindlichen CPU-Kerne) abfragen.

Funktionen: libc-Funktion getauxval(3) 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, in denen CPU-spezifische Funktionen aufgeführt sind. Die verschiedenen hwcap.h-Header im NDK enthalten die Konstanten, mit denen verglichen werden kann, z. B. HWCAP_SHA512 für die SHA512-Anweisungen von arm64 oder HWCAP_IDIVT für die Thumb-Ganzzahldivisionsanweisungen von arm.

Die Google-Bibliothek „cpu_features“

Ein Problem bei AT_HWCAP ist, dass Geräte manchmal verwechselt werden. Einige alte Geräte geben beispielsweise an, dass sie über Anweisungen zur Ganzzahldivision verfügen, was aber nicht der Fall ist.

Die cpu_features-Bibliothek von Google umgeht solche Probleme, indem sie ihr eigenes Wissen über bestimmte SoCs anwendet. Dazu wird /proc/cpuinfo geparst, um das jeweilige SoC zu ermitteln.

Diese Bibliothek wird von den Teams für eigene Apps von Google verwaltet und enthält Workarounds für alle problematischen Geräte, die ihnen bekannt sind.

Die NDK-Bibliothek „cpufeatures“ (eingestellt)

Das NDK bietet weiterhin eine eingestellte Bibliothek namens cpufeatures für die Quellkompatibilität mit Apps, die sie bereits verwenden. Im Gegensatz zur neueren und umfassenderen Bibliothek cpu_features bietet diese ältere Bibliothek nicht für so viele spezifische SoCs Workarounds.