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

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

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.