LINUX.ORG.RU

[gentoo][gcc]-mfpmath

 ,


0

2
double test(double a, double b) {
 return 1.0 + sin (a + b*b);
}

gcc -O2 -fomit-frame-pointer -mssse3 -ffast-math -mfpmath=387

test:
        fldl    12(%esp)
        fmul    %st(0), %st
        faddl   4(%esp)
        fsin
        fadds   .LC0
        ret
gcc -O2 -fomit-frame-pointer -mssse3 -ffast-math -mfpmath=sse
test:
        subl    $44, %esp
        movsd   56(%esp), %xmm0
        mulsd   %xmm0, %xmm0
        addsd   48(%esp), %xmm0
        movsd   %xmm0, (%esp)
        call    sin
        fstpl   24(%esp)
        movsd   24(%esp), %xmm0
        addsd   .LC0, %xmm0
        movsd   %xmm0, 24(%esp)
        fldl    24(%esp)
        addl    $44, %esp
        ret
gcc -O2 -fomit-frame-pointer -mssse3 -ffast-math -mfpmath=sse+387
test:
        fldl    12(%esp)
        fmul    %st(0), %st
        faddl   4(%esp)
        fsin
        faddl   .LC0
        ret
gcc -O2 -fomit-frame-pointer -mssse3 -ffast-math -mfpmath=sse -msseregparm
test:
        subl    $12, %esp
        mulsd   %xmm1, %xmm1
        addsd   %xmm0, %xmm1
        movapd  %xmm1, %xmm0
        call    sin
        addsd   .LC0, %xmm0
        addl    $12, %esp
        ret
gcc -O2 -fomit-frame-pointer -mssse3 -ffast-math -mfpmath=sse+387 -msseregparm
test:
        subl    $20, %esp
        mulsd   %xmm1, %xmm1
        movsd   %xmm1, (%esp)
        fldl    (%esp)
        movsd   %xmm0, 8(%esp)
        faddl   8(%esp)
        fsin
        fstpl   (%esp)
        movsd   (%esp), %xmm0
        addsd   .LC0, %xmm0
        addl    $20, %esp
        ret

Как видно, код для устаревшего FPU в некоторых случаях оказывается эффективнее SSE(кстати, к сравопросу о 32 vs 64...). Ман про «sse+387» говорит, что опция экспериментальная и пользоваться нужно с осторожностью. У кого вся система так собрана, есть ли проблемы?

Если собрать всю систему -msseregparm, то так понимаю где-нибудь поломается бинарная совместимость?

★★★★★

>код для устаревшего FPU в некоторых случаях оказывается эффективнее SSE

по листингу или по скорости работы ? некоторые пишут что 387 иногда быстрее

Ман про «sse+387» говорит, что опция экспериментальная


это давно так, проблем со стабильностью это не вызывает, со скоростью работы - возможно, но надо делать бенчмарки чтобы сравнить, так не заметно

всю систему -msseregparm, то так понимаю где-нибудь поломается


в том то и суть, что надо собирать всю систему полностью, весь userland, и библиотеки и приложения, с учетом выборочной фильтрации флагов в gentoo portage нужно будет подставлять workaround'ы , хотя идея в целом интересная, мне тоже интересно как-нибудь попробовать или прочитать отзывы тех, кто попробует.



Sylvia ★★★★★
()
Ответ на: комментарий от devl547

>Этот самый код дольше исполняется, емнип, чем SSE.

Конкретно для расчета sin все равно вызывается библиотечная функция, которая считает через FPU.

madcore ★★★★★
() автор топика
Ответ на: комментарий от Sylvia

>в том то и суть, что надо собирать всю систему полностью

Статически собрать не?

anon_666
()
Ответ на: комментарий от annulen

ты время исполнения приведи, а не число инструкций

#include <math.h>
#include <stdio.h>
double test(double a, double b) {
double c;int i;
 for (i=0;i<640000;i++)
    c=1.0+i + sin (a + b*b);
 return c;
}
int main(){
    int i;
    double ccc;
    for (i=0;i<10000;i++)
        ccc=test(1,2);

387:

real    0m8.052s
user    0m7.723s
sys     0m0.000s

sse:

real    0m14.643s
user    0m14.379s
sys     0m0.000s

madcore ★★★★★
() автор топика
Ответ на: комментарий от KPSS

>sse+387 вообще без проблем, -ffast-math моск парит при сборке.

С -ffast-math всё и не должно собираться.

madcore ★★★★★
() автор топика
Ответ на: комментарий от Sylvia

А вот что получается при «icc -O2 -xT -fomit-frame-pointer» на том же коде:

real    0m1.564s
user    0m1.500s
sys     0m0.000s

Уж очень большой разрыв. Посмотрел, что генерит - всё вроде честно, циклов не выкинуло, заранее ничего не посчитало... Чудеса.

madcore ★★★★★
() автор топика
Ответ на: комментарий от madcore

> -xT

у тебя десятка?

Уж очень большой разрыв.

интересно, что будет, если SSE2 вырубить. вдруг еще быстрее пойдет :)

annulen ★★★★★
()
Ответ на: комментарий от madcore

>Хм, а там ключи поменялись? а я и не посмотрел)

в ман бы хоть глянул)

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.