Как определить, существует ли двигатель NEON на данном процессоре ARM? Любой регистр статуса/флага может быть запрошен для этой цели?Как проверить наличие NEON на руке?
ответ
Я считаю, что unixsmurf's answer примерно так же хорош, как и при использовании ОС с привилегированным ядром. Для обнаружения функции общего назначения кажется, что ARM потребовало получить это от ОС, и поэтому вы должны использовать OS API для его получения.
- На Android NDK использовать
#include <cpu-features.h>
с(android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
. Обратите внимание, что это для 32-битного ARM. ARM 64 бит имеет разные флаги, но идея такая же. См. sources/docs. - В Linux, если доступно, используйте
#include <sys/auxv.h>
и#include <asm/hwcap.h>
сgetauxval(AT_HWCAP) & HWCAP_NEON
. - На iOS я не уверен, что существует динамический вызов, похоже, что методология заключается в том, что вы создаете приложение для таргетинга NEON, а затем убедитесь, что ваше приложение отмечено как NEON, поэтому оно будет установлено только на устройствах, которые его поддерживают , Конечно, вы должны использовать предопределенный флаг препроцессора
__ARM_NEON__
, чтобы убедиться, что все в порядке во время компиляции. - на то, что Microsoft делает или, если вы используете другие ОС реального времени ... Я не знаю ...
На самом деле вы будете видеть много реализаций Android, которые просто синтаксический анализ/Proc/CPUInfo в для реализации android_getCpuFeatures() .... Хех. Но все же кажется, что он улучшается, а новейшие версии используют метод getauxval.
Все оборудование iOS, поддерживаемое iOS 5 и более поздними версиями, имеет NEON; вы можете просто предположить, что NEON присутствует, нет никакой необходимости в проверке (но вы могли бы проверить динамически с помощью 'sysctl', если вы действительно этого хотели). –
На Android NDK проверить если (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)! = 0) – VMMF
Спасибо, да, я обновил .... очевидно, более сложный теперь с ARM64 и т.д. –
есть тонна регистров сопроцессора, которые есть для этой цели, чтобы предоставить вам подробные сведения о том, что поддерживается в этом ядре, а что нет. получить TRM для этого или аналогичного ядра, чтобы увидеть, где живут эти регистры. –
Я считаю, что процессоры ARM разработаны с.т. эта информация и эти регистры на самом деле являются привилегированными; Поэтому в Linux вы должны искать '/ proc/cpuinfo', чтобы искать флаг NEON или Advanced SIMD. Для привилегированного кода просмотрите Справочное руководство по архитектуре ARMv7, раздел _B3.12.19 c1, «Регистр контроля доступа к сопроцессору» (CPACR) _; Бит 31 этого регистра - это то, что вы хотите. –
Бит 31 CPACR отключает инструкции NEON по отключению, когда установлено значение 1, что, по-видимому, не является прямым способом обнаружения двигателя NEON. – Thomson