Подтвердить что ты не робот

ARM Cortex-A8: В чем разница между VFP и NEON

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

  • использовать функции intrinsics #include "arm_neon.h"
  • встроить код сборки
  • дайте gcc выполнить оптимизацию для вас, предоставив -mfpu=neon в качестве аргумента (gcc 4.5 хорош в этом)

Ответ 2

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

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

Надеюсь, что это очистит!

Ответ 3

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

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

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

Самое главное отличие состоит в том, что VFP обеспечивает плавную точку с двойной точностью.

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

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

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

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

Для armv8 + ISA (и вариантов) [Обновить]

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

Ответ 4

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

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

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

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