🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
3 messages
3 total messages Started by Wojciech Muła Fri, 16 May 2008 20:41
SSE2: znaczenie wyrównania danych
#1809
Author: Wojciech Muła
Date: Fri, 16 May 2008 20:41
24 lines
1948 bytes
Kontynuacja ostatniego tematu, tj. SSE2 wolniejsze niż MMX;
testowany algorytm http://wmula.republika.pl/snippets/asm/blur.c
(rozmycie obrazków grayscale).

Tym razem testy przeprowadziłem na komputerze C2D E8200 -- na
nim większość całkowitoliczbowych rozkazów SSE wykonuje się w
jednym cyklu.  Po zgrubnej zamianie nazw rejestrów i użyciu
MOVDQU (dla bezpieczeństwa) doznałem szoku: kod wolniejszy niż
MMX!  Prawie zemdlałem. :)

Spróbowałem użyć zamiast MOVDQU rozkazu LDDQU -- nie pomogło.
W sumie dane mieściły się w L2, więc raczej nie mogło.

Ostatecznie postanowiłem wyrównać adresy dwóch struktur, do
których odwołują się procedury (obraz oraz pomocnicza tablica),
wszystkie odczyty i zapisy do pamięci wykonują się poprzez
MOVDQA, zaś dane niewyrównane które są potrzebne zostały
wyciągnięte rozkazem PALIGNR.  I wiecie co?  Przyspieszenie
o 95% w stosunku do kodu MMX2 (przyspieszenie 6 razy w stosunku
do kodu x86).

Jak się wyśpię, to doszlifuję i wrzucę na stronę kod.

w.
Re: SSE2: znaczenie wyrównania danych
#1810
Author: Bogdan (bogdro)
Date: Sat, 17 May 2008 08:57
36 lines
2686 bytes
Wojciech Muła pisze:
> Kontynuacja ostatniego tematu, tj. SSE2 wolniejsze niż MMX;
> testowany algorytm http://wmula.republika.pl/snippets/asm/blur.c
> (rozmycie obrazków grayscale).
> 
> Tym razem testy przeprowadziłem na komputerze C2D E8200 -- na
> nim większość całkowitoliczbowych rozkazów SSE wykonuje się w
> jednym cyklu.  Po zgrubnej zamianie nazw rejestrów i użyciu
> MOVDQU (dla bezpieczeństwa) doznałem szoku: kod wolniejszy niż
> MMX!  Prawie zemdlałem. :)

  :)

> Spróbowałem użyć zamiast MOVDQU rozkazu LDDQU -- nie pomogło.
> W sumie dane mieściły się w L2, więc raczej nie mogło.
> 
> Ostatecznie postanowiłem wyrównać adresy dwóch struktur, do
> których odwołują się procedury (obraz oraz pomocnicza tablica),
> wszystkie odczyty i zapisy do pamięci wykonują się poprzez
> MOVDQA, zaś dane niewyrównane które są potrzebne zostały
> wyciągnięte rozkazem PALIGNR.  I wiecie co?  Przyspieszenie
> o 95% w stosunku do kodu MMX2 (przyspieszenie 6 razy w stosunku
> do kodu x86).

  No to niezły wynik. Jednak co jedna operacja na pamięci, to nie dwie 
:) A nawet przy danych w L2 cache to robi różnicę. L2 jest sporo 
(kilkakrotnie?) wolniejsza od L1, które to z kolei jest pewnie sporo 
wolniejsze od rejestrów. Natrafiłeś na moment, w którym problemem 
wydajnościowym nie jest algorytm, lecz pamięć. Próbowałeś używać 
PREFETCH* do wcześniejszego pobrania danych bliżej procesora?

-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: SSE2: znaczenie wyrównania danych
#1811
Author: Wojciech Muła
Date: Sun, 18 May 2008 19:23
19 lines
1816 bytes
"Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> wrote:

>   No to niezły wynik. Jednak co jedna operacja na pamięci, to nie dwie 
> :) A nawet przy danych w L2 cache to robi różnicę. L2 jest sporo 
> (kilkakrotnie?) wolniejsza od L1, które to z kolei jest pewnie sporo 
> wolniejsze od rejestrów. 

Do L1 - kilka cykli, do L2 - kilkanaście cykli, do pamięci - więcej
niż 100.   Na Celeronie M to wynosi odpowiednio 3, 15, 150.

> Natrafiłeś na moment, w którym problemem wydajnościowym nie jest algorytm,
> lecz pamięć. Próbowałeś używać PREFETCH* do wcześniejszego pobrania danych
> bliżej procesora?

Z PREFETCH nie korzystałem, bo akurat ten procesor ma 6MB L2, a obrazek na
którym testowałem ledwie 640x480, więc z pewnością po kilku iteracjach był
już w L2.

w.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads