Существует несколько способов проверки наличия функций процессора в вашем коде, каждый из которых имеет свой набор компромиссов.
ABI: Используйте предопределенные макросы препроцессора.
Обычно наиболее удобно определять ABI во время сборки, используя #ifdef в сочетании с:
-
__arm__для 32-битных ARM-процессоров -
__aarch64__для 64-битных ARM-процессоров -
__i386__для 32-битной архитектуры X86 -
__x86_64__для 64-битной архитектуры X86
Обратите внимание, что 32-битная архитектура X86 называется __i386__ , а не __x86__ как можно было бы ожидать!
Количество ядер ЦП: Используйте sysconf(3) из libc
sysconf(3) позволяет запрашивать как _SC_NPROCESSORS_CONF (количество ядер ЦП в системе), так и _SC_NPROCESSORS_ONLN (количество ядер ЦП, находящихся в данный момент в сети).
Особенности: Использование getauxval(3) из библиотеки libc
В API уровня 18 и новее функция getauxval(3) доступна в библиотеке C Android. Аргументы AT_HWCAP и AT_HWCAP2 возвращают битовые маски, содержащие информацию о функциях, специфичных для процессора. Константы для сравнения, такие как HWCAP_SHA512 для инструкций SHA512 архитектуры arm64 или HWCAP_IDIVT для инструкций целочисленного деления Thumb архитектуры arm, можно найти в различных заголовочных файлах hwcap.h
Библиотека Google cpu_features
Одна из проблем с AT_HWCAP заключается в том, что иногда устройства ошибаются. Например, некоторые старые устройства заявляют о наличии инструкций целочисленного деления, но на самом деле их не имеют.
Библиотека cpu_features от Google решает подобные проблемы, используя собственные знания о конкретных SoC (путем анализа файла /proc/cpuinfo для определения конкретного SoC).
Эта библиотека поддерживается для использования командами разработчиков собственных приложений Google и содержит обходные пути для всех проблемных устройств, с которыми они сталкивались в реальных условиях.
Библиотека NDK cpufeatures (устарела)
NDK по-прежнему предоставляет устаревшую библиотеку cpufeatures для обеспечения совместимости исходного кода с приложениями, которые её уже используют. В отличие от более новой и полной библиотеки cpu_features , эта историческая библиотека не имеет обходных путей для такого большого количества конкретных SoC.
Существует несколько способов проверки наличия функций процессора в вашем коде, каждый из которых имеет свой набор компромиссов.
ABI: Используйте предопределенные макросы препроцессора.
Обычно наиболее удобно определять ABI во время сборки, используя #ifdef в сочетании с:
-
__arm__для 32-битных ARM-процессоров -
__aarch64__для 64-битных ARM-процессоров -
__i386__для 32-битной архитектуры X86 -
__x86_64__для 64-битной архитектуры X86
Обратите внимание, что 32-битная архитектура X86 называется __i386__ , а не __x86__ как можно было бы ожидать!
Количество ядер ЦП: Используйте sysconf(3) из libc
sysconf(3) позволяет запрашивать как _SC_NPROCESSORS_CONF (количество ядер ЦП в системе), так и _SC_NPROCESSORS_ONLN (количество ядер ЦП, находящихся в данный момент в сети).
Особенности: Использование getauxval(3) из библиотеки libc
В API уровня 18 и новее функция getauxval(3) доступна в библиотеке C Android. Аргументы AT_HWCAP и AT_HWCAP2 возвращают битовые маски, содержащие информацию о функциях, специфичных для процессора. Константы для сравнения, такие как HWCAP_SHA512 для инструкций SHA512 архитектуры arm64 или HWCAP_IDIVT для инструкций целочисленного деления Thumb архитектуры arm, можно найти в различных заголовочных файлах hwcap.h
Библиотека Google cpu_features
Одна из проблем с AT_HWCAP заключается в том, что иногда устройства ошибаются. Например, некоторые старые устройства заявляют о наличии инструкций целочисленного деления, но на самом деле их не имеют.
Библиотека cpu_features от Google решает подобные проблемы, используя собственные знания о конкретных SoC (путем анализа файла /proc/cpuinfo для определения конкретного SoC).
Эта библиотека поддерживается для использования командами разработчиков собственных приложений Google и содержит обходные пути для всех проблемных устройств, с которыми они сталкивались в реальных условиях.
Библиотека NDK cpufeatures (устарела)
NDK по-прежнему предоставляет устаревшую библиотеку cpufeatures для обеспечения совместимости исходного кода с приложениями, которые её уже используют. В отличие от более новой и полной библиотеки cpu_features , эта историческая библиотека не имеет обходных путей для такого большого количества конкретных SoC.