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

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

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

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

  1. link1 и

  2. Link2.

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

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

4 ответов


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

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

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

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

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

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

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

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


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

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

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

самая главная разница что ВФП обеспечивает двойную точность с плавающей запятой.

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

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

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

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

для armv8+ ISA (и вариантов) [обновление]

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


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

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

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

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