Article View: pl.comp.lang.asm
Article #2224Re: Odwracanie kolejności bajtów w tablicy
From: Andrzej Grażyński
Date: Sat, 24 Apr 2010 11:01
Date: Sat, 24 Apr 2010 11:01
100 lines
4025 bytes
4025 bytes
Wojciech Muła pisze:
> Andrzej Grażyński <grazynsk@petex.com.pl> wrote:
>
>> Jak pamiętasz, zadałem na początku pytanie: czy przy odwracaniu
>> kolejności bajtów BSWAP może się do czegoś przydać?
>>
>> Jaki wniosek?
>
> Wniosek jest taki, że się bardzo przydaje. Bez wielkiego wysiłku
> mamy przyspieszenie 2 razy, przy rozwinięciu pętli ponad 3 razy
> (w stosunku do wersji bajt po bajcie).
>
>> Co prawda w ogólnym przypadku długość pola nie jest wielokrotnością 4,
>> ale zaprezentowany przeze mnie algorytm po wykonaniu serii instrukcji
>> BSWAP wykonuje jeszcze CO NAJWYŻEJ DWIE ZAMIANY, czyli dodatkowy koszt
>> jest stały i niewielki. W ogólnym przypadku pola ładowane/zapisywane
>> do/z rejestrów EAX i EDX nie są wyrównane do DWORD, co też może wydłużać
>> czasy podane powyżej
>
> Będę jeszcze jutro albo pojutrze testował więcej i wtedy przygotuję jakiś
> nadający się do wglądu program. Na razie wstępnie zaobserwowałem, że
> niewyrównane dane dają spowolnienie 2-3 krotne (dla BSWAP mniejsze,
> dla rozkazów SSE większe).
>
>> (a propos: czy rozmiar tablicy będący wielokrotnością 32 gwarantuje,
>> że cała tablica będzie wyrównana na adresie podzielnym przez 32?
>> Chyba jednak nie...).
>
> Procedury zakodowałem jako wstawki asemblerowe w GCC, mam w programie duże
> statyczne tablice, które na pewno były wyrównane do granicy 16 bajtów (a może
> nawet do granicy strony), bo inaczej by wersje SSE nie zadziałały. :)
>
>> Skoro już wziąłeś się za pomiary, to spróbuje porównać moją procedurę z
>> naiwnym przestawianiem bajtów.
>>
>> PUSH EBX
>> PUSH ESI
>> PUSH EDI
>>
>> CLD
>>
>> LEA EDI,[ESI+ECX-4]
>>
>> MOV EBX,ECX
>>
>> ADD ECX,4
>> SHR ECX,3
>> JZ @@Partial
>>
>> @@Loop:
>> LODSD
>> MOV EDX,[EDI]
>> BSWAP EAX
>> BSWAP EDX
>> STOSD
>> MOV [ESI-4],EDX
>> SUB EDI,8
>> LOOP @@Loop
>
> Zmartwię Cię - na Core 2 to jest dramatycznie wolne, niekiedy wolniejsze
> od wersji bajt po bajcie, a jeśli szybsze to nieznacznie tylko. Wszystko
> psuje pewnie lods/stos. Mój kod jest natomiast taki:
>
> 1:
> mov eax, [esi]
> mov ebx, [edi]
> bswap eax
> bswap ebx
> mov eax, [edi]
> mov ebx, [esi]
> add esi, 4
> sub edi, 4
> cmp esi, edx ; edx = esi + 4*(ecx/2)
> jne 1
>
> I te czasy dla tablic 32-bajtowych wynoszą mniej więcej:
> * bajt po bajcie - 400 ms / 100%
> * Twoje BSWAP - 490 ms / 120%
> * moje BSWAP - 180 ms / 45%
>
> w.
Skoro LODS/STOS tak się nie lubią z tym procesorem, to zróbmy oczywistą
modyfikację, nieznacznie różniącą się od Twojej wersji:
@@Loop:
MOV EAX,[ESI]
MOV EDX,[EDI]
BSWAP EAX
BSWAP EDX
MOV [EDI],EAX
MOV [ESI],EDX
ADD ESI,4
SUB EDI,4
LOOP @@Loop
I sprawdź teraz.
a.
Technical Details
Message-ID:
<hquj26$akr$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mailReferences:
<20100422191115.9902fe58.wojciech_mula@poczta.null.onet.pl.invalid> <hqrujb$r3j$1@news.onet.pl> <20100423235642.f5548b69.wojciech_mula@poczta.null.onet.pl.invalid>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail From: Andrzej Grażyński <grazynsk@petex.com.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Odwracanie kolejności bajtów w tablicy Date: Sat, 24 Apr 2010 13:01:12 +0200 Organization: http://onet.pl Lines: 100 Message-ID: <hquj26$akr$1@news.onet.pl> References: <20100422191115.9902fe58.wojciech_mula@poczta.null.onet.pl.invalid> <hqrujb$r3j$1@news.onet.pl> <20100423235642.f5548b69.wojciech_mula@poczta.null.onet.pl.invalid> NNTP-Posting-Host: public-gprs9562.centertel.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1272106888 10907 87.96.37.90 (24 Apr 2010 11:01:28 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Sat, 24 Apr 2010 11:01:28 +0000 (UTC) User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) In-Reply-To: <20100423235642.f5548b69.wojciech_mula@poczta.null.onet.pl.invalid> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit