Вопрос

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

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

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

  1. Ссылка 1

  2. Ссылка 2.

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

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

Это было полезно?

Решение

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

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

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 с одинарной точностью выполняются модулем NEON, но я не уверен, что операции векторного VFP выполняются;и даже если они это делают, они, безусловно, выполняются медленнее, чем с инструкциями NEON.

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

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

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

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

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

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

Но самое важное отличие не упомянуто в ответе Cosmin, состоит в том, что трубопровод Neon с плавающей запятой не является полностью совместимым IEEE-754. Лучшее описание различий в Регистрация FSCR Описание.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top