Глюк оптимизатора?
От: Minstrell Россия  
Дата: 16.01.07 22:09
Оценка:
class Matrix {
...
public:
    Matrix operator*(const Matrix&);
};

class Vector {
...
public:
    Vector operator*(const Matrix&);
};

Matrix f1() {
...
}

Matrix f2() {
...
}

int main(void) {
    const int N = 1000000;
    std::vector<Vector> v(N);
    Matrix M = f1 * f2;
    for(int i = 0; i < N; i++)
        v[i] = v[i] * M;
    return 0;
}


Оптимизатор "оптимизирует", проверено дизассемблирование релиза:

...
int main(void) {
    ...
    Matrix M;
    for(int i = 0; i < N; i++)
        v[i] = v[i] * f1 * f2;
    return 0;
}
...


Просто антиоптимизация какая-то. Это как-то лечится?
Re: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 06:03
Оценка:
Здравствуйте, Minstrell, Вы писали:

M>int main(void) {
M>    const int N = 1000000;
M>    std::vector<Vector> v(N);
M>    Matrix M = f1() * f2();
M>    for(int i = 0; i < N; i++)
M>        v[i] = v[i] * M;
M>    return 0;
M>}
M>


M>
M>...
M>int main(void) {
M>    ...
M>    Matrix M;
M>    for(int i = 0; i < N; i++)
M>        v[i] = v[i] * f1() * f2();
M>    return 0;
M>}
M>...
M>


Заметил небольшую ошибку в посте. Выделено в коде.
Re: Глюк оптимизатора?
От: rm822 Россия  
Дата: 17.01.07 14:03
Оценка:
Здравствуйте, Minstrell, Вы писали:

M>
      const Matrix M = f1 * f2;       //Попробуй так
      const Matrix& M = f1 * f2;      //или так
M>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Глюк оптимизатора?
От: Аноним  
Дата: 17.01.07 14:35
Оценка:
M>Просто антиоптимизация какая-то. Это как-то лечится?

Какая версия компилятора?

Лечится скорее всего более внимательным дизассемьлированием.
Re: Глюк оптимизатора?
От: Андрей Тарасевич Беларусь  
Дата: 17.01.07 15:01
Оценка:
Здравствуйте, Minstrell, Вы писали:

M>Оптимизатор "оптимизирует", проверено дизассемблирование релиза:


А взглянуть на дизассемблированный код можно?
Best regards,
Андрей Тарасевич
Re[2]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 15:17
Оценка:
Здравствуйте, rm822, Вы писали:

R>Здравствуйте, Minstrell, Вы писали:


M>>
R>      const Matrix M = f1 * f2;       //Попробуй так
R>      const Matrix& M = f1 * f2;      //или так
M>>


Спасибо, попробую.
Re[2]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 15:19
Оценка:
Здравствуйте, Аноним, Вы писали:

M>>Просто антиоптимизация какая-то. Это как-то лечится?


А>Какая версия компилятора?


А>Лечится скорее всего более внимательным дизассемьлированием.


Компилятор MSVC8. Дизассемблирование в IDA достаточно внимательное, чтобы понять как работает. Не буду же я листинг приводить...
Re[2]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 15:34
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, Minstrell, Вы писали:


M>>Оптимизатор "оптимизирует", проверено дизассемблирование релиза:


АТ>А взглянуть на дизассемблированный код можно?



