Существует несколько способов проверки функций ЦП в вашем коде, каждый из которых имеет свой набор компромиссов.
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.h
в NDK, где можно найти константы для сравнения, например, HWCAP_SHA512
для инструкций SHA512 в Arm64 или HWCAP_IDIVT
для инструкций целочисленного деления Thumb в Arm.
Библиотека Google cpu_features
Одна из проблем с AT_HWCAP
заключается в том, что иногда устройства ошибаются. Например, некоторые старые устройства утверждают, что имеют инструкции целочисленного деления, но на самом деле их нет.
Библиотека Google cpu_features решает такие проблемы, применяя собственные знания о конкретных SoC (путем анализа /proc/cpuinfo
для определения конкретного рассматриваемого SoC).
Эта библиотека поддерживается для использования собственными командами приложений Google и содержит обходные пути для каждого проблемного устройства, с которым они столкнулись в реальной жизни.
Библиотека cpufeatures NDK (устарела)
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.h
в NDK, где можно найти константы для сравнения, например, HWCAP_SHA512
для инструкций SHA512 в Arm64 или HWCAP_IDIVT
для инструкций целочисленного деления Thumb в Arm.
Библиотека Google cpu_features
Одна из проблем с AT_HWCAP
заключается в том, что иногда устройства ошибаются. Например, некоторые старые устройства утверждают, что имеют инструкции целочисленного деления, но на самом деле их нет.
Библиотека Google cpu_features решает такие проблемы, применяя собственные знания о конкретных SoC (путем анализа /proc/cpuinfo
для определения конкретного рассматриваемого SoC).
Эта библиотека поддерживается для использования собственными командами разработчиков приложений Google и содержит обходные пути для каждого проблемного устройства, с которым они столкнулись в реальной жизни.
Библиотека cpufeatures NDK (устарела)
NDK по-прежнему предоставляет устаревшую библиотеку cpufeatures
для совместимости исходного кода с приложениями, которые ее уже используют. В отличие от более новой и более полной библиотеки cpu_features , эта историческая библиотека не имеет обходных путей для такого количества конкретных SoC.