Como lidar com recursos da CPU

ABI: como usar as macros predefinidas do pré-processador

Em geral, é mais conveniente determinar a ABI no momento da 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: como usar a função getauxval(3) da 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 obsoleta 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 SoCs específicos.