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

Знам, че x87 има по-висока вътрешна точност, което е може би най-голямата разлика, която хората виждат между него и SSE операциите. Но трябва да се чудя има ли някаква друга полза от използването на x87? Имам навика да въвеждам -mfpmath=sse автоматично във всеки проект и се чудя дали не пропускам нещо друго, което x87 FPU предлага.


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


Отговори (5)


За ръкописен asm 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 на каквото и да е CPU, който използвате.

Доставчиците на процесори не полагат много усилия за оптимизиране на микрокода за x87 инструкции в най-новите поколения процесори, тъй като обикновено се считат за остарели и рядко използвани. (Вижте броя на uop и пропускателната способност за сложни x87 инструкции в таблиците с инструкции на Agner Fog в последните поколения CPU: повече цикли отколкото в по-старите процесори). Колкото по-нов е процесорът, толкова по-вероятно е x87 да бъде по-бавен от много SSE или AVX инструкции за изчисляване на log, exp, pow или trig функции.

Дори когато x87 е наличен, не всички математически библиотеки избират да използват сложни инструкции като fsin за внедряване на функции като sin() или особено exp/log, където са полезни целочислени трикове за манипулиране на базираните на журнал FP битови модели.

Някои DSP алгоритми използват много тригонометри, но обикновено се възползват много от автоматичната векторизация с математически библиотеки SIMD.

Въпреки това, за математически код, където прекарвате по-голямата част от времето си в събиране, умножение и т.н., SSE обикновено е по-бърз.


Също така свързано: Intel Underestimates Error Граници с 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,75LSB отнема много повече стъпки. Освен ако SSE не е много по-бърз от x87, бих си помислил, че правилната поддръжка на x87 може да подобри производителността повече от наличието на по-бързи начини за аритметика със съвпадащ размер. - person supercat; 19.10.2014
comment
Само за информация тези инструкции за x87 FPU са изброени в Раздел 5.2.4 от Ръководството за разработчици на Intel под Transcendental Instructions в комплекта от 4 тома, това е страница 121: ‹code›fsin‹/code› за синус ‹code›fcos‹/code› за cosign и както @NilsPipenbrinck каза, някои неща за логаритъм също има - person Robert Houghton; 29.07.2019
comment
@Nils: Ако предпочитате да публикувам по-голямата част от моята редакция като отделен отговор, уведомете ме. Повечето от това, което добавих, вече беше вярно през 2009 г., но x87 беше по-остарял през 2019 г. (И поддръжката на компилатора за автоматично векторизиране с реализации на SIMD математически библиотеки на sin() и pow е много по-добра през 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
И така, изводът ви е: (a) x87 има добра поддръжка за наследство (b) x87 е добре проучен. - person Nathan Fellman; 06.12.2009
comment
Не съм 100% сигурен, но вярвам, че на много 32-битови процесори без FPU математиката с плаваща запетая може да се направи по-бързо на 80-битови стойности, отколкото на 64-битови стойности [53-битова мантиса и 12- bit exponent не са по-бързи за работа от 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