Какая же это нахрен оптимизация?
От: Кирпа В А  
Дата: 11.01.02 10:40
Оценка:
Есть класс для реализации векторной алгебры
Привожу фрагмент реализации одного цикла (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 байта да и быстрее наверное Не сочтите меня мелочным но

:down:
Re: Какая же это нахрен оптимизация?
От: ZORK Россия www.zorkaltsev.com
Дата: 11.01.02 11:10
Оценка:
Здравствуйте Кирпа В А, Вы писали:

КВА>Есть класс для реализации векторной алгебры

КВА>Привожу фрагмент реализации одного цикла (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
Думать надо ...головой :)
Re[2]: Какая же это нахрен оптимизация?
От: Аноним  
Дата: 11.01.02 12:01
Оценка:
Здравствуйте 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:
Re[3]: Какая же это нахрен оптимизация?
От: Alex Fedotov США  
Дата: 11.01.02 16:46
Оценка: 2 (1)
Здравствуйте Аноним, Вы писали:

А>; 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.
-- Alex Fedotov
Re[4]: Какая же это нахрен оптимизация?
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.01.02 18:08
Оценка:
2Кирпа В А:

А слабо создать свой вариант и просто протестировать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Какая же это нахрен оптимизация?
От: Alex Fedotov США  
Дата: 11.01.02 19:03
Оценка:
Здравствуйте VladD2, Вы писали:

VD>2Кирпа В А:


VD>А слабо создать свой вариант и просто протестировать?


Тут есть что улучшить. В частности, unroll the loop на три-шесть итераций (это стоит даже в С коде сделать).
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.