Знам, че x87 има по-висока вътрешна точност, което е може би най-голямата разлика, която хората виждат между него и SSE операциите. Но трябва да се чудя има ли някаква друга полза от използването на x87? Имам навика да въвеждам -mfpmath=sse
автоматично във всеки проект и се чудя дали не пропускам нещо друго, което x87 FPU предлага.
Предимства на x87 пред SSE
Отговори (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) е много лош. Софтуерът може да се справи по-добре, но само с бавни техники с разширена точност.
d1=d2+d3+d4;
да бъде изчислен директно в рамките на 0.501LSB; без такава поддръжка, изчисляването на стойността до 0,75LSB отнема много повече стъпки. Освен ако SSE не е много по-бърз от x87, бих си помислил, че правилната поддръжка на x87 може да подобри производителността повече от наличието на по-бързи начини за аритметика със съвпадащ размер.
- person supercat; 19.10.2014
sin()
и pow
е много по-добра през 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, разбира се.