.text:00401210 _wmain          proc near               ; CODE XREF: ___tmainCRTStartup+10Ap
.text:00401210
.text:00401210 var_458         = dword ptr -458h
.text:00401210 var_454         = qword ptr -454h
.text:00401210 var_44C         = qword ptr -44Ch
.text:00401210 var_43C         = qword ptr -43Ch
.text:00401210 var_434         = qword ptr -434h
.text:00401210 var_42C         = qword ptr -42Ch
.text:00401210 var_424         = qword ptr -424h
.text:00401210 var_41C         = qword ptr -41Ch
.text:00401210 var_414         = qword ptr -414h
.text:00401210 var_40C         = qword ptr -40Ch
.text:00401210 var_404         = qword ptr -404h
.text:00401210 var_3FC         = qword ptr -3FCh
.text:00401210 var_3F4         = qword ptr -3F4h
.text:00401210 var_3EC         = qword ptr -3ECh
.text:00401210 var_3E4         = qword ptr -3E4h
.text:00401210 var_3DC         = qword ptr -3DCh
.text:00401210 var_3D4         = qword ptr -3D4h
.text:00401210 var_3CC         = qword ptr -3CCh
.text:00401210 var_3C4         = qword ptr -3C4h
.text:00401210 var_3BC         = dword ptr -3BCh
.text:00401210 var_3B8         = dword ptr -3B8h
.text:00401210 var_3B4         = dword ptr -3B4h
.text:00401210 var_3B0         = dword ptr -3B0h
.text:00401210 var_3AC         = qword ptr -3ACh
.text:00401210 var_3A4         = qword ptr -3A4h
.text:00401210 var_39C         = qword ptr -39Ch
.text:00401210 var_394         = qword ptr -394h
.text:00401210 var_38C         = qword ptr -38Ch
.text:00401210 var_384         = qword ptr -384h
.text:00401210 var_37C         = qword ptr -37Ch
.text:00401210 var_374         = qword ptr -374h
.text:00401210 var_36C         = qword ptr -36Ch
.text:00401210 var_364         = qword ptr -364h
.text:00401210 var_35C         = qword ptr -35Ch
.text:00401210 var_354         = qword ptr -354h
.text:00401210 var_34C         = qword ptr -34Ch
.text:00401210 var_344         = qword ptr -344h
.text:00401210 var_33C         = qword ptr -33Ch
.text:00401210 var_334         = qword ptr -334h
.text:00401210 var_32C         = qword ptr -32Ch
.text:00401210 var_324         = qword ptr -324h
.text:00401210 var_31C         = qword ptr -31Ch
.text:00401210 var_314         = qword ptr -314h
.text:00401210 var_30C         = qword ptr -30Ch
.text:00401210 var_304         = qword ptr -304h
.text:00401210 var_2FC         = qword ptr -2FCh
.text:00401210 var_2F4         = qword ptr -2F4h
.text:00401210 var_2EC         = qword ptr -2ECh
.text:00401210 var_2E4         = qword ptr -2E4h
.text:00401210 var_2DC         = qword ptr -2DCh
.text:00401210 var_2D4         = qword ptr -2D4h
.text:00401210 var_2CC         = qword ptr -2CCh
.text:00401210 var_2C4         = qword ptr -2C4h
.text:00401210 var_2BC         = qword ptr -2BCh
.text:00401210 var_2B4         = qword ptr -2B4h
.text:00401210 var_2AC         = qword ptr -2ACh
.text:00401210 var_2A4         = qword ptr -2A4h
.text:00401210 var_29C         = qword ptr -29Ch
.text:00401210 var_294         = qword ptr -294h
.text:00401210 var_28C         = qword ptr -28Ch
.text:00401210 var_284         = qword ptr -284h
.text:00401210 var_27C         = qword ptr -27Ch
.text:00401210 var_274         = qword ptr -274h
.text:00401210 var_26C         = qword ptr -26Ch
.text:00401210 var_264         = qword ptr -264h
.text:00401210 var_25C         = qword ptr -25Ch
.text:00401210 var_254         = qword ptr -254h
.text:00401210 var_24C         = qword ptr -24Ch
.text:00401210 var_244         = qword ptr -244h
.text:00401210 var_23C         = qword ptr -23Ch
.text:00401210 var_234         = qword ptr -234h
.text:00401210 var_22C         = qword ptr -22Ch
.text:00401210 var_224         = qword ptr -224h
.text:00401210 var_21C         = qword ptr -21Ch
.text:00401210 var_214         = qword ptr -214h
.text:00401210 var_20C         = qword ptr -20Ch
.text:00401210 var_204         = qword ptr -204h
.text:00401210 var_1FC         = qword ptr -1FCh
.text:00401210 var_1F4         = qword ptr -1F4h
.text:00401210 var_1EC         = qword ptr -1ECh
.text:00401210 var_1E4         = qword ptr -1E4h
.text:00401210 var_1DC         = qword ptr -1DCh
.text:00401210 var_1D4         = qword ptr -1D4h
.text:00401210 var_1CC         = qword ptr -1CCh
.text:00401210 var_1C4         = qword ptr -1C4h
.text:00401210 var_1BC         = qword ptr -1BCh
.text:00401210 var_1B4         = qword ptr -1B4h
.text:00401210 var_1AC         = qword ptr -1ACh
.text:00401210 var_1A0         = dword ptr -1A0h
.text:00401210 var_194         = dword ptr -194h
.text:00401210 var_114         = dword ptr -114h
.text:00401210 var_94          = dword ptr -94h
.text:00401210 var_1C          = dword ptr -1Ch
.text:00401210 var_C           = dword ptr -0Ch
.text:00401210 var_4           = dword ptr -4
.text:00401210
.text:00401210                 push    ebp
.text:00401211                 mov     ebp, esp
.text:00401213                 and     esp, 0FFFFFFF8h
.text:00401216                 push    0FFFFFFFFh
.text:00401218                 push    offset byte_4029CB
.text:0040121D                 mov     eax, large fs:0
.text:00401223                 push    eax
.text:00401224                 sub     esp, 450h
.text:0040122A                 push    ebx
.text:0040122B                 push    esi
.text:0040122C                 push    edi
.text:0040122D                 mov     eax, dword_404000
.text:00401232                 xor     eax, esp
.text:00401234                 push    eax
.text:00401235                 lea     eax, [esp+46Ch+var_C]
.text:0040123C                 mov     large fs:0, eax
.text:00401242                 lea     eax, [esp+46Ch+var_458]
.text:00401246                 push    eax
.text:00401247                 lea     ecx, [esp+470h+var_1A0]
.text:0040124E                 push    ecx
.text:0040124F                 call    sub_401DA0
.text:00401254                 mov     [esp+46Ch+var_4], 0
.text:0040125F                 mov     edx, ds:?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z ; std::endl(std::basic_ostream<char,std::char_traits<char>> &)
.text:00401265                 mov     eax, ds:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text:0040126A                 push    edx
.text:0040126B                 push    ecx
.text:0040126C                 push    offset aStart?  ; "Start?"
.text:00401271                 push    eax
.text:00401272                 call    sub_401E70
.text:00401277                 add     esp, 0Ch
.text:0040127A                 mov     ecx, eax
.text:0040127C                 call    ds:??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
.text:00401282                 mov     ebx, ds:getchar
.text:00401288                 call    ebx ; getchar
.text:0040128A                 fld1
.text:0040128C                 fst     [esp+470h+var_2AC]
.text:00401293                 fst     [esp+470h+var_2D4]
.text:0040129A                 fst     [esp+470h+var_2FC]
.text:004012A1                 fst     [esp+470h+var_324]
.text:004012A8                 fldz
.text:004012AA                 fst     [esp+470h+var_30C]
.text:004012B1                 fst     [esp+470h+var_314]
.text:004012B8                 fst     [esp+470h+var_31C]
.text:004012BF                 fst     [esp+470h+var_2EC]
.text:004012C6                 fst     [esp+470h+var_2F4]
.text:004012CD                 fst     [esp+470h+var_304]
.text:004012D4                 fst     [esp+470h+var_2CC]
.text:004012DB                 fst     [esp+470h+var_2DC]
.text:004012E2                 fst     [esp+470h+var_2E4]
.text:004012E9                 fst     [esp+470h+var_2B4]
.text:004012F0                 fst     [esp+470h+var_20C]
.text:004012F7                 fst     [esp+470h+var_214]
.text:004012FE                 fst     [esp+470h+var_1EC]
.text:00401305                 fst     [esp+470h+var_1F4]
.text:0040130C                 fst     [esp+470h+var_1CC]
.text:00401313                 fst     [esp+470h+var_1DC]
.text:0040131A                 fst     [esp+470h+var_1E4]
.text:00401321                 fst     [esp+470h+var_1B4]
.text:00401328                 fst     [esp+470h+var_1BC]
.text:0040132F                 fstp    [esp+470h+var_1C4]
.text:00401336                 fst     [esp+470h+var_2C4]
.text:0040133D                 fst     [esp+470h+var_2BC]
.text:00401344                 fst     [esp+470h+var_1AC]
.text:0040134B                 fstp    [esp+470h+var_1D4]
.text:00401352                 fld     ds:dbl_403150
.text:00401358                 call    _CIsin
.text:0040135D                 fstp    [esp+470h+var_3AC]
.text:00401364                 fld     ds:dbl_403150
.text:0040136A                 call    _CIcos
.text:0040136F                 fst     [esp+470h+var_1FC]
.text:00401376                 fstp    [esp+470h+var_224]
.text:0040137D                 fld     [esp+470h+var_3AC]
.text:00401384                 fld     st
.text:00401386                 fchs
.text:00401388                 fstp    [esp+470h+var_204]
.text:0040138F                 fstp    [esp+470h+var_21C]
.text:00401396                 fld1
.text:00401398                 fst     [esp+470h+var_22C]
.text:0040139F                 fst     [esp+470h+var_254]
.text:004013A6                 fst     [esp+470h+var_2A4]
.text:004013AD                 fldz
.text:004013AF                 fst     [esp+470h+var_28C]
.text:004013B6                 fst     [esp+470h+var_294]
.text:004013BD                 fst     [esp+470h+var_29C]
.text:004013C4                 fst     [esp+470h+var_26C]
.text:004013CB                 fst     [esp+470h+var_274]
.text:004013D2                 fst     [esp+470h+var_284]
.text:004013D9                 fst     [esp+470h+var_24C]
.text:004013E0                 fst     [esp+470h+var_25C]
.text:004013E7                 fst     [esp+470h+var_264]
.text:004013EE                 fst     [esp+470h+var_234]
.text:004013F5                 fst     [esp+470h+var_23C]
.text:004013FC                 fst     [esp+470h+var_244]
.text:00401403                 fld     ds:dbl_403140
.text:00401409                 fstp    [esp+470h+var_27C]
.text:00401410                 fxch    st(1)
.text:00401412                 fst     [esp+470h+var_3C4]
.text:00401419                 fstp    [esp+470h+var_3EC]
.text:00401420                 fst     [esp+470h+var_424]
.text:00401424                 fst     [esp+470h+var_42C]
.text:00401428                 fst     [esp+470h+var_404]
.text:0040142C                 fst     [esp+470h+var_40C]
.text:00401430                 fst     [esp+470h+var_3E4]
.text:00401437                 fst     [esp+470h+var_3F4]
.text:0040143B                 fst     [esp+470h+var_3FC]
.text:0040143F                 fst     [esp+470h+var_3CC]
.text:00401446                 fst     [esp+470h+var_3D4]
.text:0040144D                 fstp    [esp+470h+var_3DC]
.text:00401454                 fld     ds:dbl_403148
.text:0040145A                 call    _CIsin
.text:0040145F                 fstp    [esp+470h+var_3AC]
.text:00401466                 fld     ds:dbl_403148
.text:0040146C                 call    _CIcos
.text:00401471                 fst     [esp+470h+var_414]
.text:00401475                 fstp    [esp+470h+var_43C]
.text:00401479                 lea     ecx, [esp+470h+var_43C]
.text:0040147D                 fld     [esp+470h+var_3AC]
.text:00401484                 lea     eax, [esp+470h+var_114]
.text:0040148B                 fld     st
.text:0040148D                 lea     edx, [esp+470h+var_3A4]
.text:00401494                 fchs
.text:00401496                 fstp    [esp+470h+var_41C]
.text:0040149A                 fstp    [esp+470h+var_434]
.text:0040149E                 fld1
.text:004014A0                 fst     [esp+470h+var_32C]
.text:004014A7                 fst     [esp+470h+var_354]
.text:004014AE                 fst     [esp+470h+var_37C]
.text:004014B5                 fstp    [esp+470h+var_3A4]
.text:004014BC                 fldz
.text:004014BE                 fst     [esp+470h+var_38C]
.text:004014C5                 fst     [esp+470h+var_394]
.text:004014CC                 fst     [esp+470h+var_39C]
.text:004014D3                 fst     [esp+470h+var_36C]
.text:004014DA                 fst     [esp+470h+var_374]
.text:004014E1                 fst     [esp+470h+var_384]
.text:004014E8                 fst     [esp+470h+var_34C]
.text:004014EF                 fst     [esp+470h+var_35C]
.text:004014F6                 fst     [esp+470h+var_364]
.text:004014FD                 fld     ds:dbl_403140
.text:00401503                 fst     [esp+470h+var_344]
.text:0040150A                 fstp    [esp+470h+var_33C]
.text:00401511                 fstp    [esp+470h+var_334]
.text:00401518                 call    sub_401000
.text:0040151D                 mov     edx, eax
.text:0040151F                 lea     ecx, [esp+470h+var_2A4]
.text:00401526                 lea     eax, [esp+470h+var_3A4]
.text:0040152D                 call    sub_401000
.text:00401532                 mov     edx, eax
.text:00401534                 lea     ecx, [esp+470h+var_224]
.text:0040153B                 lea     eax, [esp+470h+var_194]
.text:00401542                 call    sub_401000
.text:00401547                 mov     edx, eax
.text:00401549                 lea     ecx, [esp+470h+var_324]
.text:00401550                 lea     eax, [esp+470h+var_94]
.text:00401557                 call    sub_401000
.text:0040155C                 mov     ecx, 20h
.text:00401561                 mov     esi, eax
.text:00401563                 lea     edi, [esp+470h+var_43C]
.text:00401567                 rep movsd
.text:00401569                 rdtsc
.text:0040156B                 mov     [esp+470h+var_3BC], eax
.text:00401572                 lea     eax, [esp+470h+var_3BC]
.text:00401579                 add     eax, 4
.text:0040157C                 mov     [eax], edx
.text:0040157E                 mov     esi, [esp+470h+var_1A0] ; Подготовка к циклу
.text:00401585                 fld     [esp+470h+var_3C4]
.text:0040158C                 lea     eax, [esi+30h]
.text:0040158F                 fld     [esp+470h+var_3CC]
.text:00401596                 mov     ecx, 186A0h
.text:0040159B                 fld     [esp+470h+var_3D4]
.text:004015A2                 fld     [esp+470h+var_3DC]
.text:004015A9                 fld     [esp+470h+var_3E4]
.text:004015B0
.text:004015B0 loc_4015B0:                             ; Начало итерации цикла
.text:004015B0                 fld     qword ptr [eax-30h] ; Первая строка матрицы
.text:004015B3                 fmul    [esp+470h+var_43C]
.text:004015B7                 fld     qword ptr [eax-28h]
.text:004015BA                 fmul    [esp+470h+var_41C]
.text:004015BE                 faddp   st(1), st
.text:004015C0                 fld     qword ptr [eax-20h]
.text:004015C3                 fmul    [esp+470h+var_3FC]
.text:004015C7                 faddp   st(1), st
.text:004015C9                 fld     qword ptr [eax-18h]
.text:004015CC                 fmul    st, st(3)
.text:004015CE                 faddp   st(1), st
.text:004015D0                 fstp    qword ptr [esp+14h]
.text:004015D4                 fld     qword ptr [eax-30h] ; Вторая строка матрицы
.text:004015D7                 fmul    [esp+470h+var_434]
.text:004015DB                 fld     qword ptr [eax-28h]
.text:004015DE                 fmul    [esp+470h+var_414]
.text:004015E2                 faddp   st(1), st
.text:004015E4                 fld     qword ptr [eax-20h]
.text:004015E7                 fmul    [esp+470h+var_3F4]
.text:004015EB                 faddp   st(1), st
.text:004015ED                 fld     qword ptr [eax-18h]
.text:004015F0                 fmul    st, st(4)
.text:004015F2                 faddp   st(1), st
.text:004015F4                 fstp    [esp+470h+var_454]
.text:004015F8                 fld     qword ptr [eax-30h] ; Третья строка матрицы
.text:004015FB                 fmul    [esp+470h+var_42C]
.text:004015FF                 fld     qword ptr [eax-28h]
.text:00401602                 fmul    [esp+470h+var_40C]
.text:00401606                 faddp   st(1), st
.text:00401608                 fld     qword ptr [eax-20h]
.text:0040160B                 fmul    [esp+470h+var_3EC]
.text:00401612                 faddp   st(1), st
.text:00401614                 fld     qword ptr [eax-18h]
.text:00401617                 fmul    st, st(5)
.text:00401619                 faddp   st(1), st
.text:0040161B                 fstp    [esp+470h+var_44C]
.text:0040161F                 fld     qword ptr [eax-30h] ; Четвертая строка
.text:00401622                 fmul    [esp+470h+var_424]
.text:00401626                 fld     qword ptr [eax-28h]
.text:00401629                 fmul    [esp+470h+var_404]
.text:0040162D                 faddp   st(1), st
.text:0040162F                 fld     qword ptr [eax-20h]
.text:00401632                 fmul    st, st(2)
.text:00401634                 faddp   st(1), st
.text:00401636                 fld     qword ptr [eax-18h]
.text:00401639                 fmul    st, st(6)
.text:0040163B                 faddp   st(1), st
.text:0040163D                 fld     qword ptr [esp+14h]
.text:00401641                 fstp    qword ptr [eax-30h]
.text:00401644                 fld     [esp+470h+var_454]   ; А дальше-то что?
.text:00401648                 fstp    qword ptr [eax-28h]
.text:0040164B                 fld     [esp+470h+var_44C]
.text:0040164F                 fstp    qword ptr [eax-20h]
.text:00401652                 fstp    qword ptr [eax-18h]
.text:00401655                 fld     qword ptr [eax-10h]
.text:00401658                 fmul    [esp+470h+var_43C]
.text:0040165C                 fld     qword ptr [eax-8]
.text:0040165F                 fmul    [esp+470h+var_41C]
.text:00401663                 faddp   st(1), st
.text:00401665                 fld     qword ptr [eax]
.text:00401667                 fmul    [esp+470h+var_3FC]
.text:0040166B                 faddp   st(1), st
.text:0040166D                 fld     qword ptr [eax+8]
.text:00401670                 fmul    st, st(3)
.text:00401672                 faddp   st(1), st
.text:00401674                 fstp    qword ptr [esp+14h]
.text:00401678                 fld     qword ptr [eax-10h]
.text:0040167B                 fmul    [esp+470h+var_434]
.text:0040167F                 fld     qword ptr [eax-8]
.text:00401682                 fmul    [esp+470h+var_414]
.text:00401686                 faddp   st(1), st
.text:00401688                 fld     qword ptr [eax]
.text:0040168A                 fmul    [esp+470h+var_3F4]
.text:0040168E                 faddp   st(1), st
.text:00401690                 fld     qword ptr [eax+8]
.text:00401693                 fmul    st, st(4)
.text:00401695                 faddp   st(1), st
.text:00401697                 fstp    [esp+470h+var_454]
.text:0040169B                 fld     qword ptr [eax-8]
.text:0040169E                 fmul    [esp+470h+var_40C]
.text:004016A2                 fld     qword ptr [eax-10h]
.text:004016A5                 fmul    [esp+470h+var_42C]
.text:004016A9                 faddp   st(1), st
.text:004016AB                 fld     qword ptr [eax]
.text:004016AD                 fmul    [esp+470h+var_3EC]
.text:004016B4                 faddp   st(1), st
.text:004016B6                 fld     qword ptr [eax+8]
.text:004016B9                 fmul    st, st(5)
.text:004016BB                 faddp   st(1), st
.text:004016BD                 fstp    [esp+470h+var_44C]
.text:004016C1                 fld     qword ptr [eax-8]
.text:004016C4                 fmul    [esp+470h+var_404]
.text:004016C8                 fld     qword ptr [eax-10h]
.text:004016CB                 fmul    [esp+470h+var_424]
.text:004016CF                 faddp   st(1), st
.text:004016D1                 fld     qword ptr [eax]
.text:004016D3                 fmul    st, st(2)
.text:004016D5                 faddp   st(1), st
.text:004016D7                 fld     qword ptr [eax+8]
.text:004016DA                 fmul    st, st(6)
.text:004016DC                 faddp   st(1), st
.text:004016DE                 fld     qword ptr [esp+14h]
.text:004016E2                 fstp    qword ptr [eax-10h]
.text:004016E5                 fld     [esp+470h+var_454]
.text:004016E9                 fstp    qword ptr [eax-8]
.text:004016EC                 fld     [esp+470h+var_44C]
.text:004016F0                 fstp    qword ptr [eax]
.text:004016F2                 fstp    qword ptr [eax+8]
.text:004016F5                 fld     qword ptr [eax+10h]
.text:004016F8                 fmul    [esp+470h+var_43C]
.text:004016FC                 fld     qword ptr [eax+18h]
.text:004016FF                 fmul    [esp+470h+var_41C]
.text:00401703                 faddp   st(1), st
.text:00401705                 fld     qword ptr [eax+20h]
.text:00401708                 fmul    [esp+470h+var_3FC]
.text:0040170C                 faddp   st(1), st
.text:0040170E                 fld     qword ptr [eax+28h]
.text:00401711                 fmul    st, st(3)
.text:00401713                 faddp   st(1), st
.text:00401715                 fstp    qword ptr [esp+14h]
.text:00401719                 fld     qword ptr [eax+10h]
.text:0040171C                 fmul    [esp+470h+var_434]
.text:00401720                 fld     qword ptr [eax+18h]
.text:00401723                 fmul    [esp+470h+var_414]
.text:00401727                 faddp   st(1), st
.text:00401729                 fld     qword ptr [eax+20h]
.text:0040172C                 fmul    [esp+470h+var_3F4]
.text:00401730                 faddp   st(1), st
.text:00401732                 fld     qword ptr [eax+28h]
.text:00401735                 fmul    st, st(4)
.text:00401737                 faddp   st(1), st
.text:00401739                 fstp    [esp+470h+var_454]
.text:0040173D                 fld     qword ptr [eax+10h]
.text:00401740                 fmul    [esp+470h+var_42C]
.text:00401744                 fld     qword ptr [eax+18h]
.text:00401747                 fmul    [esp+470h+var_40C]
.text:0040174B                 faddp   st(1), st
.text:0040174D                 fld     qword ptr [eax+20h]
.text:00401750                 fmul    [esp+470h+var_3EC]
.text:00401757                 faddp   st(1), st
.text:00401759                 fld     qword ptr [eax+28h]
.text:0040175C                 fmul    st, st(5)
.text:0040175E                 faddp   st(1), st
.text:00401760                 fstp    [esp+470h+var_44C]
.text:00401764                 fld     qword ptr [eax+10h]
.text:00401767                 fmul    [esp+470h+var_424]
.text:0040176B                 fld     qword ptr [eax+18h]
.text:0040176E                 fmul    [esp+470h+var_404]
.text:00401772                 faddp   st(1), st
.text:00401774                 fld     qword ptr [eax+20h]
.text:00401777                 fmul    st, st(2)
.text:00401779                 faddp   st(1), st
.text:0040177B                 fld     qword ptr [eax+28h]
.text:0040177E                 fmul    st, st(6)
.text:00401780                 faddp   st(1), st
.text:00401782                 fld     qword ptr [esp+14h]
.text:00401786                 fstp    qword ptr [eax+10h]
.text:00401789                 fld     [esp+470h+var_454]
.text:0040178D                 fstp    qword ptr [eax+18h]
.text:00401790                 fld     [esp+470h+var_44C]
.text:00401794                 fstp    qword ptr [eax+20h]
.text:00401797                 fstp    qword ptr [eax+28h]
.text:0040179A                 fld     qword ptr [eax+30h]
.text:0040179D                 fmul    [esp+470h+var_43C]
.text:004017A1                 fld     qword ptr [eax+38h]
.text:004017A4                 fmul    [esp+470h+var_41C]
.text:004017A8                 faddp   st(1), st
.text:004017AA                 fld     qword ptr [eax+40h]
.text:004017AD                 fmul    [esp+470h+var_3FC]
.text:004017B1                 faddp   st(1), st
.text:004017B3                 fld     qword ptr [eax+48h]
.text:004017B6                 fmul    st, st(3)
.text:004017B8                 faddp   st(1), st
.text:004017BA                 fstp    qword ptr [esp+14h]
.text:004017BE                 fld     qword ptr [eax+30h]
.text:004017C1                 fmul    [esp+470h+var_434]
.text:004017C5                 fld     qword ptr [eax+38h]
.text:004017C8                 fmul    [esp+470h+var_414]
.text:004017CC                 faddp   st(1), st
.text:004017CE                 fld     qword ptr [eax+40h]
.text:004017D1                 fmul    [esp+470h+var_3F4]
.text:004017D5                 faddp   st(1), st
.text:004017D7                 fld     qword ptr [eax+48h]
.text:004017DA                 fmul    st, st(4)
.text:004017DC                 faddp   st(1), st
.text:004017DE                 fstp    [esp+470h+var_454]
.text:004017E2                 fld     qword ptr [eax+38h]
.text:004017E5                 fmul    [esp+470h+var_40C]
.text:004017E9                 fld     qword ptr [eax+30h]
.text:004017EC                 fmul    [esp+470h+var_42C]
.text:004017F0                 faddp   st(1), st
.text:004017F2                 fld     qword ptr [eax+40h]
.text:004017F5                 fmul    [esp+470h+var_3EC]
.text:004017FC                 faddp   st(1), st
.text:004017FE                 fld     qword ptr [eax+48h]
.text:00401801                 fmul    st, st(5)
.text:00401803                 faddp   st(1), st
.text:00401805                 fstp    [esp+470h+var_44C]
.text:00401809                 fld     qword ptr [eax+38h]
.text:0040180C                 fmul    [esp+470h+var_404]
.text:00401810                 fld     qword ptr [eax+30h]
.text:00401813                 fmul    [esp+470h+var_424]
.text:00401817                 faddp   st(1), st
.text:00401819                 fld     qword ptr [eax+40h]
.text:0040181C                 fmul    st, st(2)
.text:0040181E                 faddp   st(1), st
.text:00401820                 fld     qword ptr [eax+48h]
.text:00401823                 fmul    st, st(6)
.text:00401825                 faddp   st(1), st
.text:00401827                 fld     qword ptr [esp+14h]
.text:0040182B                 fstp    qword ptr [eax+30h]
.text:0040182E                 fld     [esp+470h+var_454]
.text:00401832                 fstp    qword ptr [eax+38h]
.text:00401835                 fld     [esp+470h+var_44C]
.text:00401839                 fstp    qword ptr [eax+40h]
.text:0040183C                 fstp    qword ptr [eax+48h]
.text:0040183F                 fld     qword ptr [eax+50h]
.text:00401842                 fmul    [esp+470h+var_43C]
.text:00401846                 fld     qword ptr [eax+58h]
.text:00401849                 fmul    [esp+470h+var_41C]
.text:0040184D                 faddp   st(1), st
.text:0040184F                 fld     qword ptr [eax+60h]
.text:00401852                 fmul    [esp+470h+var_3FC]
.text:00401856                 faddp   st(1), st
.text:00401858                 fld     qword ptr [eax+68h]
.text:0040185B                 fmul    st, st(3)
.text:0040185D                 faddp   st(1), st
.text:0040185F                 fstp    qword ptr [esp+14h]
.text:00401863                 fld     qword ptr [eax+50h]
.text:00401866                 fmul    [esp+470h+var_434]
.text:0040186A                 fld     qword ptr [eax+58h]
.text:0040186D                 fmul    [esp+470h+var_414]
.text:00401871                 faddp   st(1), st
.text:00401873                 fld     qword ptr [eax+60h]
.text:00401876                 fmul    [esp+470h+var_3F4]
.text:0040187A                 faddp   st(1), st
.text:0040187C                 fld     qword ptr [eax+68h]
.text:0040187F                 fmul    st, st(4)
.text:00401881                 faddp   st(1), st
.text:00401883                 fstp    [esp+470h+var_454]
.text:00401887                 fld     qword ptr [eax+50h]
.text:0040188A                 fmul    [esp+470h+var_42C]
.text:0040188E                 fld     qword ptr [eax+58h]
.text:00401891                 fmul    [esp+470h+var_40C]
.text:00401895                 faddp   st(1), st
.text:00401897                 fld     qword ptr [eax+60h]
.text:0040189A                 fmul    [esp+470h+var_3EC]
.text:004018A1                 faddp   st(1), st
.text:004018A3                 fld     qword ptr [eax+68h]
.text:004018A6                 fmul    st, st(5)
.text:004018A8                 faddp   st(1), st
.text:004018AA                 fstp    [esp+470h+var_44C]
.text:004018AE                 fld     qword ptr [eax+50h]
.text:004018B1                 fmul    [esp+470h+var_424]
.text:004018B5                 fld     qword ptr [eax+58h]
.text:004018B8                 fmul    [esp+470h+var_404]
.text:004018BC                 faddp   st(1), st
.text:004018BE                 fld     qword ptr [eax+60h]
.text:004018C1                 fmul    st, st(2)
.text:004018C3                 faddp   st(1), st
.text:004018C5                 fld     qword ptr [eax+68h]
.text:004018C8                 fmul    st, st(6)
.text:004018CA                 faddp   st(1), st
.text:004018CC                 fld     qword ptr [esp+14h]
.text:004018D0                 fstp    qword ptr [eax+50h]
.text:004018D3                 fld     [esp+470h+var_454]
.text:004018D7                 fstp    qword ptr [eax+58h]
.text:004018DA                 fld     [esp+470h+var_44C]
.text:004018DE                 fstp    qword ptr [eax+60h]
.text:004018E1                 fstp    qword ptr [eax+68h]
.text:004018E4                 fld     qword ptr [eax+70h]
.text:004018E7                 fmul    [esp+470h+var_43C]
.text:004018EB                 fld     qword ptr [eax+78h]
.text:004018EE                 fmul    [esp+470h+var_41C]
.text:004018F2                 faddp   st(1), st
.text:004018F4                 fld     qword ptr [eax+80h]
.text:004018FA                 fmul    [esp+470h+var_3FC]
.text:004018FE                 faddp   st(1), st
.text:00401900                 fld     qword ptr [eax+88h]
.text:00401906                 fmul    st, st(3)
.text:00401908                 faddp   st(1), st
.text:0040190A                 fstp    qword ptr [esp+14h]
.text:0040190E                 fld     qword ptr [eax+70h]
.text:00401911                 fmul    [esp+470h+var_434]
.text:00401915                 fld     qword ptr [eax+78h]
.text:00401918                 fmul    [esp+470h+var_414]
.text:0040191C                 faddp   st(1), st
.text:0040191E                 fld     qword ptr [eax+80h]
.text:00401924                 fmul    [esp+470h+var_3F4]
.text:00401928                 faddp   st(1), st
.text:0040192A                 fld     qword ptr [eax+88h]
.text:00401930                 fmul    st, st(4)
.text:00401932                 faddp   st(1), st
.text:00401934                 fstp    [esp+470h+var_454]
.text:00401938                 fld     qword ptr [eax+78h]
.text:0040193B                 fmul    [esp+470h+var_40C]
.text:0040193F                 fld     qword ptr [eax+70h]
.text:00401942                 fmul    [esp+470h+var_42C]
.text:00401946                 faddp   st(1), st
.text:00401948                 fld     qword ptr [eax+80h]
.text:0040194E                 fmul    [esp+470h+var_3EC]
.text:00401955                 faddp   st(1), st
.text:00401957                 fld     qword ptr [eax+88h]
.text:0040195D                 fmul    st, st(5)
.text:0040195F                 faddp   st(1), st
.text:00401961                 fstp    [esp+470h+var_44C]
.text:00401965                 fld     qword ptr [eax+78h]
.text:00401968                 fmul    [esp+470h+var_404]
.text:0040196C                 fld     qword ptr [eax+70h]
.text:0040196F                 fmul    [esp+470h+var_424]
.text:00401973                 faddp   st(1), st
.text:00401975                 fld     qword ptr [eax+80h]
.text:0040197B                 fmul    st, st(2)
.text:0040197D                 faddp   st(1), st
.text:0040197F                 fld     qword ptr [eax+88h]
.text:00401985                 fmul    st, st(6)
.text:00401987                 faddp   st(1), st
.text:00401989                 fld     qword ptr [esp+14h]
.text:0040198D                 fstp    qword ptr [eax+70h]
.text:00401990                 fld     [esp+470h+var_454]
.text:00401994                 fstp    qword ptr [eax+78h]
.text:00401997                 fld     [esp+470h+var_44C]
.text:0040199B                 fstp    qword ptr [eax+80h]
.text:004019A1                 fstp    qword ptr [eax+88h]
.text:004019A7                 fld     qword ptr [eax+90h]
.text:004019AD                 fmul    [esp+470h+var_43C]
.text:004019B1                 fld     qword ptr [eax+98h]
.text:004019B7                 fmul    [esp+470h+var_41C]
.text:004019BB                 faddp   st(1), st
.text:004019BD                 fld     qword ptr [eax+0A0h]
.text:004019C3                 fmul    [esp+470h+var_3FC]
.text:004019C7                 faddp   st(1), st
.text:004019C9                 fld     qword ptr [eax+0A8h]
.text:004019CF                 fmul    st, st(3)
.text:004019D1                 faddp   st(1), st
.text:004019D3                 fstp    qword ptr [esp+14h]
.text:004019D7                 fld     qword ptr [eax+90h]
.text:004019DD                 fmul    [esp+470h+var_434]
.text:004019E1                 fld     qword ptr [eax+98h]
.text:004019E7                 fmul    [esp+470h+var_414]
.text:004019EB                 faddp   st(1), st
.text:004019ED                 fld     qword ptr [eax+0A0h]
.text:004019F3                 fmul    [esp+470h+var_3F4]
.text:004019F7                 faddp   st(1), st
.text:004019F9                 fld     qword ptr [eax+0A8h]
.text:004019FF                 fmul    st, st(4)
.text:00401A01                 faddp   st(1), st
.text:00401A03                 fstp    [esp+470h+var_454]
.text:00401A07                 fld     qword ptr [eax+90h]
.text:00401A0D                 fmul    [esp+470h+var_42C]
.text:00401A11                 fld     qword ptr [eax+98h]
.text:00401A17                 fmul    [esp+470h+var_40C]
.text:00401A1B                 faddp   st(1), st
.text:00401A1D                 fld     qword ptr [eax+0A0h]
.text:00401A23                 fmul    [esp+470h+var_3EC]
.text:00401A2A                 faddp   st(1), st
.text:00401A2C                 fld     qword ptr [eax+0A8h]
.text:00401A32                 fmul    st, st(5)
.text:00401A34                 faddp   st(1), st
.text:00401A36                 fstp    [esp+470h+var_44C]
.text:00401A3A                 fld     qword ptr [eax+90h]
.text:00401A40                 fmul    [esp+470h+var_424]
.text:00401A44                 fld     qword ptr [eax+98h]
.text:00401A4A                 fmul    [esp+470h+var_404]
.text:00401A4E                 faddp   st(1), st
.text:00401A50                 fld     qword ptr [eax+0A0h]
.text:00401A56                 fmul    st, st(2)
.text:00401A58                 faddp   st(1), st
.text:00401A5A                 fld     qword ptr [eax+0A8h]
.text:00401A60                 fmul    st, st(6)
.text:00401A62                 faddp   st(1), st
.text:00401A64                 fld     qword ptr [esp+14h]
.text:00401A68                 fstp    qword ptr [eax+90h]
.text:00401A6E                 fld     [esp+470h+var_454]
.text:00401A72                 fstp    qword ptr [eax+98h]
.text:00401A78                 fld     [esp+470h+var_44C]
.text:00401A7C                 fstp    qword ptr [eax+0A0h]
.text:00401A82                 fstp    qword ptr [eax+0A8h]
.text:00401A88                 fld     qword ptr [eax+0B0h]
.text:00401A8E                 fmul    [esp+470h+var_43C]
.text:00401A92                 fld     qword ptr [eax+0B8h]
.text:00401A98                 fmul    [esp+470h+var_41C]
.text:00401A9C                 faddp   st(1), st
.text:00401A9E                 fld     qword ptr [eax+0C0h]
.text:00401AA4                 fmul    [esp+470h+var_3FC]
.text:00401AA8                 faddp   st(1), st
.text:00401AAA                 fld     qword ptr [eax+0C8h]
.text:00401AB0                 fmul    st, st(3)
.text:00401AB2                 faddp   st(1), st
.text:00401AB4                 fstp    qword ptr [esp+14h]
.text:00401AB8                 fld     qword ptr [eax+0B0h]
.text:00401ABE                 fmul    [esp+470h+var_434]
.text:00401AC2                 fld     qword ptr [eax+0B8h]
.text:00401AC8                 fmul    [esp+470h+var_414]
.text:00401ACC                 faddp   st(1), st
.text:00401ACE                 fld     qword ptr [eax+0C0h]
.text:00401AD4                 fmul    [esp+470h+var_3F4]
.text:00401AD8                 faddp   st(1), st
.text:00401ADA                 fld     qword ptr [eax+0C8h]
.text:00401AE0                 fmul    st, st(4)
.text:00401AE2                 faddp   st(1), st
.text:00401AE4                 fstp    [esp+470h+var_454]
.text:00401AE8                 fld     qword ptr [eax+0B8h]
.text:00401AEE                 fmul    [esp+470h+var_40C]
.text:00401AF2                 fld     qword ptr [eax+0B0h]
.text:00401AF8                 fmul    [esp+470h+var_42C]
.text:00401AFC                 faddp   st(1), st
.text:00401AFE                 fld     qword ptr [eax+0C0h]
.text:00401B04                 fmul    [esp+470h+var_3EC]
.text:00401B0B                 faddp   st(1), st
.text:00401B0D                 fld     qword ptr [eax+0C8h]
.text:00401B13                 fmul    st, st(5)
.text:00401B15                 faddp   st(1), st
.text:00401B17                 fstp    [esp+470h+var_44C]
.text:00401B1B                 fld     qword ptr [eax+0B8h]
.text:00401B21                 fmul    [esp+470h+var_404]
.text:00401B25                 fld     qword ptr [eax+0B0h]
.text:00401B2B                 fmul    [esp+470h+var_424]
.text:00401B2F                 faddp   st(1), st
.text:00401B31                 fld     qword ptr [eax+0C0h]
.text:00401B37                 fmul    st, st(2)
.text:00401B39                 faddp   st(1), st
.text:00401B3B                 fld     qword ptr [eax+0C8h]
.text:00401B41                 fmul    st, st(6)
.text:00401B43                 faddp   st(1), st
.text:00401B45                 fld     qword ptr [esp+14h]
.text:00401B49                 fstp    qword ptr [eax+0B0h]
.text:00401B4F                 fld     [esp+470h+var_454]
.text:00401B53                 fstp    qword ptr [eax+0B8h]
.text:00401B59                 fld     [esp+470h+var_44C]
.text:00401B5D                 fstp    qword ptr [eax+0C0h]
.text:00401B63                 fstp    qword ptr [eax+0C8h]
.text:00401B69                 fld     qword ptr [eax+0D0h]
.text:00401B6F                 fmul    [esp+470h+var_43C]
.text:00401B73                 fld     qword ptr [eax+0D8h]
.text:00401B79                 fmul    [esp+470h+var_41C]
.text:00401B7D                 faddp   st(1), st
.text:00401B7F                 fld     qword ptr [eax+0E0h]
.text:00401B85                 fmul    [esp+470h+var_3FC]
.text:00401B89                 faddp   st(1), st
.text:00401B8B                 fld     qword ptr [eax+0E8h]
.text:00401B91                 fmul    st, st(3)
.text:00401B93                 faddp   st(1), st
.text:00401B95                 fstp    qword ptr [esp+14h]
.text:00401B99                 fld     qword ptr [eax+0D0h]
.text:00401B9F                 fmul    [esp+470h+var_434]
.text:00401BA3                 fld     qword ptr [eax+0D8h]
.text:00401BA9                 fmul    [esp+470h+var_414]
.text:00401BAD                 faddp   st(1), st
.text:00401BAF                 fld     qword ptr [eax+0E0h]
.text:00401BB5                 fmul    [esp+470h+var_3F4]
.text:00401BB9                 faddp   st(1), st
.text:00401BBB                 fld     qword ptr [eax+0E8h]
.text:00401BC1                 fmul    st, st(4)
.text:00401BC3                 faddp   st(1), st
.text:00401BC5                 fstp    [esp+470h+var_454]
.text:00401BC9                 fld     qword ptr [eax+0D0h]
.text:00401BCF                 fmul    [esp+470h+var_42C]
.text:00401BD3                 fld     qword ptr [eax+0D8h]
.text:00401BD9                 fmul    [esp+470h+var_40C]
.text:00401BDD                 faddp   st(1), st
.text:00401BDF                 fld     qword ptr [eax+0E0h]
.text:00401BE5                 fmul    [esp+470h+var_3EC]
.text:00401BEC                 faddp   st(1), st
.text:00401BEE                 fld     qword ptr [eax+0E8h]
.text:00401BF4                 fmul    st, st(5)
.text:00401BF6                 faddp   st(1), st
.text:00401BF8                 fstp    [esp+470h+var_44C]
.text:00401BFC                 fld     qword ptr [eax+0D0h]
.text:00401C02                 fmul    [esp+470h+var_424]
.text:00401C06                 fld     qword ptr [eax+0D8h]
.text:00401C0C                 fmul    [esp+470h+var_404]
.text:00401C10                 faddp   st(1), st
.text:00401C12                 fld     qword ptr [eax+0E0h]
.text:00401C18                 fmul    st, st(2)
.text:00401C1A                 faddp   st(1), st
.text:00401C1C                 fld     qword ptr [eax+0E8h]
.text:00401C22                 fmul    st, st(6)
.text:00401C24                 faddp   st(1), st
.text:00401C26                 fld     qword ptr [esp+14h]
.text:00401C2A                 fstp    qword ptr [eax+0D0h]
.text:00401C30                 fld     [esp+470h+var_454]
.text:00401C34                 fstp    qword ptr [eax+0D8h]
.text:00401C3A                 fld     [esp+470h+var_44C]
.text:00401C3E                 fstp    qword ptr [eax+0E0h]
.text:00401C44                 fstp    qword ptr [eax+0E8h]
.text:00401C4A                 fld     qword ptr [eax+0F0h]
.text:00401C50                 add     eax, 140h
.text:00401C55                 sub     ecx, 1
.text:00401C58                 fmul    [esp+470h+var_43C]
.text:00401C5C                 fld     qword ptr [eax-48h]
.text:00401C5F                 fmul    [esp+470h+var_41C]
.text:00401C63                 faddp   st(1), st
.text:00401C65                 fld     qword ptr [eax-40h]
.text:00401C68                 fmul    [esp+470h+var_3FC]
.text:00401C6C                 faddp   st(1), st
.text:00401C6E                 fld     qword ptr [eax-38h]
.text:00401C71                 fmul    st, st(3)
.text:00401C73                 faddp   st(1), st
.text:00401C75                 fstp    qword ptr [esp+14h]
.text:00401C79                 fld     qword ptr [eax-50h]
.text:00401C7C                 fmul    [esp+470h+var_434]
.text:00401C80                 fld     qword ptr [eax-48h]
.text:00401C83                 fmul    [esp+470h+var_414]
.text:00401C87                 faddp   st(1), st
.text:00401C89                 fld     qword ptr [eax-40h]
.text:00401C8C                 fmul    [esp+470h+var_3F4]
.text:00401C90                 faddp   st(1), st
.text:00401C92                 fld     qword ptr [eax-38h]
.text:00401C95                 fmul    st, st(4)
.text:00401C97                 faddp   st(1), st
.text:00401C99                 fstp    [esp+470h+var_454]
.text:00401C9D                 fld     qword ptr [eax-48h]
.text:00401CA0                 fmul    [esp+470h+var_40C]
.text:00401CA4                 fld     qword ptr [eax-50h]
.text:00401CA7                 fmul    [esp+470h+var_42C]
.text:00401CAB                 faddp   st(1), st
.text:00401CAD                 fld     qword ptr [eax-40h]
.text:00401CB0                 fmul    [esp+470h+var_3EC]
.text:00401CB7                 faddp   st(1), st
.text:00401CB9                 fld     qword ptr [eax-38h]
.text:00401CBC                 fmul    st, st(5)
.text:00401CBE                 faddp   st(1), st
.text:00401CC0                 fstp    [esp+470h+var_44C]
.text:00401CC4                 fld     qword ptr [eax-48h]
.text:00401CC7                 fmul    [esp+470h+var_404]
.text:00401CCB                 fld     qword ptr [eax-50h]
.text:00401CCE                 fmul    [esp+470h+var_424]
.text:00401CD2                 faddp   st(1), st
.text:00401CD4                 fld     qword ptr [eax-40h]
.text:00401CD7                 fmul    st, st(2)
.text:00401CD9                 faddp   st(1), st
.text:00401CDB                 fld     qword ptr [eax-38h]
.text:00401CDE                 fmul    st, st(6)
.text:00401CE0                 faddp   st(1), st
.text:00401CE2                 fld     qword ptr [esp+14h]
.text:00401CE6                 fstp    qword ptr [eax-50h]
.text:00401CE9                 fld     [esp+470h+var_454]
.text:00401CED                 fstp    qword ptr [eax-48h]
.text:00401CF0                 fld     [esp+470h+var_44C]
.text:00401CF4                 fstp    qword ptr [eax-40h]
.text:00401CF7                 fstp    qword ptr [eax-38h]
.text:00401CFA                 jnz     loc_4015B0                  ; Проверка на конец цикла
.text:00401D00                 fstp    st(4)
.text:00401D02                 fstp    st(2)
.text:00401D04                 fstp    st
.text:00401D06                 fstp    st
.text:00401D08                 fstp    st
.text:00401D0A                 rdtsc
.text:00401D0C                 mov     [esp+470h+var_3B4], eax
.text:00401D13                 lea     eax, [esp+470h+var_3B4]
.text:00401D1A                 add     eax, 4
.text:00401D1D                 mov     [eax], edx
.text:00401D1F                 mov     ecx, ds:?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z ; std::endl(std::basic_ostream<char,std::char_traits<char>> &)
.text:00401D25                 mov     edx, [esp+470h+var_3B4]
.text:00401D2C                 sub     edx, [esp+470h+var_3BC]
.text:00401D33                 mov     eax, [esp+470h+var_3B0]
.text:00401D3A                 sbb     eax, [esp+470h+var_3B8]
.text:00401D41                 push    ecx
.text:00401D42                 push    0
.text:00401D44                 push    0F4240h
.text:00401D49                 push    eax
.text:00401D4A                 push    edx
.text:00401D4B                 call    __aulldiv
.text:00401D50                 push    edx
.text:00401D51                 push    eax
.text:00401D52                 push    ecx
.text:00401D53                 mov     ecx, ds:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text:00401D59                 push    offset aTactsPerVector ; "Tacts per vector: "
.text:00401D5E                 push    ecx
.text:00401D5F                 call    sub_401E70
.text:00401D64                 add     esp, 0Ch
.text:00401D67                 mov     ecx, eax
.text:00401D69                 call    ds:??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_K@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(unsigned __int64)
.text:00401D6F                 mov     ecx, eax
.text:00401D71                 call    ds:??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
.text:00401D77                 call    ebx ; getchar
.text:00401D79                 test    esi, esi
.text:00401D7B                 jz      short loc_401D86
.text:00401D7D                 push    esi
.text:00401D7E                 call    ??3@YAXPAX@Z    ; operator delete(void *)
.text:00401D83                 add     esp, 4
.text:00401D86
.text:00401D86 loc_401D86:                             ; CODE XREF: _wmain+B6Bj
.text:00401D86                 xor     eax, eax
.text:00401D88                 mov     ecx, [esp+47Ch+var_1C]
.text:00401D8F                 mov     large fs:0, ecx
.text:00401D96                 pop     ecx
.text:00401D97                 pop     edi
.text:00401D98                 pop     esi
.text:00401D99                 pop     ebx
.text:00401D9A                 mov     esp, ebp
.text:00401D9C                 pop     ebp
.text:00401D9D                 retn
.text:00401D9D _wmain          endp


