Cómo tratar con funciones de CPU

ABI: cómo usar las macros predefinidas del preprocesador

Por lo general, es más conveniente determinar la ABI en el tiempo de compilación mediante #ifdef junto con lo siguiente:

  • __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

Ten en cuenta que el X86 de 32 bits se denomina __i386__, no __x86__ como podrías esperar.

Recuentos de núcleos de CPU: Uso de sysconf(3) de libc

sysconf(3) te permite consultar tanto _SC_NPROCESSORS_CONF (la cantidad de núcleos de CPU en el sistema) como _SC_NPROCESSORS_ONLN (la cantidad de núcleos de CPU que se encuentran en línea actualmente).

Funciones: uso de getauxval(3) de libc

En el nivel de API 18 y niveles más recientes, getauxval(3) está disponible en la biblioteca C de Android. Los argumentos AT_HWCAP y AT_HWCAP2 muestran máscaras de bits en las que se enumeran funciones específicas de la CPU. Consulta los distintos encabezados hwcap.h del NDK para conocer las constantes que usarás para comparación, como HWCAP_SHA512 para instrucciones SHA512 de arm64 o HWCAP_IDIVT para las instrucciones de división de enteros de Thumb de ARM.

La biblioteca cpu_features de Google

Un problema que presenta AT_HWCAP es que, a veces, los dispositivos brindan información errónea. Por ejemplo, algunos dispositivos antiguos declaran que tienen instrucciones de división de enteros, cuando no es así.

La biblioteca cpu_features de Google soluciona estos problemas mediante la aplicación de sus propios conocimientos sobre SoC específicos (para ello, analiza /proc/cpuinfo y resuelve el SoC específico en cuestión).

Esta biblioteca se mantiene para que la usen los equipos de aplicaciones originales de Google, y tiene soluciones alternativas para cada dispositivo problemático que encuentren fuera del laboratorio.

La biblioteca cpufeatures de NDK (obsoleta)

El NDK aún proporciona una biblioteca obsoleta denominada cpufeatures para compatibilidad de fuente con apps que ya la usan. A diferencia de la biblioteca cpu_features más reciente y completa, esta biblioteca histórica no tiene soluciones alternativas para SoC específicos.