Há várias maneiras de procurar recursos de CPU no seu código, cada uma com vantagens e desvantagens diferentes.
ABI: usar as macros predefinidas do pré-processador
Em geral, é mais conveniente determinar a ABI no tempo de compilação usando #ifdef
com:
__arm__
para ARM de 32 bits__aarch64__
para ARM de 64 bits__i386__
para X86 de 32 bits__x86_64__
para X86 de 64 bits
Observe que o X86 de 32 bits é chamado __i386__
, não __x86__
, como seria de se esperar.
Contagens de núcleo da CPU: como usar a função sysconf(3) da libc
A função sysconf(3) permite que você
consulte tanto _SC_NPROCESSORS_CONF
(o número de núcleos da CPU no sistema)
quanto _SC_NPROCESSORS_ONLN
(o número de núcleos da CPU on-line no momento).
Recursos: usar o getauxval(3) do libc
A partir do nível 18 da API,
a função getauxval(3)
está disponível na biblioteca C do Android. Os argumentos AT_HWCAP
e AT_HWCAP2
retornam bitmasks que listam recursos específicos da CPU. Observe os vários cabeçalhos hwcap.h
no NDK para as constantes e então faça a comparação. Por exemplo, HWCAP_SHA512
para instruções SHA512 do arm64 ou HWCAP_IDIVT
para as instruções de divisão de números inteiros de Thumb do arm.
Biblioteca cpu_features do Google
Um problema com AT_HWCAP
é que, às vezes, os dispositivos podem causar confusão. Alguns dispositivos
antigos, por exemplo, declaram ter instruções de divisão de inteiros, mas isso não é verdade.
A biblioteca cpu_features do Google corrige
esses problemas aplicando o próprio conhecimento de SoCs específicos (analisando
/proc/cpuinfo
para corrigir o SoC específico em questão).
Essa biblioteca é mantida para uso pelas equipes de apps primários do Google e traz soluções alternativas para todos os dispositivos problemáticos encontrados.
Biblioteca cpu_features do NDK (obsoleta)
O NDK ainda oferece uma biblioteca descontinuada chamada cpufeatures
para compatibilidade
de origem com apps que já a utilizam. Diferentemente da biblioteca
cpu_features mais recente e mais completa,
essa biblioteca histórica não tem soluções alternativas para tantos SoCs específicos.