Article View: pl.comp.lang.asm
Article #2222Re: Odwracanie kolejności bajtów w tablicy
From: Andrzej Grażyński
Date: Fri, 23 Apr 2010 10:59
Date: Fri, 23 Apr 2010 10:59
102 lines
5084 bytes
5084 bytes
Wojciech Muła pisze:
> Hej, kontynuacja wątku założonego przez Andrzeja.
> U mnie niestety starsze posty wyparowały, więc nie mam
> gdzie się podczepić.
>
> Przetestowałem właśnie kilka metod:
> * "bajty" - naiwny algorytm zamiany bajt po bajcie
> * BSWAP - zmiana 4 bajtów na iterację (1 x BSWAP)
> * 2xBSWAP - zmiana 8 bajtów na iterację (2 x BSWAP)
> * PSHUFB - zmiana 16 bajtów na iterację (1 x PSHUFB)
> * 2xPSHUFB - zmiana 32 bajtów na iterację (2 x PSHUFB)
>
> Rozmiary tablic są wielokrotnością 32 bajtów, więc wszystkie
> dostępy do pamięci były wyrównane. Procesor Core 2 Duo E8400.
> W tabelce są czasy wykonywania kilku-kilkuset tysięcy iteracji.
> Mój wniosek nie jest odkrywczy: najbardziej ograniczają nas
> czasy dostępu do pamięci.
>
> +-------------+-----------+----------------+----------------+----------------+----------------+
> | rozmiar | bajty | BSWAP | 2xBSWAP | PSHUFB | 2xPSHUFB |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 64 B | 759 ms | 292 ms | 2.6 x | 267 ms | 2.8 x | 240 ms | 3.1 x | 138 ms | 5.5 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 128 B | 740 ms | 264 ms | 2.8 x | 218 ms | 3.4 x | 108 ms | 6.8 x | 107 ms | 6.9 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 256 B | 808 ms | 303 ms | 2.6 x | 243 ms | 3.3 x | 81 ms | 9.9 x | 72 ms |11.2 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 512 B | 1026 ms | 394 ms | 2.6 x | 305 ms | 3.3 x | 91 ms |11.2 x | 84 ms |12.2 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 1 kB | 1000 ms | 404 ms | 2.4 x | 298 ms | 3.3 x | 81 ms |12.3 x | 69 ms |14.5 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 4 kB | 786 ms | 312 ms | 2.5 x | 235 ms | 3.3 x | 64 ms |12.0 x | 50 ms |15.7 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 8 kB | 793 ms | 310 ms | 2.5 x | 235 ms | 3.4 x | 61 ms |13.0 x | 51 ms |15.5 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
> | 16 kB | 1582 ms | 617 ms | 2.6 x | 467 ms | 3.4 x | 120 ms |13.2 x | 100 ms |15.8 x |
> +-------------+-----------+--------+-------+--------+-------+--------+-------+--------+-------+
>
> w.
>
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?
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 (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...).
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
@@Partial:
; być może ten kawałek można lepiej zrobić
AND EBX,7
JZ @@Done
TEST EBX,4
JNZ @@Done
;---------------------------
LEA EDI,[ESI+EBX-1]
MOV AL,[EDI]
MOVSB
MOV [ESI-1],AL
@@Done:
POP EDI
POP ESI
POP EBX
Technical Details
Message-ID:
<hqrujb$r3j$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>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: Fri, 23 Apr 2010 12:59:50 +0200 Organization: http://onet.pl Lines: 102 Message-ID: <hqrujb$r3j$1@news.onet.pl> References: <20100422191115.9902fe58.wojciech_mula@poczta.null.onet.pl.invalid> NNTP-Posting-Host: public-gprs80242.centertel.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1272020402 27763 91.94.186.232 (23 Apr 2010 11:00:02 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Fri, 23 Apr 2010 11:00:02 +0000 (UTC) User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) In-Reply-To: <20100422191115.9902fe58.wojciech_mula@poczta.null.onet.pl.invalid> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit