Преимущества x87 перед SSE

Я знаю, что x87 имеет более высокую внутреннюю точность, и это, вероятно, самая большая разница, которую люди видят между ним и операциями SSE. Но я должен задаться вопросом, есть ли какие-либо другие преимущества использования x87? У меня есть привычка автоматически вводить -mfpmath=sse в любом проекте, и мне интересно, не упустил ли я что-нибудь еще, что предлагает x87 FPU.


person Tom    schedule 04.12.2009    source источник


Ответы (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) — это очень плохо. Программное обеспечение может работать лучше, но только с медленными методами повышенной точности.

person Nils Pipenbrinck    schedule 04.12.2009
comment
@LiraNuna правда? Я не знаю ни одного кода операции, который напрямую вычисляет sin или cos из набора инструкций SSE. - person Nils Pipenbrinck; 07.01.2010
comment
Пожалуйста, предоставьте источник, Quonux. - person asdf; 17.06.2011
comment
Насколько быстрее SSE и в каких случаях это имеет значение? Надлежащая языковая поддержка x87 (которой, к сожалению, уже давно не хватает) позволила бы напрямую вычислять выражение типа d1=d2+d3+d4; в пределах 0,501LSB; без такой поддержки вычисление значения даже с точностью до 0,75 младшего разряда требует гораздо больше шагов. Если только SSE не намного быстрее, чем x87, я думаю, что правильная поддержка x87 может улучшить производительность больше, чем более быстрые способы арифметики с сопоставлением размеров. - person supercat; 19.10.2014
comment
К вашему сведению, инструкции для x87 FPU перечислены в разделе 5.2.4 Руководства Intel для разработчиков в разделе Transcendental Studies в наборе из 4 томов на странице 121: ‹code›fsin‹/code› для синуса ‹code›fcos‹/code› для cosign и, как сказал @NilsPipenbrinck, также есть некоторые логарифмические вещи - person Robert Houghton; 29.07.2019
comment
@Nils: Если вы предпочитаете, чтобы я опубликовал большую часть своих правок в виде отдельного ответа, дайте мне знать. Большая часть того, что я добавил, уже было верно в 2009 году, но x87 более устарел в 2019 году. (И поддержка компилятором автоматической векторизации с реализациями sin() и pow математической библиотеки SIMD намного лучше в 2019 году, поэтому преимущество DSP крайне сомнительно. SIMD обычно идеально подходит для DSP.) - person Peter Cordes; 30.07.2019

  1. Он присутствует на очень старых машинах.

EOF

person Simeon Pilgrim    schedule 04.12.2009

Инструкции FPU меньше, чем инструкции SSE, поэтому они идеально подходят для демосцены.

person Quonux    schedule 12.10.2010
comment
Я не покупаюсь на это; наверняка серьезные программисты демонстрационных сцен сжимают свои потоки команд; инструменты сжатия для предметной области должны иметь возможность сжимать инструкции SSE так же, как инструкции x87. - person Stephen Canon; 03.03.2013
comment
@StephenCanon (несжатый), но ваша точка зрения верна, если вы/они используете какое-либо сжатие - person Quonux; 28.07.2013
comment
@StephenCanon: инструкции стека с 1 операндом (x87) имеют меньшую энтропию, чем инструкции SSE с 2 операндами, где ни один из операндов не является неявным. Случайный fxch, вероятно, не перевешивает это. Я думаю, это зависит от схемы сжатия; Я не смотрел, что на самом деле делают демо. Однако x87 отлично подходит для кодового гольфа, например. это - person Peter Cordes; 30.07.2019

  • Существует значительная устаревшая и небольшая системная совместимость с x87: SSE — относительно новая функция процессора. Если ваш код должен работать на встроенном микроконтроллере, есть большая вероятность, что он не будет поддерживать инструкции SSE.

  • Даже системы, в которых не установлен FPU, часто предоставляют эмуляторы 80x87, которые обеспечивают прозрачную работу кода (более или менее). Я не знаю ни одного эмулятора SSE — уж точно ни в одной из моих систем его нет, поэтому новейшие версии элементов Adobe Photoshop отказываются работать.

  • Инструкции 80x87 имеют хорошие характеристики параллельной работы, которые тщательно изучались и анализировались с момента их появления в 1982 году или около того. Различные клоны x86 могут зависать на инструкциях SSE.

person wallyk    schedule 04.12.2009
comment
Таким образом, ваш итог таков: (а) x87 имеет хорошую устаревшую поддержку (б) x87 хорошо изучен. - person Nathan Fellman; 06.12.2009
comment
Я не на 100% уверен, но я считаю, что на многих 32-битных процессорах без FPU вычисления с плавающей запятой могут быть выполнены быстрее для 80-битных значений, чем для 64-битных [53-битная мантисса и 12-битная мантисса]. битовая экспонента работает не быстрее, чем 64-битная мантисса и 16-битная экспонента, но требует дополнительного времени для упаковки и распаковки]. Я действительно озадачен тем, почему 80-битный формат чахнет последние пару десятилетий, поскольку как формат вычислений он во всех отношениях превосходит 64-битный двойник. - person supercat; 19.10.2014
comment
Ни один ЦП в тестировании Agner Fog (agner.org/optimize) не имеет SSE, но неэффективен. Если присутствует SSE, он всегда эффективен (конвейерное добавление/подчинение/множество), а разделение SSE не медленнее, чем разделение x87. Некоторые ЦП разбивают 128-битные инструкции SIMD SSE на две 64-битные половины, но скалярные SSE/SSE2 по-прежнему эффективны. Итак, ваш последний пункт — это просто чрезмерная осторожность: никто не удосуживается реализовать медленный SSE, они просто полностью исключают его (например, процессоры AMD Geode с очень низким энергопотреблением). - person Peter Cordes; 30.07.2019

Преобразование между float и double происходит быстрее с x87 (обычно бесплатно), чем с SSE. С x87 вы можете загружать и сохранять float, double или long double в или из стека регистров, и они преобразуются в расширенную точность или из нее без дополнительных затрат. В SSE требуются дополнительные инструкции для преобразования типов, если типы смешаны, поскольку регистры содержат значения float или double. Эти инструкции по преобразованию довольно быстрые, но требуют дополнительного времени.

Реальное решение состоит в том, чтобы воздерживаться от чрезмерного смешивания float и double, не использовать x87, конечно.

person jilles    schedule 04.11.2011
comment
Интересно. Это все еще актуально для современных процессоров x64, AVX и более поздних? - person Johan Lundberg; 08.02.2021