... c доп. мусором. Прокомментил, что мог. В цикле ТОЛЬКО умножение вектора на матрицу! Компилер сгенерировал кода в несколько раз больше, чем должен был. Работает это тоже медленнее в 10 раз...

PS про SSE2 знаю, но сейчас вот только под x87.
Re[3]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 15:49
Оценка:
Могу добавить, что на 100% не уверен, что в цикле именно дополнительные умножения на матрицу, т.к. мне лень читать до конца . Однако, учитывая, что на 1 умножение вектора на матрицу кода надо много меньше, я и предположил то, что предположил.
Re[3]: Глюк оптимизатора?
От: rm822 Россия  
Дата: 17.01.07 16:17
Оценка:
Здравствуйте, Minstrell, Вы писали:

Чего я не понял так это зачем иду было привлекать? Не проще ли щелкнуть 2 галки в студии и получить номера строк, а не гадать что да где?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 18:42
Оценка:
Здравствуйте, rm822, Вы писали:

R>Здравствуйте, Minstrell, Вы писали:


R>Чего я не понял так это зачем иду было привлекать? Не проще ли щелкнуть 2 галки в студии и получить номера строк, а не гадать что да где?


1. иду привлечь совсем не сложно.
2. в режиме отладки окончательный код не просмотреть, т.к. полная оптимизация с отладкой не дружат. Пробовал я — "конфликт опций компилятора".
Re[3]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 18:48
Оценка:
Здравствуйте, Minstrell, Вы писали:

