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

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

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

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

  1. Link1

  2. Link2.

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

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


person HaggarTheHorrible    schedule 04.11.2010    source источник


Ответы (4)


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

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

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

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

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

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

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

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

Самое главное отличие состоит в том, что VFP поддерживает числа с плавающей запятой двойной точности.

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

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

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

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

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

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

person Peter M    schedule 07.02.2013
comment
Еще одна причина использовать VFP - это когда вам нужна двойная точность, поскольку NEON не поддерживает двойную прецессию. Даже когда VFP не конвейеризован (например, в Cortex A-8), это будет быстрее, чем реализация двойного программного обеспечения с использованием NEON (я даже не думаю, что double-float с использованием NEON превзойдет VFP). - person Z boson; 19.06.2015
comment
Не могу поверить, что забыл об этом в своем ответе. Спасибо! - person Peter M; 20.06.2015
comment
Я только что узнал, что ARM64 NEON поддерживает двойную. Думаю, тогда это в основном похоже на SSE2 для x86. - person Z boson; 22.06.2015
comment
Привет. Неужели NEON теперь с двойной точностью? - person Mattis Asp; 26.05.2018

Архитектурно 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.

Надеюсь, это проясняет ситуацию!

person Pierre Lebeaupin    schedule 05.11.2010
comment
Эй, Пьер, глаза открыты! Но я не мог понять, что вы имеете в виду под Shark help, не могли бы вы опубликовать ссылку? - person HaggarTheHorrible; 05.11.2010
comment
По тупым причинам нет прямой ссылки на документацию по архитектуре ARM. Вместо этого я указываю разработчикам iOS на локальную копию, которая у них уже есть, в / Library / Application \ Support / Shark / Helpers / ARM \ Help.app/Contents/Resources/ARMISA.pdf (еще лучше, этот документ опускает информацию, которая устарела или не имеет отношения к разработке iOS, например, информация на системном уровне). Если вы не разработчик iOS, перейдите в информационный центр. .arm.com / help / topic / com.arm.doc.ddi0406b / index.html, зарегистрируйтесь, примите условия и загрузите документ. - person Pierre Lebeaupin; 06.11.2010

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

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

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

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

person sum1stolemyname    schedule 04.11.2010