Fonctionnalités du processeur
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
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.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/27 (UTC)."],[],[],null,["# CPU features\n\nThere are several ways to check for CPU features in your code, each with a\ndifferent set of trade-offs.\n\nABI: Use the preprocessor's pre-defined macros\n----------------------------------------------\n\nIt's usually most convenient to determine the ABI at build time using `#ifdef`\nin conjunction with:\n\n- `__arm__` for 32-bit ARM\n- `__aarch64__` for 64-bit ARM\n- `__i386__` for 32-bit X86\n- `__x86_64__` for 64-bit X86\n\nNote that 32-bit X86 is called `__i386__`, not `__x86__` as you might expect!\n\nCPU core counts: Use libc's sysconf(3)\n--------------------------------------\n\n[sysconf(3)](http://man7.org/linux/man-pages/man3/sysconf.3.html) lets you\nquery both `_SC_NPROCESSORS_CONF` (the number of CPU cores in the system)\nand `_SC_NPROCESSORS_ONLN` (the number of CPU cores currently online).\n\nFeatures: Use libc's getauxval(3)\n---------------------------------\n\nIn API level 18 and newer,\n[getauxval(3)](http://man7.org/linux/man-pages/man3/getauxval.3.html)\nis available in Android's C library. The `AT_HWCAP` and `AT_HWCAP2` arguments\nreturn bitmasks listing CPU-specific features. See the various `hwcap.h`\nheaders in the NDK for the constants to compare against, such as `HWCAP_SHA512`\nfor arm64's SHA512 instructions, or `HWCAP_IDIVT` for arm's Thumb integer\ndivision instructions.\n\nThe Google cpu_features library\n-------------------------------\n\nOne problem with `AT_HWCAP` is that sometimes devices are mistaken. Some old\ndevices, for example, claim to have integer division instructions but do not.\n\n[Google's cpu_features](https://github.com/google/cpu_features) library works\naround such issues by applying its own knowledge of specific SoCs (by parsing\n`/proc/cpuinfo` to work out the specific SoC in question).\n\nThis library is maintained for use by Google's first-party app teams, and\nhas workarounds for every problematic device they've encountered in the wild.\n\nThe NDK cpufeatures library (deprecated)\n----------------------------------------\n\nThe NDK still provides a deprecated library named `cpufeatures` for source\ncompatibility with apps that already use it. Unlike the newer and more complete\n[cpu_features](https://github.com/google/cpu_features) library, this historical\nlibrary does not have workarounds for as many specific SoCs."]]