Я знаю, что x87 имеет более высокую внутреннюю точность, и это, вероятно, самая большая разница, которую люди видят между ним и операциями SSE. Но я должен задаться вопросом, есть ли какие-либо другие преимущества использования x87? У меня есть привычка автоматически вводить -mfpmath=sse
в любом проекте, и мне интересно, не упустил ли я что-нибудь еще, что предлагает x87 FPU.
Преимущества x87 перед SSE
Ответы (5)
Для рукописного ассемблера в x87 есть некоторые инструкции, которых нет в наборе инструкций SSE.
У меня в голове все тригонометрические вещи, такие как fsin, fcos, fatan,fatan2 и некоторые экспоненциальные/логарифмические штуки.
С gcc -O3 -ffast-math -mfpmath=387
GCC9 будет фактически встраивать sin(x)
как инструкцию fsin
, независимо от того, что использовала бы реализация в libm. (https://godbolt.org/z/Euc5gp).
MSVC вызывает __libm_sse2_sin_precise
при компиляции для 32-разрядной архитектуры x86.
Если ваш код тратит большую часть времени на выполнение тригонометрии, вы можете увидеть небольшой прирост или снижение производительности при использовании x87, в зависимости от того, работает ли ваша стандартная реализация математической библиотеки с использованием SSE1/SSE2 быстрее или медленнее, чем медленный микрокод для fsin
на любом ЦП, который вы используете.
Производители ЦП не прилагают особых усилий для оптимизации микрокода для инструкций x87 в новейших поколениях ЦП, потому что он обычно считается устаревшим и редко используется. (Посмотрите на количество операций и пропускную способность для сложных инструкций x87 в таблицах инструкций Agner Fog в последних поколениях процессоров: больше циклов чем в старых процессорах). Чем новее ЦП, тем более вероятно, что x87 будет медленнее, чем многие инструкции SSE или AVX, для вычисления функций журнала, опыта, pow или триггера.
Даже когда x87 доступен, не все математические библиотеки предпочитают использовать сложные инструкции, такие как fsin
, для реализации таких функций, как sin()
, или особенно exp/log, где полезны целочисленные трюки для манипулирования битовыми шаблонами FP на основе журнала.
Некоторые алгоритмы DSP используют много триггеров, но обычно выигрывают много от автоматической векторизации с помощью математических библиотек SIMD.
Однако для математического кода, где вы тратите большую часть своего времени на сложения, умножения и т. д., SSE обычно быстрее.
Также относится: Intel недооценивает ошибку Границы на 1,3 квинтиллиона — наихудший случай для fsin
(катастрофическая отмена для fsin
входов, очень близких к pi) — это очень плохо. Программное обеспечение может работать лучше, но только с медленными методами повышенной точности.
d1=d2+d3+d4;
в пределах 0,501LSB; без такой поддержки вычисление значения даже с точностью до 0,75 младшего разряда требует гораздо больше шагов. Если только SSE не намного быстрее, чем x87, я думаю, что правильная поддержка x87 может улучшить производительность больше, чем более быстрые способы арифметики с сопоставлением размеров.
- person supercat; 19.10.2014
sin()
и pow
математической библиотеки SIMD намного лучше в 2019 году, поэтому преимущество DSP крайне сомнительно. SIMD обычно идеально подходит для DSP.)
- person Peter Cordes; 30.07.2019
- Он присутствует на очень старых машинах.
EOF
Инструкции FPU меньше, чем инструкции SSE, поэтому они идеально подходят для демосцены.
fxch
, вероятно, не перевешивает это. Я думаю, это зависит от схемы сжатия; Я не смотрел, что на самом деле делают демо. Однако x87 отлично подходит для кодового гольфа, например. это
- person Peter Cordes; 30.07.2019
Существует значительная устаревшая и небольшая системная совместимость с x87: SSE — относительно новая функция процессора. Если ваш код должен работать на встроенном микроконтроллере, есть большая вероятность, что он не будет поддерживать инструкции SSE.
Даже системы, в которых не установлен FPU, часто предоставляют эмуляторы 80x87, которые обеспечивают прозрачную работу кода (более или менее). Я не знаю ни одного эмулятора SSE — уж точно ни в одной из моих систем его нет, поэтому новейшие версии элементов Adobe Photoshop отказываются работать.
Инструкции 80x87 имеют хорошие характеристики параллельной работы, которые тщательно изучались и анализировались с момента их появления в 1982 году или около того. Различные клоны x86 могут зависать на инструкциях SSE.
Преобразование между float
и double
происходит быстрее с x87 (обычно бесплатно), чем с SSE. С x87 вы можете загружать и сохранять float
, double
или long double
в или из стека регистров, и они преобразуются в расширенную точность или из нее без дополнительных затрат. В SSE требуются дополнительные инструкции для преобразования типов, если типы смешаны, поскольку регистры содержат значения float
или double
. Эти инструкции по преобразованию довольно быстрые, но требуют дополнительного времени.
Реальное решение состоит в том, чтобы воздерживаться от чрезмерного смешивания float
и double
, не использовать x87, конечно.