Возможности процессора

Существует несколько способов проверки наличия функций процессора в вашем коде, каждый из которых имеет свой набор компромиссов.

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.