Existen varias maneras de verificar las funciones de CPU en tu código, cada una con diferentes ventajas y desventajas.
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: cómo usar 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: cómo usar 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 muchos SoC específicos.