Article View: pl.comp.lang.asm
Article #251Re: optymalizacja
From: Bogdan (bogdro)
Date: Wed, 17 May 2006 15:33
Date: Wed, 17 May 2006 15:33
158 lines
5625 bytes
5625 bytes
tosamo napisał(a): > Witam > > Pisze sobie porgramik w masm32 (wersja 6.11 chyba). Do tej pory pisalem > glownie w c i pascalu wiec na poczatku > program w asm wygladal jak dokladna kalka z jezykow wyzszego rzedu i dzialal > jakies 3 razy wolniej niz > pascal i delphi. Potem zaczalem optymalizowac i wyszlo na to, ze kazda > optymalizacja zwalnia dzialanie programu > o kilka(dziesiat) %. Optymalizacja numer 1: używaj najlepszych algorytmów/instrukcji, funkcji in-line/makr, odwijaj pętle itp. Optymalizacja numer 2: w kompilatorze HLL włącz optymalizacje na szybkość. Optymalizacja numer 3: jeśli obie powyższe dają niewystarczające wyniki, sięgaj po assemblera. > Na przyklad: > > Czemu takie cos : > > mov edi,offset TABLICA > mov ecx,16 > sha1_processmessageblock4: > mov eax,dword ptr [edi-12] > xor eax,dword ptr [edi-32] > xor eax,dword ptr [edi-56] > xor eax,dword ptr [edi-64] > rol eax,1 > stosd > ; > inc ecx > cmp ecx,80 > jne sha1_processmessageblock4 > > Jest kilkukrotnie wolniejsze niz : > > mov edi,offset TABLICA > mov ecx,16 > sha1_processmessageblock4: > mov eax,ecx > shl eax,2 > sub eax,12 ; 3 * 4 > mov ebx,dword ptr [edi+eax] > sub eax,20 ; 5 * 4 > xor ebx,dword ptr [edi+eax] > sub eax,24 ; 6 * 4 > xor ebx,dword ptr [edi+eax] > sub eax,8 ; 2 * 4 > xor ebx,dword ptr [edi+eax] > rol ebx,1 > mov eax,ecx > shl eax,2 > mov dword ptr [edi+eax],ebx > ; > inc ecx > cmp ecx,80 > jne sha1_processmessageblock4 Trudno powiedzieć. Możliwe, że przez stosd. Ja bym strzelał, że wersja pierwsza powinna być szybsza. Może przebijasz cacheline. Może operacje na EBX lubią tą przerwę, która tu mają a nie jak poprzednio: co instrukcja o EAX, każda RMW. > Albo czemu takie cos : > > mov esi,offset Buffers_ ; D > mov edi,offset Buffers__ ; E > std > movsd > movsd > ror DWORD PTR [esi],2 > movsd > movsd > mov DWORD PTR [edi],eax > cld > > Jest duzo wolniejsze niz : > > mov ebx,DWORD PTR [Buffers+12] ; E = D > mov DWORD PTR [Buffers+16],ebx > ;; > mov ebx,DWORD PTR [Buffers+8] ; D = C > mov DWORD PTR [Buffers+12],ebx > ; > mov ebx,DWORD PTR [Buffers+4] ; C = SHA1CircularShift(30,B) > ror ebx,2 > mov DWORD PTR [Buffers+8],ebx > ; > mov ebx,DWORD PTR [Buffers] ; B = A > mov DWORD PTR [Buffers+4],ebx > ; > mov ebx,eax > mov DWORD PTR [Buffers],eax ; A = temp Też możliwe, że przez movsd. Ror na pamięci też nie wymiata, ale przynajmniej jest Direct Path. Tą drugą wersję można jeszcze przyspieszyć moim zdaniem, używając różnych rejestrów. > Albo na przyklad mam cos takiego : > > mov al,byte ptr [esi+ecx] > mov byte ptr [edi+ebx],al > inc ecx > inc ebx > inc [Message_Block_Index] << TO JEST WAZNE > ; > add [Length_Low],8 > jnz sha1_input8 ; > inc [Length_High] ; > jnz sha1_input8 > mov [Corrupted],1 > > Zmienna Message_Block_Index to zwykla zmienna DD w sekcji .data. Nie jest do > niczego juz potrzebna bo zamiast niej > zapisuje dane w rejestrach. Usuwam ta linie i program zwalnia o 5% ! > Oczywiscie dziala bez zmiena tylko wolniej. Wstaw ze 5-10 NOPów, może pomoże. Chodzi o to, że poprzednie instrukcje się muszą wykonać, nowe - zostać zdekodowane. Tak *mi* się wydaje. Poza tym, należy unikać używania rejestrów cząstkowych o ile się da. Należy rozdzielać instrukcje zależne. > Oprocz tego na przyklad wielokrotne > > mov eax,edx > shl eax,2 > mov eax,DWORD PTR [Word_+eax] ; > > Dziala oczywiscie duzo szybciej niz proste > > mov esi,offset Word_ > > i potem juz tylko kilkadziesiat razy > > lodsd Instrukcje łańcuchowe są powolne. > Czy ktos mi to wyjasni albo chociaz powie gdzie mozna jakies konkrety na ten > temat przeczytac ? Ja swoje informacje biorę z podręczników optymalizacyjnych AMD: http://www.amd.com/us-en/Processors/DevelopWithAMD/0,,30_2252_739_7044,00.html Niedawno jeden kolega na alt.pl.asm próbował łamać MD5. Może połączycie siły? To, że w SHA1 i MD5 odkryto jakieś dziurki nie oznacza od razu, że w jakimś rozsądnym czasie znajdziecie kolizje. -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Prawdziwy, bezpieczny komunikator: www.JabberPL.org
Technical Details
Message-ID:
<e4ffrk$he5$1@nemesis.news.tpi.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mailReferences:
<e4f5nl$rj4$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@bogdan.pl> Newsgroups: pl.comp.lang.asm Subject: Re: optymalizacja Date: Wed, 17 May 2006 17:33:09 +0200 Organization: tp.internet - http://www.tpi.pl/ Lines: 158 Message-ID: <e4ffrk$he5$1@nemesis.news.tpi.pl> References: <e4f5nl$rj4$1@inews.gazeta.pl> NNTP-Posting-Host: acrp131.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: nemesis.news.tpi.pl 1147880116 17861 83.11.17.131 (17 May 2006 15:35:16 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Wed, 17 May 2006 15:35:16 +0000 (UTC) User-Agent: Thunderbird 1.5.0.2 (X11/20060420) In-Reply-To: <e4f5nl$rj4$1@inews.gazeta.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit