2010-11-04 3 views
35

В процессоре ARM Cortex-A8 я понимаю, что такое NEON, это копроцессор SIMD.ARM Cortex-A8: В чем разница между VFP и NEON

Но блок VFP (Vector Floating Point), который также является сопроцессором, работает как SIMD-процессор? Если да, то какой из них лучше использовать?

Я читал несколько ссылок, таких как -

  1. Link1

  2. Link2.

Но не совсем понятно, что они означают. Говорят, что VFP никогда не предназначался для использования в SIMD, но по Wiki Я читал следующее: «Архитектура VFP также поддерживает выполнение коротких векторных инструкций, но они последовательно работают с каждым векторным элементом и, следовательно, не обеспечивают производительность настоящего SIMD (Single Instruction Multiple Data). «

Это не так ясно, чему верить, может ли кто-нибудь уточнить эту тему?

ответ

36

Существует довольно разная разница между ними. Neon является процессором ускорителя SIMD (Single Instruction Multiple Data) в составе ядра ARM. Это означает, что во время выполнения одной команды одна и та же операция будет выполняться параллельно с 16 наборами данных. Поскольку внутри Neon есть параллелизм, вы можете получить больше MIPS или FLOPS из Neon, чем стандартный процессор SISD, работающий с одинаковой тактовой частотой.

Самым большим преимуществом Neon является то, что вы хотите выполнить операцию с векторами, то есть кодирование/декодирование видео. Также он может выполнять параллельные операции с плавающей точкой (float) с одинарной точностью.

VFP - это классический аппаратный ускоритель с плавающей точкой. Это не параллельная архитектура, как Neon. В основном он выполняет одну операцию на одном наборе входов и возвращает один выход. Цель - ускорить вычисления с плавающей запятой. Он поддерживает одинарную и двойную точность с плавающей запятой.

У вас есть 3 возможности использовать неон:

  • использование Intrinsics функции #include «arm_neon.h»
  • встроенный код сборки
  • пусть ССАГПЗ сделать оптимизацию для вас, предоставляя -mfpu=neon как аргумент (gcc 4.5 хорошо подходит)
2

IIRC, VFP - это сопроцессор с плавающей запятой, который работает последовательно.

Это означает, что вы можете использовать инструкцию для вектора поплавков для поведения SIMD-типа, но внутренне команда выполняется для каждого элемента вектора в последовательности.

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

True SIMD получит больше производительности с плавающей запятой, но использование VFP с векторами все же быстрее, чем использование его чисто последовательным.

16

Архитектурно, VFP (он не назывался Vector Floating Point for nothing) действительно имеет положение для работы с вектором с плавающей запятой в одной команде. Я не думаю, что он когда-либо выполнял операции мультиплексирования одновременно (например, истинный SIMD), но он мог бы сэкономить некоторый размер кода. Однако, если вы прочитаете Справочное руководство по архитектуре ARM в справке Shark (как я опишу в своем введении к NEON, ссылка 1 в вопросе), вы увидите в разделе A2.6, что векторная функция VFP устарела в ARMv7 (это то, что реализует Cortex A8), а программное обеспечение должно использовать Advanced SIMD для векторных операций с плавающей запятой.

Хуже того, в реализации Cortex A8 VFP реализован с помощью исполнительного блока VFP Lite (читайте lite как занимающий меньшую поверхность кремния, а не с меньшим количеством функций), что означает, что он на самом деле медленнее, чем на ARM11, например! К счастью, большинство инструкций VFP с одной точностью выполняются модулем NEON, но я не уверен, что векторные операции VFP выполняются; и даже если они это делают, они, безусловно, выполняются медленнее, чем с инструкциями NEON.

Надеюсь, что очищает вещь up!

+0

Эй, Пьер, открывание глаз!Но, я не мог понять, что вы подразумеваете под акулой, можете ли вы любезно опубликовать ссылку? – HaggarTheHorrible

+1

По тупым причинам нет прямой ссылки на документацию архитектуры ARM. Вместо этого я указываю разработчикам iOS на локальную копию, которую они уже имеют, в/Library/Application \ Support/Shark/Helpers/ARM \ Help.app/Contents/Resources/ARMISA.pdf (тем не менее, этот документ опускает устаревшую информацию или не имеет значения для разработки iOS, например, информации на системном уровне). Если вы не являетесь разработчиком iOS, перейдите по адресу http://infocenter.arm.com/help/topic/com.arm.doc.ddi0406b/index.html, зарегистрируйтесь в учетной записи, примите условия и загрузите документ. –

14

Для ARMv7 ISA (и вариантов)

неона является SIMD и параллельным блок обработки данных и для целочисленных данных с плавающей точкой, и VFP, является полностью IEEE-754 совместит модуль с плавающей точкой. В частности, на A8 модуль NEON намного быстрее для всего, даже если у вас нет высокопараллельных данных, поскольку VFP не является конвейерным.

Так почему бы вам использовать VFP ?!

Главное отличие заключается в том, что VFP обеспечивает двойную точность с плавающей запятой.

Во-вторых, есть некоторые специализированные инструкции, которые VFP предлагает, чтобы в модуле NEON не было эквивалентных реализаций. SQRT приходит на ум, возможно, некоторые преобразования типов.

Но самое важное отличие, не упомянутое в ответе Cosmin, состоит в том, что конвейер с плавающей точкой NEON не является полностью совместимым с IEEE-754. Лучшее описание различий содержится в FPSCR Register Description.

Поскольку он не совместим с IEEE-754, компилятор не может сгенерировать эти инструкции, если вы не сообщите компилятору, что вас не интересует полное соответствие. Это можно сделать несколькими способами.

  1. Использование встроенной функции для принудительного использования NEON, например, см. GCC Neon Intrinsic Function List.
  2. Спросите у компилятора, очень красиво. Даже более новые версии GCC с -mfpu=neon не будут генерировать инструкции NEON с плавающей запятой, если вы также не укажете -funsafe-math-optimizations.

Для armv8 + ISA (и варианты) [Update]

NEON теперь полностью ПЭО-754 соответствует, и от программиста (и компилятора) точки зрения, на самом деле не слишком большая разница , Двойная точность была векторизована. С точки зрения микроархитектуры я сомневаюсь, что это даже разные аппаратные блоки. ARM выполняет документацию по скалярным и векторным инструкциям отдельно, но оба являются частью «Advanced SIMD».

+1

Другой причиной использования VFP является необходимость двойной точности, поскольку NEON не поддерживает двойную прецессию. Даже когда VFP не конвейерный (например, в Cortex A-8), он будет быстрее, чем внедрение двойного программного обеспечения с помощью NEON (я даже не думаю, что [double-float] (https://en.wikipedia.org/wiki/ Quadruple-precision_floating-point_format # Double-double_arithmetic) с использованием NEON будет бить VFP). –

+0

Не могу поверить, что забыл об этом в своем ответе. Благодаря! –

+0

Я только что узнал, что ARM64 NEON поддерживает двойную. Я предполагаю, что в основном это SSE2 для x86. –