Для armv7 ISA (и его вариантов)
NEON - это SIMD и параллельный блок обработки данных для целочисленных данных и данных с плавающей запятой, а VFP - полностью совместимая с IEEE-754 с плавающей запятойБлок.В частности, на A8 устройство NEON намного быстрее практически для всего, даже если у вас нет высокопараллельных данных, поскольку VFP не конвейерен.
Так зачем вам использовать VFP??!
Основное различие заключается в том, что VFP обеспечивает с плавающей запятой двойной точности.
Во-вторых, есть некоторые специализированные инструкции, которые VFP предлагает, что в модуле NEON нет эквивалентных реализаций.,На ум приходит SQRT, возможно, некоторые преобразования типов.
Но самое важное отличие, не упомянутое в ответе Космина, заключается в том, что конвейер с плавающей точкой NEON не полностью соответствует IEEE-754.Наилучшее описание различий приведено в Описание регистра FPSCR .
Поскольку он не совместим с IEEE-754, компилятор не может сгенерировать эти инструкции, если вы не сообщите компилятору, что вас это не интересует.в полном соответствии.Это можно сделать несколькими способами.
- Использование встроенной функции для принудительного использования NEON, например, см. Список встроенных функций GCC Neon .
- Задайте вопроскомпилятор, очень красиво.Даже более новые версии GCC с
-mfpu=neon
не будут генерировать инструкции NEON с плавающей запятой, если только вы не укажете -funsafe-math-optimizations
.
Для armv8 + ISA (и варианты) [Обновить]
NEON теперь полностью совместим с IEE-754, и с точки зрения программиста (и компилятора), разница на самом деле не слишком велика.Двойная точность была векторизована.С точки зрения микроархитектуры я сомневаюсь, что это даже разные аппаратные устройства.ARM документирует скалярные и векторные инструкции отдельно, но оба они являются частью «Advanced SIMD».