M>Здравствуйте, rm822, Вы писали:


R>>Здравствуйте, Minstrell, Вы писали:


M>>>
R>>      const Matrix M = f1 * f2;       //Попробуй так
R>>      const Matrix& M = f1 * f2;      //или так
M>>>


M>Спасибо, попробую.


Неа. Почти то-же самое. const что-то меняет, скорость на 15% увеличивается, но все равно много меньше той, которая должна быть.
Re[5]: Глюк оптимизатора?
От: rm822 Россия  
Дата: 17.01.07 18:52
Оценка:
Здравствуйте, Minstrell, Вы писали:
M>2. в режиме отладки окончательный код не просмотреть, т.к. полная оптимизация с отладкой не дружат. Пробовал я — "конфликт опций компилятора".
Неправда. Все работает даже если поставить whole programm optimization. Если бы это не работало то MS не мог бы поставит символы для Win, не правда ли?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 19:49
Оценка:
Здравствуйте, rm822, Вы писали:

R>Здравствуйте, Minstrell, Вы писали:

M>>2. в режиме отладки окончательный код не просмотреть, т.к. полная оптимизация с отладкой не дружат. Пробовал я — "конфликт опций компилятора".
R>Неправда. Все работает даже если поставить whole programm optimization. Если бы это не работало то MS не мог бы поставит символы для Win, не правда ли?

