ARM Cortex-A8: в чем разница между VFP и NEON - PullRequest
43 голосов
/ 04 ноября 2010

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

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

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

  1. Link1

  2. Link2 .

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

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

Ответы [ 4 ]

42 голосов
/ 04 ноября 2010

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

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

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

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

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

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

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

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

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

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

Но самое важное отличие, не упомянутое в ответе Космина, заключается в том, что конвейер с плавающей точкой 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».

16 голосов
/ 05 ноября 2010

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

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

Надеюсь, что все прояснилось!

2 голосов
/ 04 ноября 2010

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

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

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

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

...