Il existe plusieurs façons de vérifier les fonctionnalités du processeur dans votre code. Chacune présente divers avantages et inconvénients.
ABI : utiliser les macros prédéfinies du préprocesseur
Il est généralement plus pratique de déterminer l'ABI au moment de la compilation en utilisant #ifdef
conjointement avec :
__arm__
pour ARM 32 bits__aarch64__
pour ARM 64 bits__i386__
pour X86 32 bits__x86_64__
pour X86 64 bits
Notez que le format X86 32 bits est appelé __i386__
, et non __x86__
.
Nombre de cœurs de processeur : utiliser sysconf(3) de libc
sysconf(3) vous permet d'interroger à la fois _SC_NPROCESSORS_CONF
(nombre de cœurs de processeur dans le système) et _SC_NPROCESSORS_ONLN
(nombre de cœurs de processeur actifs).
Fonctionnalités : utiliser la bibliothèque getauxval(3) de libc
À partir du niveau d'API 18, getauxval(3) est disponible dans la bibliothèque C d'Android. Les arguments AT_HWCAP
et AT_HWCAP2
renvoient des masques de bits répertoriant les caractéristiques propres au processeur. Consultez les différents en-têtes hwcap.h
du NDK pour comparer les constantes, telles que HWCAP_SHA512
pour les instructions SHA512 d'arm64 ou HWCAP_IDIVT
pour les instructions de division d'entiers Thumb des appareils arm.
Bibliothèque Google cpu_features
L'un des problèmes présentés par AT_HWCAP
est que parfois les appareils se trompent. Par exemple, certains anciens appareils prétendent avoir des instructions de division d'entiers, alors que ce n'est pas le pas.
La bibliothèque cpu_features de Google permet de contourner ces problèmes en appliquant sa propre connaissance de SoC spécifiques (en analysant /proc/cpuinfo
pour déterminer le SoC en question).
Cette bibliothèque est gérée pour être utilisée par les équipes d'applications propriétaires de Google et propose des solutions de contournement pour tous les appareils problématiques qu'elles ont rencontrés.
Bibliothèque cpufeatures du NDK (obsolète)
Le NDK fournit toujours une bibliothèque obsolète nommée cpufeatures
pour la compatibilité source avec les applications qui l'utilisent déjà. Contrairement à la bibliothèque cpu_features plus récente et plus complète, cette bibliothèque historique ne propose pas de solution de contournement pour autant de SoC spécifiques.