странно... MSDN: "/Z7, /Zi, /ZI (Debug Information Format) cannot be used with /GL". /GL — link-time code generation. Если запустить отладку, то, естественно, код не доступен и т.д. Что не так?
Re[7]: Глюк оптимизатора?
От: rm822 Россия  
Дата: 17.01.07 19:56
Оценка:
Здравствуйте, Minstrell, Вы писали:

M>Здравствуйте, rm822, Вы писали:


R>>Здравствуйте, Minstrell, Вы писали:

M>>>2. в режиме отладки окончательный код не просмотреть, т.к. полная оптимизация с отладкой не дружат. Пробовал я — "конфликт опций компилятора".
R>>Неправда. Все работает даже если поставить whole programm optimization. Если бы это не работало то MS не мог бы поставит символы для Win, не правда ли?

M>странно... MSDN: "/Z7, /Zi, /ZI (Debug Information Format) cannot be used with /GL". /GL — link-time code generation. Если запустить отладку, то, естественно, код не доступен и т.д. Что не так?


В линкере поставь DebugInfo: Yes
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 17.01.07 20:53
Оценка:
Здравствуйте, rm822, Вы писали:

R>В линкере поставь DebugInfo: Yes


(Disassembly cannot be displayed in run mode.) ... Подозрение у меня, что после link-time optimization он вообще не лезет в код... Запостите, пожалуйста, командные строчки компилятора и линкера при таких настройках, чтобы link-time optimization была задействована и при этом можно было посмотреть код.

