2014-11-02 2 views
11

Как определить, существует ли двигатель NEON на данном процессоре ARM? Любой регистр статуса/флага может быть запрошен для этой цели?Как проверить наличие NEON на руке?

+1

есть тонна регистров сопроцессора, которые есть для этой цели, чтобы предоставить вам подробные сведения о том, что поддерживается в этом ядре, а что нет. получить TRM для этого или аналогичного ядра, чтобы увидеть, где живут эти регистры. –

+2

Я считаю, что процессоры ARM разработаны с.т. эта информация и эти регистры на самом деле являются привилегированными; Поэтому в Linux вы должны искать '/ proc/cpuinfo', чтобы искать флаг NEON или Advanced SIMD. Для привилегированного кода просмотрите Справочное руководство по архитектуре ARMv7, раздел _B3.12.19 c1, «Регистр контроля доступа к сопроцессору» (CPACR) _; Бит 31 этого регистра - это то, что вы хотите. –

+0

Бит 31 CPACR отключает инструкции NEON по отключению, когда установлено значение 1, что, по-видимому, не является прямым способом обнаружения двигателя NEON. – Thomson

ответ

10

Я считаю, что 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.

+1

Все оборудование iOS, поддерживаемое iOS 5 и более поздними версиями, имеет NEON; вы можете просто предположить, что NEON присутствует, нет никакой необходимости в проверке (но вы могли бы проверить динамически с помощью 'sysctl', если вы действительно этого хотели). –

+1

На Android NDK проверить если (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)! = 0) – VMMF

+0

Спасибо, да, я обновил .... очевидно, более сложный теперь с ARM64 и т.д. –