Zwikszanie efektywnoci programów optymalizacja pamici cz2
literatura podstawowa [Aho2002] Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman, Kompilatory. Reguły, metody i narzdzia, WNT 2002 (tłum. pierwszego wydania amerykaskiego, 1986). [Aho2001] A.V. Aho, R. Sethi, J.D. Ullman, Compilers: Principles, Techniques, and Tools, Pearson Education 2001. 2
literatura uzupełniajca [Bentley2008] Jon Bentley, Perełki oprogramowania, wyd. trzecie, WNT, 2008 (tłum. drugiego wydania amerykaskiego, Pearson Education 2000). [Bentley2007] Jon Bentley, Wicej perełek oprogramowania. Wyznania programisty, WNT 2007 (tłum. pierwszego wydania amerykaskiego, Pearson Education 1988). 3
literatura uzupełniajca [Kernigham2002] Brian W. Kernigham, Rob Pike, Lekcja programowania, WNT 2002, (tłum. pierwszego wydania amerykaskiego, Pearson Education 1999). [Oram2008] Andy Oram, Greg Wilson (red.), Pikny kod. Tajemnice mistrzów programowania, Helion 2008, (tłum. wydania amerykaskiego, O Reilly Media Inc. 2007). 4
literatura uzupełniajca [Barr2005] Adam Barr, Znajd błd. Sztuka analizowania kodu, Helion 2005 (tłum. wydania amerykaskiego, Pearson Education 2005). 5
literatura uzupełniajca [Cooper2004] Keith D. Cooper, Linda Torczon, Engineering a Compiler, Morgan Kaufmann Publishers, San Francisco, 2004. [Goedecker2001] Stefan Goedecker, Adolfy Hoisie, Performance Optimization of Numerically Intensive Codes, Society for Industrial and Applied Mathematics, Philadelphia 2001. 6
literatura uzupełniajca [Kaspersky2003], Kris Kaspersky, Code Optimization: Effective Memory Usage, A-LIST, LLC, 2003. [Muchnik1997] Steven S. Muchnick, Advanced Compiler Design and Implementation, Morgan Kaufmann Publishers, San Francisco, 1997. 7
literatura uzupełniajca [Allen2002] Randy Allen, Ken Kennedy, Optimizing Compilers for Modern Architectures, Morgan Kaufmann Publishers, San Francisco, 2002. [Falk2004] Heiko Falk, Peter Marwedel, Source Code Optimization Techniques for Data Flow Dominated Embedded Software, Kluwer Academic Publishers, Boston 2004. 8
literatura uzupełniajca [Wolfe1995] Michael Wolfe, High- Performance Compilers for Parallel Computing, Addison Wesley, 1995. 9
plan optymalizacja hierarchii pamici [Muchnick1997] rozdz. 20 [Allen2002] rozdz. 9 optymalizacja dostpu do pamici [Goedecker2001] rozdz. 6, [Kaspersky2003] rozdz. 3 10
plan optymalizacja operacji na pamici [Kaspersky2003] rozdz. 2 alokacja rejestrów [Cooper2004] rozdz. 13 ograniczenie wykorzystywanej pamici [Bentley2008] rozdz. 10 [Kernigham2002] rozdz. 7 11
optymalizacja dostpu do pamici dostp do pamici jest głównym wskim gardłem w komputerach z hierarchi pamici std optymalizacja dostpu do pamici ma najwikszy wpływ na wzrost wydajnoci wikszy od optymalizacji operacji zmiennoprzecinkowych ok. 5 razy [Goedecker2001] 12
optymalizacja dostpu do pamici czasy dostpu do pamici zmieniaj si w szerokim zakresie w zalenoci od sposobu dostpu do pamici przeprowadza si test pamici: pomiar czasu powtarzalnego kopiowania elementów oddzielonych rónymi odstpami kopiowanie jest wykonywane wielokrotnie aby test był znaczcy statystycznie 13
optymalizacja dostpu do pamici odstp (stride) odległo mierzona w słowach pomidzy dwoma lokalizacjami pamici, do których kolejno nastpuje dostp w kodzie programu w zbiorach danych o rónych rozmiarach 14
optymalizacja dostpu do pamici po pierwszym kopiowaniu dane, albo ich cz, pozostaj w pamici notatnikowej, w celu dalszego kopiowania 15
wydajnokomputerów przy rónych dostpach do danych ze wzgldu na znaczenie przestrzennej lokalizacji danych w obliczeniach naukowych, warto zobaczy, jak si zachowuj komputery przy czasowym braku lokalnoci danych, czyli przy rónych odstpach midzy kolejnymi danymi 16
wydajnokomputerów przy rónych dostpach do danych po pierwsze: drastycznie odmienne zachowanie dla maszyn wektorowych (Cray C90) a komputerami RISC - dla RISC znaczny spadek szerokoci pasma pamici dla duych rozmiarów danych po drugie: szeroko pasma pamici nie jest zwizana z czasem cyklu procesora 17
zmiana porzdku w ptli dla optymalnej lokalizacji danych przedyskutujmy dostpy do pamici dla dwóch kodów, rónicych si jedynie kolejnoci ptli, dla małych i duych macierzy [Goedecker2001]: dimension a(n,n),b(n,n) C LOOP A do 10,i=1,n do 10,j=1,n 10 a(i,j)=b(i,j) 18
zmiana porzdku w ptli dla optymalnej lokalizacji danych dimension a(n,n),b(n,n) C LOOP B do 20,j=1,n do 20,i=1,n 20 a(i,j)=b(i,j) 19
zmiana porzdku w ptli dla optymalnej lokalizacji danych załoenia: rozmiar pamici notatnikowej 128 liczb podwójnej precyzji macierz jest mała, gdy n jest mniejsze ni 8 słów, oraz a i b mieszcz si w pamici notatnikowej długo wiersza w pamici notatnikowej to 8 podwójnych słów 20
zmiana porzdku w ptli dla optymalnej lokalizacji danych załoenia: fizyczny porzdek elementów macierzy w jzyku Fortran: kolumnami, w jzyku C: wierszami zgodnie z konwencj Fortranu, fizyczny porzdek elementów macierzy w pamici: a(1,1),a(2,1),a(3,1),,a(n,1), a(1,2),a(2,2),a(3,2),,a(n,2), 21
zmiana porzdku w ptli dla optymalnej lokalizacji danych załoenia: pierwsze elementy macierzy zarówno a jak i b s połoone na granicy wiersza czyli pierwszy element kadej macierzy jest równie pierwszym elementem wiersza pamici notatnikowej na pocztku oblicze nie ma adnych danych w pamici notatnikowej 22
analiza przypadków (1) ptla A, małe macierze, (8x8): dostp do elementów macierzy w kolejnoci: x(1,1),x(1,2),x(1,3),,x(1,8), x(2,1),x(2,2),x(2,3),,x(2,8), gdzie x to a albo b 23
analiza przypadków (1) - elementy x(1,i), x(1,i+1) s od siebie w odległoci 8 podwójnych słów, std chybione odwołanie wystpi dla pierwszych omiu ładowa a i b, jako e mamy dostp do fizycznych lokalizacji pamici: 1,9,17,25,33,41, 49 i 57 24
analiza przypadków (1) poniewa pami notatnikowa moe mieci wszystkie 128 podwójnych słów, które pojawiły si przy pierwszych 8 iteracjach podwójnej ptli, wszystkie kolejne odwołania do pamici bd trafione adne inne odwołania do pamici notatnikowej nie bd chybione w pozostałych iteracjach ptli ładowanie 128 elementów spowodowało 2x8 chybionych odwoła, czyli jedno na kade 8 słów 25
analiza przypadku (2) ptla A, due macierze, (16x16): wzorzec dostpu do pamici taki sam jak poprzednio, kolejne odwołania do pamici nie s ssiednie, s 16 podwójnych słów od siebie po pierwszych 16 iteracjach ptli (z których kada spowodowała chybione odwołanie) mamy zajte 2x16 wierszy, czyli 128 podwójnych słów (pami notatnikowa jest pełna) 26
analiza przypadku (2) wszystkie kolejne ładowane wiersze pamici notatnikowej nadpisz istniejce wiersze stare wiersze bd przerzucone do pamici głównej wiersz zawierajcy elementy od 129 do 136 zastpi wiersz z elementami od 1 do 8, itd. w drugiej iteracji ptli zewntrznej element x(2,1) nie bdzie dostpny, gdy jego wiersz zostanie zastpiony innym 27
analiza przypadku (2) std liczba chybionych odwoła wyniesie 2x16x16, czyli jedno odwołanie chybione na kade dostpne słowo 28
analiza przypadku (3 i 4) ptla B, małe (8x8) i due (16x16) macierze: w obu przypadkach jest dostp do elementów macierzy w porzdku w jakim s zapamitane w pamici jest tylko jedno chybione odwołanie do pamici notatnikowej co kade 8 podwójnych słów dane dostarczone do pamici notatnikowej przy chybionych odwołaniach s wykorzystane w kolejnych iteracjach ptli wewntrznej 29
porównanie przypadków dla duych macierzy struktura ptli A wykazuje du strat wydajnoci wydajno ta jest 30 razy gorsza ni dla struktury ptli B 30
fuzja ptli fuzja ptli w celu redukcji niepotrzebnych odwoła do pamici [Goedecker2001] program aktualizuje pozycj i prdko n czstek prdkoci vxyz(j,i) i siły fxyz(j,i), zapamitane w czci kodu aktualizacji prdkoci, musz by przeładowywane w ptli aktualizacji pozycji nadmiarowych przeładowa unika si, jeeli ptle s połczone w jedn 31
fuzja ptli [Goedecker2001] c UPDATE POSITIONS AND VELOCITIES do 10 i=1,n do 10 j=1,3 at = fxyz(j,i) vxyz(j,i)= vxyz(j,i)+(.5d0*dt/rmass)* (at + gxyz(j,i)) gxyz(j,i) = at rxyz(j,i)=rxyz(j,i)+ dt*vxyz(j,i) + (.5d0*dt*dt/rmass)*fxyz(j,i) 10 continue 32
optymalna lokalizacja danych aby osign optymaln lokalizacj danych, struktury danych w programie musz by zaprojektowane tak, aby wielkoci stosowane w tym samym kontekcie były fizycznie blisko w pamici rozpatrzmy dwie wersje ptli w kodzie dynamiki molekularnej: struktur danych A i B 33
struktura danych A [Goedecker2001] DATA STRUCTURE A dimension rx(n),ry(n),rz(n),fx(n),fz(n) c loop over all particle pairs do 100,i=1,n do 100,j=1,i-1 dist2=(rx(i)-rx(j))**2+(ry(i)-ry(j)**2 +(rz(i)-rz(j))**2 if (dist2.le.cutoff2) then c calculate interaction dfx=... dfy=... dfz=... 34
struktura danych A [Goedecker2001] c accumulate force fx(j)=fx(j)+dfx fy(j)=fy(j)+dfy fz(j)=fz(j)+dfz fx(i)=fx(i)-dfx fy(i)=fy(i)-dfy fz(i)=fz(i)-dfz endif 100 continue 35
struktura danych B [Goedecker2001] DATA STRUCTURE B dimension r(3,n),f(3,n) c loop over all particle pairs do 100,i=1,n do 100,j=1,i-1 dist2=(r(1,i)-r(1,j))**2+(r(2,i)-r(2,j)**2 +(r(3,i)-r(3,j))**2 if (dist2.le.cutoff2) then c calculate interaction dfx=... dfy=... dfz=... 36
struktura danych B [Goedecker2001] c accumulate force f(1,j)=fx(1,j)+dfx f(2,j)=fy(2,j)+dfy f(3,j)=fz(3,j)+dfz f(1,i)=fx(1,i)-dfx f(2,i)=fy(2,i)-dfy f(3,i)=fz(3,i)-dfz endif 100 continue 37
optymalna lokalizacja danych wzorce dostpu do pamici elementów tablicy fx(j), fy(j) i fz(j) s mniej lub bardziej losowe nie mona oczekiwa, e jeeli czstka j jest blisko czstki i, to czstka j+1 te bdzie oznacza to e odwołania do pamici dla j+1 składnika siły, wprowadzone do pamici notatnikowej przy dostpie do składnika j, prawdopodobnie bd nadpisane 38
optymalna lokalizacja danych std, zasadniczo mamy jedno chybione trafienie dla kadego odwołania si do składnika siły indeksowanego przez j dla 3 składników siły w strukturze danych A, wystpi trzy chybione trafienia dla struktury danych B, moemy załadowa wszystkie 3 składniki indeksowane przez j pod jednym chybionym trafieniem, gdy s obok siebie w pamici to jest efektywniejsze 39
przeładowanie pamici notatnikowej (cache thrashing) wystpuje, gdy wikszo fizycznej przestrzeni pamici notatnikowej jest niedostpna ze wzgldu na reguły odwzorowania efektywny rozmiar pamici notatnikowej jest równy rozmiarowi fizycznemu, jeeli dane z pamici głównej mog trafi do dowolnej lokalizacji w pamici notatnikowej 40
przeładowanie pamici notatnikowej nie jest tak jednak, nie mog trafi do dowolnej lokalizacji, podlegaj okrelonym ograniczeniom wynikajcym z reguł odwzorowania, co powoduje e efektywny rozmiar pamici notatnikowej si zmniejsza 41
znalezienie optymalnych odstpów dokonamy analizy wzorców dostpu do danych z niejednostkowymi odstpami taki wzorzec wystpuje, gdy chcemy dosta si do wierszy macierzy, podczas gdy w Fortranie jest konwencja dostpu kolumnami 42
znalezienie optymalnych odstpów nawet, gdy cała macierz nie mieci si w pamici notatnikowej, to jest moliwe umieszczenie odpowiednio duej liczby wierszy poprzez odpowiedni wybór odstpów w ten sposób osiga si blisko danych 43
znalezienie optymalnych odstpów odstpy mona dopasowa przez spowodowanie, aby wiodcy wymiar macierzy był wikszy od jej wymiaru logicznego osiga si to poprzez uzupełnienie macierzy kilkoma wierszami o nieistotnych wartociach numerycznych 44
znalezienie optymalnych odstpów najprostszym sposobem znalezienia optymalnych odstpów jest symulacja znajc reguł odwzorowania, moemy przewidzie lokalizacj w pamici notatnikowej - który wiersz pamici notatnikowej moe by dopasowany ledzc zajte ju wiersze pamici, moemy oceni, czy pami notatnikowa jest pełna 45
podział na bloki kwadratowe jest to strategia, uzyskania przestrzennej bliskoci danych w ptlach, tam gdzie nie ma moliwoci uzyskania małych odstpów dla wszystkich tablic podział oparty na obrazie statycznym podwojenie liczby ptli przykład: transpozycja macierzy, wpierw bez podziału, potem z podziałem 46
podział na bloki kwadratowe [Goedecker2001] subroutine rot(n,a,b) implicit real*8 (a-h,o-z) dimension a(n,n),b(n,n) do 100,i=1,n do 100,j=1,n b(j,i)=a(i,j) 100 continue return end 47
podział na bloki kwadratowe subroutine rotb(n,a,b,lot) implicit real*8 (a-h,o-z) dimension a(n,n),b(n,n) c loop over blocks do 100,ii=1,n,lot do 100,jj=1,n,lot c loop over elements in each block do 100,i=ii,min(n,ii+(lot-1)) do 100,j=jj,min(n,jj+(lot-1)) b(j,i)=a(i,j) 100 continue return end 48
podział na bloki liniowe podział zorientowany na wiersze albo kolumny opiera si na zrozumieniu dynamiki przepływu danych przez pami notatnikow stosuje si bloki o nieregularnej wielkoci potrzeba mniej ptli, ptle wewntrzne s dłusze 49
podział na bloki liniowe [Goedecker2001] subroutine rots(n,a,b,lot) implicit real*8 (a-h,o-z) dimension a(n,n),b(n,n) do 100,jj=1,n,lot do 100,i=1,n do 100,j=jj,min(n,jj+(lot-1)) b(j,i)=a(i,j) 100 continue return end 50
pobieranie danych z wyprzedzeniem pobieranie danych z wyprzedzeniem (prefetching) to jest pobieranie danych znacznie wczeniej ni s potrzebne procesor ma czsto dane dostarczane zbyt póno z pamici s tego dwie przyczyny: zbyt mała szeroko pasma pamici oraz opónienie pamici 51
pobieranie danych z wyprzedzeniem zbyt mała szeroko pasma pamici: jeeli program zakłada jedno ładowanie na cykl, a szeroko pasma pamici głównej zakłada jeden transfer na dwa cykle, to program jest spowalniany dwukrotnie 52
pobieranie danych z wyprzedzeniem opónienie pamici: jeeli instrukcje ładowania s zaplanowane krótko przed tym jak element danych jest potrzebny, to moliwe chybione trafienia do pamici notatnikowej spowoduj oczekiwanie procesora na dane 53
pobieranie danych z wyprzedzeniem aby tego unikn, pobiera si dane wczeniej jeeli czas midzy pobraniem danych a ich wykorzystaniem połczy si z innymi obliczeniami, procesor nie bdzie bezczynny i uzyskamy du wydajno 54
wyrównanie danych poprawne wyrównanie danych oznacza, e np. liczby zmiennoprzecinkowe podwójnej precyzji rozpoczynaj si w lokalizacji pamici bdcej wielokrotnoci 8 bajtów w przypadku wspólnych bloków, jeeli poprzedza je liczba całkowita zajmujca 4 bajty, pozostałe liczby 8 bajtowe mog by le wyrównane 55
wnioski w prezentacji skupiono si na optymalizacji dostpu do pamici pozostałe kwestie dotyczce operacji na pamici, alokacji rejestrów i ograniczenia wykorzystywanej pamici, s przedmiotem kolejnych spotka 56