Только мы ушли не в ту сторону. Ну чем плоха IDA...

Пробовал я варьировать настройки оптимизации. Так вот при /GL- время выполнения одной итерации сокращается с 720 тактов до 95. Оператор умножения, правда, становится не inline. Однако в цикле НЕТ лишнего кода. Чем не баг: предварительно вычисленная переменная заново вычисляется в теле цикла, замедляя код в 7 раз.
Re[9]: Глюк оптимизатора?
От: rm822 Россия  
Дата: 19.01.07 09:32
Оценка:
Здравствуйте, Minstrell, Вы писали:

M>Здравствуйте, rm822, Вы писали:


R>>В линкере поставь DebugInfo: Yes


M>(Disassembly cannot be displayed in run mode.) ... Подозрение у меня, что после link-time optimization он вообще не лезет в код... Запостите, пожалуйста, командные строчки компилятора и линкера при таких настройках, чтобы link-time optimization была задействована и при этом можно было посмотреть код.

compiler
/Ox /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /GS- /Yu"stdafx.h" /Fp"Release\TestOptimize.pch" /Fo"Release\\" /Fd"Release\vc80.pdb" /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
linker
/OUT:"D:\cpp\TestOptimize\Release\TestOptimize.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"Release\TestOptimize.exe.intermediate.manifest" /DEBUG /PDB:"d:\cpp\testoptimize\release\TestOptimize.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
это релиз с полной оптимизацией однако я вижу строчки, вероятно про несовместимость с /Z* говориться в том плане что значений переменнных не видно.

