Здравствуйте Кирпа В А, Вы писали:
КВА>Есть класс для реализации векторной алгебры
КВА>Привожу фрагмент реализации одного цикла (Release Version; Optimize — Maximize Speed)
КВА>; 498 : register int index = 0;
КВА> 00043 33 c0 xor eax, eax
КВА>$L85381:
КВА>; 499 : do
КВА>; 500 : {
КВА>; 501 : tmp.pMO[index++] *= Number;
КВА>; 502 : }
КВА>; 503 : while (index < Vector2.Dimension);
КВА> 00045 8b 4c 24 14 mov ecx, DWORD PTR _tmp$[esp+44]
КВА> 00049 40 inc eax
КВА> 0004a d9 45 0c fld DWORD PTR _Number$[ebp]
КВА> 0004d dc 4c c1 f8 fmul QWORD PTR [ecx+eax*8-8]
КВА> 00051 dd 5c c1 f8 fstp QWORD PTR [ecx+eax*8-8]
КВА> 00055 3b 46 04 cmp eax, DWORD PTR [esi+4]
КВА> 00058 7c eb jl SHORT $L85381
КВА>Почему сначала идет inc eax а затем fmul и fstp идут с -8 Ведь если inc eax перенести после fstp, то
КВА>не надо будет -8 Во первых короче на 2 байта да и быстрее наверное Не сочтите меня мелочным но
КВА>
Попробуй вместо index, работать с инкрементируемыми указателями. Кажется мне, что такой вариант кода прооптимизируется лучше.
А если действительно надо быстро и на больших объемах данных, то смотри Intel Performance Library (
http://www.intel.com/software/products/perflib/ )
-Zork
Здравствуйте ZORK, Вы писали:
ZORK>Попробуй вместо index, работать с инкрементируемыми указателями. Кажется мне, что такой вариант кода прооптимизируется лучше.
; 450 : double *p = tmp.pMO;
0003b 8b 44 24 14 mov eax, DWORD PTR _tmp$[esp+44]
; 451 : register int index = 0;
00047 33 c9 xor ecx, ecx
$L85342:
; 452 : do
; 453 : {
; 455 : *(p++) *= Number;
00049 dd 45 10 fld QWORD PTR _Number$[ebp]
0004c dc 08 fmul QWORD PTR [eax]
0004e 83 c0 08 add eax, 8
; 456 : index++;
00051 41 inc ecx
00052 dd 58 f8 fstp QWORD PTR [eax-8]
; 457 : }
; 458 : while (index < Vector1.Dimension);
00055 3b 4e 04 cmp ecx, DWORD PTR [esi+4]
00058 7c ef jl SHORT $L85342
Все равно сначала add eax,8 а затем fstp c -8 Компилятор VC 6.0 херня :down: :down:
ZORK>А если действительно надо быстро и на больших объемах данных, то смотри Intel Performance Library ( http://www.intel.com/software/products/perflib/ )
А за это спасибо :up: :up:
Здравствуйте Аноним, Вы писали:
А>; 450 : double *p = tmp.pMO;
А> 0003b 8b 44 24 14 mov eax, DWORD PTR _tmp$[esp+44]
А>; 451 : register int index = 0;
А> 00047 33 c9 xor ecx, ecx
А>$L85342:
А>; 452 : do
А>; 453 : {
А>; 455 : *(p++) *= Number;
А> 00049 dd 45 10 fld QWORD PTR _Number$[ebp]
А> 0004c dc 08 fmul QWORD PTR [eax]
А> 0004e 83 c0 08 add eax, 8
А>; 456 : index++;
А> 00051 41 inc ecx
А> 00052 dd 58 f8 fstp QWORD PTR [eax-8]
А>; 457 : }
А>; 458 : while (index < Vector1.Dimension);
А> 00055 3b 4e 04 cmp ecx, DWORD PTR [esi+4]
А> 00058 7c ef jl SHORT $L85342
А>Все равно сначала add eax,8 а затем fstp c -8 Компилятор VC 6.0 херня
Молодой человек, прежде чем наезжать на компилятор, прочитайте пару руководств по оптимизации для Pentium, в частности про latency операции fmul. Тогда вы поймете, что результат fmul появляется не мгновенно, и что процессор на это время стоит занять полезными интсрукциями. Именно поэтому нужно поместить fstp подальше от fmul.
2Кирпа В А:
А слабо создать свой вариант и просто протестировать?
Здравствуйте VladD2, Вы писали:
VD>2Кирпа В А:
VD>А слабо создать свой вариант и просто протестировать?
Тут есть что улучшить. В частности, unroll the loop на три-шесть итераций (это стоит даже в С коде сделать).