Funzionalità della CPU
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Esistono diversi modi per verificare le funzionalità della CPU nel codice, ciascuno con un diverso insieme di compromessi.
ABI: utilizza le macro predefinite del preprocessore
In genere è più pratico determinare l'ABI al momento della creazione utilizzando #ifdef
in combinazione con:
__arm__
per ARM a 32 bit
__aarch64__
per ARM a 64 bit
__i386__
per X86 a 32 bit
__x86_64__
per X86 a 64 bit
Tieni presente che lo standard X86 a 32 bit si chiama __i386__
, non __x86__
come previsto.
Conteggi di core della CPU: utilizza il parametro sysconf(3) di libc
sysconf(3) ti consente di eseguire query sia su _SC_NPROCESSORS_CONF
(il numero di core CPU nel sistema) sia su _SC_NPROCESSORS_ONLN
(il numero di core CPU attualmente online).
Caratteristiche: usa getauxval(3) di libc
Nel livello API 18 e successivi,
getauxval(3)
è disponibile nella libreria C di Android. Gli argomenti AT_HWCAP
e AT_HWCAP2
restituiscono maschere di bit che elencano le funzionalità specifiche della CPU. Consulta le varie intestazioni hwcap.h
nell'NDK per le costanti con cui effettuare il confronto, ad esempio HWCAP_SHA512
per le istruzioni SHA512 di arm64 o HWCAP_IDIVT
per le istruzioni per la divisione intera del pollice di leva.
La libreria Google cpu_features
Un problema di AT_HWCAP
è che a volte i dispositivi sbagliano. Alcuni vecchi dispositivi, ad esempio, affermano di avere istruzioni di divisione per numeri interi, ma non lo fanno.
La libreria cpu_features di Google risolve questi problemi applicando le proprie conoscenze di SoC specifici (analizzando /proc/cpuinfo
per individuare il SoC specifico in questione).
Questa libreria è gestita per essere utilizzata dai team proprietari di app di Google e offre soluzioni alternative per ogni dispositivo problematico che hanno incontrato in natura.
Libreria CPU NDK (deprecata)
L'NDK fornisce comunque una libreria deprecata denominata cpufeatures
per la compatibilità dell'origine con le app che la utilizzano già. A differenza della libreria cpu_features più recente e completa, questa libreria storica non ha soluzioni alternative per altrettanti SoC specifici.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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."]]