M>Только мы ушли не в ту сторону. Ну чем плоха IDA...

Всем хороша но в данном случае это obfuscating tool

M>Пробовал я варьировать настройки оптимизации. Так вот при /GL- время выполнения одной итерации сокращается с 720 тактов до 95. Оператор умножения, правда, становится не inline. Однако в цикле НЕТ лишнего кода. Чем не баг: предварительно вычисленная переменная заново вычисляется в теле цикла, замедляя код в 7 раз.

Единственное с чем компилятор обязан в данном случае считаться это volatile и получение адреса, но ИМХО либо вы неверно интерпретируете результаты дизассембла.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Глюк оптимизатора?
От: Minstrell Россия  
Дата: 20.01.07 20:30
Оценка:
Здравствуйте, rm822, Вы писали:

R>Единственное с чем компилятор обязан в данном случае считаться это volatile и получение адреса, но ИМХО либо вы неверно интерпретируете результаты дизассембла.


Во всяком случае выносить из цикла константу — его прямая обязанность, а он заносит. Более пристальный осмотр показал, что в цикле производится 160 умножений (fmul) вместо 16 требуемых (вектор * матрицу 4x4). Причем сбой происходит именно из-за попытки оптимизатора функцию умножения вектора на число сделать inline. Если запретить inline, то скорость с 720 тактов на операцию возрастает до 95. Мораль всего этого такова — доверяй, но проверяй. Так на ровном месте можно терять порядки производительности...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.