• Nie Znaleziono Wyników

1.3 Układ pami˛eci

1.3.2 Pami˛e´c podr˛eczna

Podstawowy mechanizm działania pami˛eci podr˛ecznej i lokalno´s´c odniesie ´n

Obliczony adres fizyczny słu˙zy do uzyskania dost˛epu do zawarto´sci odpowiadaj ˛acej mu komórki pami˛eci. W praktyce dost˛ep taki jest zawsze realizowany za po´srednictwem pamieci podr˛ecznej9. Opis mechanizmów funkcjonowania pami˛eci podr˛ecznej rozpoczniemy od sytuacji wyst˛epowania tylko poje-dynczego poziomu, rozszerzaj ˛ac go nast˛epnie na przypadek kilku poziomów.

Pami˛e´c podr˛eczna składa si˛e z linii. Dla ró˙znych poziomów pami˛eci rozmiar pojedynczej linii mo˙ze si˛e ró˙zni´c, przy czym najcz˛e´sciej spotyka si˛e linie o rozmiarze 64 lub 128 bajtów (co oznacza kilka zmiennych podwójnej precyzji lub kilkana´scie zmiennych całkowitych i pojedynczej precyzji). Pami˛e´c fizyczna podzielona jest na bloki, ka˙zdy o rozmiarze odpowiadaj ˛acym rozmiarowi linii pami˛eci pod-r˛ecznej. W najprostszym modelu, pami˛eci odwzorowanej bezpo´srednio (direct mapped), ka˙zdy blok pa-mi˛eci fizycznej jest przyporz ˛adkowany do pojedynczej linii pami˛eci podr˛ecznej. Kolejny nast˛epuj ˛acy po nim blok jest przyporz ˛adkowany kolejnej linii, itd. Całkowity rozmiar pami˛eci podr˛ecznej jest znacznie mniejszy od rozmiaru pami˛eci fizycznej (DRAM), st ˛ad w pewnym momencie kolejny blok zostaje przy-porz ˛adkowany pierwszej linii i, w ko´ncowym efekcie, pojedynczej linii pami˛eci podr˛ecznej odpowiada wiele bloków pami˛eci fizycznej.

Mechanizm działania pami˛eci podr˛ecznej jest nast˛epuj ˛acy. Procesor, po wygenerowaniu adresu zmiennej, do której chce uzyska´c dost˛ep, sprawdza czy odpowiadaj ˛aca zmienna znajduje si˛e w pami˛eci podr˛ecznej (czyli czy aktualna kopia bloku pami˛eci fizycznej zawieraj ˛acego wygenerowany adres znaj-duje si˛e w odpowiadaj ˛acej mu linii pami˛eci podr˛ecznej)10. Je´sli aktualna zmienna jest w pami˛eci pod-r˛ecznej (co b˛edziemy okre´slali jako trafienie w pami˛eci podpod-r˛ecznej, cache hit), procesor realizuje szybki dost˛ep do zmiennej. Je´sli blok zawieraj ˛acy zmienn ˛a nie znajduje si˛e w pami˛eci podr˛ecznej, co

okre-´slane jest jako chybienie (cache miss), zawarto´s´c całej linii jest podmieniana, blok pami˛eci fizycznej jest kopiowany do linii pami˛eci podr˛ecznej, po czym nast˛epuje realizacja dost˛epu do pami˛eci podr˛ecznej.

Załadowany blok pozostaje w pami˛eci podr˛ecznej, dopóki nie zostanie podmieniony przez inny blok, odwzorowany w t˛e sam ˛a lini˛e.

Powy˙zszy opis wskazuje na kilka podstawowych, z punktu widzenia wydajno´sci faktów:

• je´sli w trakcie wykonania programu dost˛ep do pewnej zmiennej nast˛epuje wielokrotnie w krótkich odst˛epach czasu (tzw. lokalno´s´c czasowa, temporal locality), to ro´snie prawdopodobie´nstwo, ˙ze kolejne dost˛epy (poza pierwszym) realizowane b˛ed ˛a przy u˙zyciu pami˛eci podr˛ecznej, a nie powol-nej pami˛eci DRAM

9W praktyce dost˛ep do pami˛eci podr˛ecznej odbywa si˛e, poprzez zastosowanie odpowiednich mechanizmów, do pewnego stopnia równolegle z translacj ˛a adresu z wirtualnego na fizyczny – w efekcie jednak zawarto´s´c pami˛eci podr˛ecznej zazwyczaj odpowiada zawarto´sci pami˛eci fizycznej, nie wirtualnej.

10Znaczenie okre´slenia aktualna kopia wyja´snione zostanie przy omawianiu mechanizmów utrzymania spójno´sci pami˛eci podr˛ecznej.

• je´sli w trakcie wykonania programu w krótkim odst˛epie czasu nast˛epuj ˛a dost˛epy do ró˙znych zmiennych przechowywanych w tym samym bloku pami˛eci, odwzorowanym w pojedyncz ˛a lini˛e pami˛eci podr˛ecznej (tzw. lokalno´s´c przestrzenna, spatial locality), to ro´snie prawdopodobie´nstwo,

˙ze dost˛epy do kolejnych zmiennych (poza pierwsz ˛a) realizowane b˛ed ˛a przy u˙zyciu pami˛eci pod-r˛ecznej, a nie powolnej pami˛eci DRAM

• je´sli nast˛epuje chybienie w pami˛eci podr˛ecznej, to narzut czasowy na obsług˛e chybienia (miss penalty) jest znacz ˛acy, ze wzgl˛edu na konieczno´s´c podmiany całej linii pami˛eci podr˛ecznej Skuteczno´s´c pami˛eci podr˛ecznej zale˙zy od tego jak wiele programów i w jak du˙zym stopniu wykazuje czasow ˛a i przestrzenn ˛a lokalno´s´c odniesie´n. Okazuje si˛e, ˙ze zdecydowana wi˛ekszo´s´c z programów ko-rzysta z istnienia pami˛eci podr˛ecznych i uzyskuje dzi˛eki niej redukcj˛e czasu wykonania. W celu uzyska-nia maksymalnej redukcji dla jak najwi˛ekszej liczby programów stosuje si˛e szereg szczegółowych me-chanizmów funkcjonowania pami˛eci podr˛ecznej, z których niektóre zostan ˛a omówione w dalszej cz˛e´sci rozdziału.

Podstawowy sposób działania pami˛eci podr˛ecznej implikuje najwa˙zniejsze wskazanie dotycz ˛ace optymalizacji dost˛epów do pami˛eci przy wykonaniu programów na współczesnych systemach kompute-rowych: nale˙zy zawsze d ˛a˙zy´c do maksymalizacji lokalno´sci czasowej i przestrzennej odniesie ´n do pami˛eci w trakcie wykonania programów. Nale˙zy tak˙ze zawsze pami˛eta´c o tym, ˙ze dost˛ep do pami˛eci DRAM standardowo dotyczy całej linii pami˛eci podr˛ecznej, a nie pojedynczej zmiennej.

Eksperymentalne wykrywanie rozmiaru pami˛eci podr˛ecznej i rozmiaru jej pojedynczej linii Algorytmem cz˛esto wykorzystywanym przy badaniu parametrów pami˛eci podr˛ecznej jest, wielo-krotnie wykonywana, prosta p˛etla, w której odwiedza si˛e elementy tablicy liczbowej tab, znajduj ˛ace si˛e w odległo´sci skok od siebie. Zakładaj ˛ac rozmiar tablicy rozmiar_tab, p˛etla mo˙ze wygl ˛ada´c nast˛e-puj ˛aco:

for (j=0; j<rozmiar_tab; j+=skok) tab[j]++;

Dobór operacji wykonywanej na elementach tablicy ma znaczenie dla wydajno´sci wykonania. Inaczej b˛edzie w przypadku odczytu warto´sci, inaczej w przypadku zapisu, inaczej w zastosowanej w przykła-dzie modyfikacji warto´sci, oznaczaj ˛acej pobranie i zapis.

W przypadku powy˙zszego algorytmu, podobnie jak w przypadku ka˙zdego kodu dokonuj ˛acego dost˛e-pów do pami˛eci, nale˙zy uwzgl˛ednia´c mo˙zliwo´s´c dokonywania szeregu optymalizacji przez kompilator i sprz˛et wykonuj ˛acy obliczenia. Kompilator mo˙ze stara´c si˛e eliminowa´c operacje, które nie maj ˛a znacze-nia dla wyniku programu (dlatego zawsze warto wybiera´c operacje, których efekt nie jest pomijalny, np.

słu˙z ˛a do obliczenia warto´sci, która jest potem wypisywana na ekranie). Mo˙ze tak˙ze stosowa´c rozmaite warianty rozkazów procesora do realizacji dost˛epów do pami˛eci i wykonania samej operacji. Z kolei procesor mo˙ze stosowa´c rozmaite techniki optymalizacji, które ogólnie mo˙zna nazwa´c technikami ukry-wania opó´znienia przy dost˛epie do pami˛eci. Jedn ˛a z najwa˙zniejszych jest pobieranie z wyprzedzeniem (prefetching), b˛ed ˛ace form ˛a wykonania spekulatywnego.

Standardowe wykonanie p˛etli w rozwa˙zanym algorytmie oznacza, ˙ze w ka˙zdej iteracji generowane jest ˙z ˛adanie pobrania z pami˛eci, nast˛epnie wykonywana jest operacja i wynik z powrotem zapisywany do pami˛eci. Po przej´sciu do kolejnej iteracji sekwencja sie powtarza.

Podstaw ˛a mechanizmu pobierania z wyprzedzeniem jest obserwacja, ˙ze bardzo cz˛esto dost˛epy do pami˛eci realizowane s ˛a przez programy według pewnego wzorca. W przypadku powy˙zszej p˛etli wzor-cem tym jest dost˛ep do kolejnych komórek pami˛eci oddalonych o stały, ´sci´sle okre´slony odst˛ep. Je´sli realizowane jest wiele dost˛epów to mo˙zna je w takiej sytuacji przewidywa´c, i realizuj ˛ac jeden z nich mo˙zna współbie˙znie, z najwy˙zsz ˛a dost˛epn ˛a wydajno´sci ˛a, inicjowa´c realizacj˛e kolejnego.

Tak wła´snie działaj ˛a układy pobierania z wyprzedzeniem. Na podstawie dotychczasowych dost˛epów do pami˛eci, procesor spekulatywnie zgaduje, gdzie nast ˛api kolejny dost˛ep i, zanim jeszcze dotrze do odpowiednich rozkazów pobrania lub zapisu, uruchamia mechanizmy dost˛epu do wybranej komórki pa-mi˛eci (a dokładniej do wybranego bloku papa-mi˛eci, odpowiadaj ˛acego linii pami˛eci podr˛ecznej). W efekcie, bezpo´srednio po pobraniu linii pami˛eci podr˛ecznej, współbie˙znie z wykonywaniem operacji na kolejnych elementach linii, procesor mo˙ze spekulatywnie pobra´c zawarto´s´c kolejnej linii. Czas obsługi chybienia w pami˛eci podr˛ecznej, które nast˛epuje przy jednym z kolejnych dost˛epów do pami˛eci, zostaje cz˛e´sciowo lub całkowicie ukryty w czasie wykonywania poprzednich dost˛epów. Oczywi´scie, w przypadku bł˛ed-nej spekulacji pobrane dane nie s ˛a wykorzystywane, a realizacja niepotrzebnego dost˛epu mo˙ze zaburza´c efektywn ˛a realizacje dost˛epów jawnie wskazanych w kodzie, stanowi ˛ac narzut wykonania spekulatyw-nego.

Współczesne procesory mog ˛a posiada´c kilka układów pobierania z wyprzedzeniem, dotycz ˛acych np. transferów pomi˛edzy ró˙znymi poziomami pami˛eci podr˛ecznej i pami˛eci ˛a DRAM. Układy te mo˙zna wył ˛acza´c z poziomu systemu operacyjnego, je´sli np. chce si˛e uzyska´c informacj˛e o pracy konkretnego komponentu sprz˛etowego, a pobieranie z wyprzedzeniem zaburza uzyskiwanie takiej informacji. W przy-kładach w niniejszej ksi ˛a˙zce wył ˛aczanie pobierania z wyprzedzeniem nie b˛edzie stosowane, natomiast uwzgl˛edniany i badany b˛edzie jego mo˙zliwy wpływ na wydajno´s´c analizowanych algorytmów. Odpo-wiada to punktowi widzenia przeci˛etnego u˙zytkownika systemów komputerowych, który przy wykony-waniu programów nie ma mo˙zliwo´sci unikni˛ecia efektów pobierania z wyprzedzeniem.

W przypadku p˛etli stosowanej do odkrywania parametrów pami˛eci podr˛ecznej, podobnie jak w przy-padku zdecydowanej wi˛ekszo´sci algorytmów, których wydajno´s´c uzale˙zniona jest od czasu dost˛epów do pami˛eci, zło˙zono´s´c mechanizmów obsługi dost˛epów do pami˛eci przez współczesne procesory unie-mo˙zliwia praktycznie przewidzenie czasu wykonania p˛etli. Zło˙zono´s´c mechanizmów oznacza nie tylko podstawowe algorytmiczne aspekty funkcjonowania pami˛eci podr˛ecznych i ró˙zne warianty pobierania z wyprzedzeniem, ale tak˙ze szczegóły funkcjonowania układów SRAM i DRAM czy dodatkowe układy stosowane przez producentów procesorów w celu usprawnienia dost˛epów do pami˛eci (jak np. udost˛ep-nianie elementów podmienianej linii w pami˛eci podr˛ecznej, jeszcze przed zako´nczeniem pobierania całej linii).

Niemniej algorytmy takie jak powy˙zszy pozwalaj ˛a na wykrycie ró˙zni´c w czasie wykonania dla roz-maitych kombinacji parametrów algorytmu i wnioskowanie na podstawie tych ró˙znic. W celu ustalenia rozmiaru kolejnych poziomów pami˛eci podr˛ecznej rozwa˙zana p˛etla b˛edzie wykonywana dla ró˙znych rozmiarów tablic tab (dla ka˙zdego rozmiaru wykonanie b˛edzie wielokrotne w celu uzyskania wi˛ekszej dokładno´sci pomiaru czasu oraz dla unikni˛ecia efektu zaburze´n przy pierwszym wykonaniu).

W programie obliczana jest liczba dost˛epów do pami˛eci (na podstawie kodu ´zródłowego) i czas reali-zacji dost˛epów. W efekcie uzyskuje si˛e eksperymentalnie ´sredni czas dost˛epu do pojedynczego wyrazu tablicy jako funkcj˛e rozmiaru tablicy. Dla rozmiarów b˛ed ˛acych kolejnymi pot˛egami 2 eksperyment dla platformy testowej u˙zywanej w ksi ˛a˙zce wykazał nast˛epuj ˛ace ´srednie czasy dost˛epu:

....

Pomiary pokazuj ˛a, przy przekraczaniu jakich wielko´sci tablic nast˛epuje wzrost ´sredniego czasu do-st˛epu. Mo˙zna wnioskowa´c, ˙ze taki wzrost nast˛epuje, kiedy rozmiar tablicy przekracza rozmiar pami˛eci podr˛ecznej kolejnego poziomu. Na podstawie pomiarów (wiedz ˛ac jednocze´snie, ˙ze rozmiary pami˛eci podr˛ecznej s ˛a tak˙ze pot˛egami 2) mo˙zna wywnioskowa´c, ˙ze pami˛e´c L1 ma ... kB, pami˛e´c L2 ..., a pami˛e´c L3 ....

Chc ˛ac znale´z´c rozmiar pojedynczej linii pami˛eci podr˛ecznej mo˙zna wykona´c kolejny eksperyment.

Tym razem, rozmiar tablicy ustalony jest jako na tyle du˙zy, ˙zeby nie mie´sciła si˛e ona w pami˛eci pod-r˛ecznej ˙zadnego z poziomów. Przeprowadza si˛e seri˛e eksperymentów dla stałego rozmiaru tablicy, ale dla rosn ˛acych warto´sci zmiennej skok, znowu jako pot˛eg liczby 2. ´Srednie czasy dost˛epu na platformie testowej dla tablicy o rozmiarze 512 MB i kolejnych warto´sci zmiennej skok wygl ˛adaj ˛a nast˛epuj ˛aco:

...

Pierwsze z tych warto´sci mo˙zna interpretowa´c nast˛epuj ˛aco. Zawsze pierwsze odwiedzenie dowol-nego wyrazu tablicy oznacza, ˙ze odpowiadaj ˛aca mu linia pami˛eci podr˛ecznej musi zosta´c pobrana z pami˛eci DRAM. Przy kolejnym odwiedzeniu (p˛etla w algorytmie testowym wykonywana jest wielokrot-nie), to czy linia nadal pozostaje w pami˛eci podr˛ecznej któregokolwiek z poziomów, zale˙zy od rozmiaru tablicy. Ze wzgl˛edu na du˙zy rozmiar tablicy w testowym algorytmie, mamy pewno´s´c, ˙ze przy kolej-nym dost˛epie do zmiennej, odpowiadaj ˛aca jej linia pami˛eci podr˛ecznej została podmieniona przez linie zwi ˛azane z innymi wyrazami tablicy. W takim wypadku wykonanie operacji na całej tablicy wymaga pobrania z pami˛eci DRAM wszystkich bloków zwi ˛azanych ze zmiennymi na których wykonywane s ˛a operacje. Ile takich bloków jest pobieranych i ile z pobranych danych wykorzystanych jest efektywnie w algorytmie?

W przypadku skoku równego 1, czyli pobierania kolejnych wyrazów tablicy, z pami˛eci DRAM po-bierane s ˛a wszystkie bloki tablicy i wykorzystywany efektywnie jest ka˙zdy pobrany wyraz. W przypadku skoku 2, nadal pobierane s ˛a wszystkie bloki, ale wykorzystywany jest tylko co drugi wyraz. Oznacza to,

˙ze czas wykonania p˛etli jest taki sam (w przybli˙zeniu) jak w przypadku skoku równego 1, ale efektywna liczba dost˛epów do pami˛eci jest dwukrotnie mniejsza. W konsekwencji ´sredni czas dost˛epu do zmiennej powinien wzrosn ˛a´c dwukrotnie, co rzeczywi´scie pokazuj ˛a wyniki eksperymentu obliczeniowego.

Podobnie dla skoku równego 4 i kolejnych rosn ˛acych warto´sci zmiennej skok, a˙z do momentu kiedy skok nie przekroczy rozmiaru pojedynczej linii pami˛eci podr˛ecznej. Wtedy nie wszystkie bloki odpowia-daj ˛ace tablicy s ˛a pobierane z pami˛eci DRAM, co oznacza, ˙ze czas realizacji algorytmu skraca si˛e. ´Sredni czas dost˛epu przestaje rosn ˛a´c dwukrotnie przy dwukrotnym zwi˛ekszeniu warto´sci zmiennej skok. W badanym algorytmie zachodzi to dla warto´sci amiennej skok równej ... , z czego mo˙zna wnioskowa´c, ˙ze rozmiar pojedynczej linii pami˛eci podr˛ecznej (poziomu L1) wynosi ...

Dro˙zno´s´c pami˛eci podr˛ecznej

Mechanizm bezpo´srednio odwzorowanej pami˛eci podr˛ecznej ma istotna wad˛e. Rozwa˙zmy prost ˛a p˛etl˛e algorytmu obliczania iloczynu skalarnego dwóch wektorów:

for (j=0; j<N; j++) il_skal += b[j] * c[j];

Wydaje si˛e, ˙ze algorytm b˛edzie realizowany optymalnie, ze wzgl˛edu na du˙z ˛a lokalno´s´c przestrzenn ˛a odniesie´n. Jednak mo˙ze si˛e zdarzy´c, ˙ze pocz ˛atki tablic b i c zostan ˛a odwzorowane w to samo miejsce pami˛eci podr˛ecznej. Wtedy dla ka˙zdej iteracji p˛etli, po pobraniu elementu tablicy b, musi nast ˛api´c pod-miana linii pami˛eci podr˛ecznej, w celu pobrania elementu tablicy c. Aby temu zapobiec powszechnie stosuje si˛e tzw. pami˛eci sekcyjno-skojarzeniowe (set associative). Pojedynczy blok pami˛eci fizycznej jest przyporz ˛adkowany wi˛ecej ni˙z jednej linii pami˛eci podr˛ecznej, w praktyce najcz˛e´sciej 2, 4 lub 8 liniom, co nazywane jest pami˛eci ˛a dwu-dro˙zn ˛a (two-way), cztero-dro˙zn ˛a (four-way) i o´smio-dro˙zn ˛a (eight-way).

Ju˙z pami˛e´c dwu-dro˙zna rozwi ˛azuje problem algorytmu iloczynu skalarnego: je´sli pocz ˛atki obu tablic odwzorowane s ˛a w t˛e sam ˛a par˛e linii, to jedna z tablic b˛edzie cały czas przechowywana w jednej linii z pary, a druga z tablic w drugiej (wymaga to odpowiedniego mechanizmu podmiany linii w pami˛eci podr˛ecznej, który omówiony zostanie poni˙zej).

Warto´s´c dro˙zno´sci pami˛eci podr˛ecznej zazwyczaj mo˙zna znale´z´c w dokumentacji technicznej proce-sora. Mo˙zna j ˛a tak˙ze wyznaczy´c eksperymentalnie. Jednym z algorytmów, który mo˙ze słu˙zy´c do okre´sla-nia dro˙zno´sci pami˛eci podr˛ecznej, a tak˙ze w szerszej perspektywie do analizowanie wpływu organizacji odniesie´n do pami˛eci na wydajno´s´c, jest wielokrotne wykonywanie nast˛epuj ˛acej p˛etli:

for(linia=0; linia < LICZBA_LINII; linia+= ODSTEP){

suma += a[ linia*(ROZMIAR_LINII)];

}

W p˛etli tej dokonywane s ˛a wielokrotne dost˛epy do elementów odpowiednio długiej tablicy a (w oma-wianym przypadku zaalokowanej w taki sposób, ˙ze adres pocz ˛atkowy jest wielokrotno´sci ˛a rozmiaru linii pami˛eci podr˛ecznej). Parametr ROZMIAR_LINII odpowiada liczbie elementów tablicy w pojedynczej linii pami˛eci podr˛ecznej. Dzi˛eki jego wykorzystaniu, w ka˙zdej iteracji p˛etli odwiedzany jest inny blok pami˛eci DRAM, powi ˛azany z pojedyncz ˛a lini ˛a pami˛eci podr˛ecznej. Parametr ODSTEP decyduje o od-st˛epie miedzy kolejnymi pobieranymi elementami tablicy a, a w konsekwencji o odod-st˛epie (liczonym w liczbie bloków) pomi˛edzy kolejno odwiedzanymi blokami.

Mo˙zna zało˙zy´c, ˙ze dwa kolejno po sobie nast˛epuj ˛ace bloki pami˛eci zostan ˛a umieszczone w dwóch ró˙znych zbiorach linii. Dla warto´sci ODSTEP=1, dost˛epy do warto´sci tablicy a w kolejnych iteracjach powoduj ˛a pocz ˛atkowo wypełnienie jednej linii w ka˙zdym zbiorze. Nast˛epnie wypełnione zostaj ˛a drugie linie w ka˙zdym zbiorze, po czym trzecie, i tak dalej, a˙z do osi ˛agni˛ecia warto´sci odpowiadaj ˛acej dro˙zno´sci pami˛eci. Tym sposobem wykorzystane zostaj ˛a wszystkie linie pami˛eci podr˛ecznej (cho´c w algorytmie efektywnie u˙zyta jest tylko jedna liczba z ka˙zdej linii).

Przy takiej organizacji pami˛eci podr˛ecznej, w przypadku warto´sci ODSTEP=2, bloki odwiedzane w kolejnych iteracjach trafiaj ˛a do co drugiego zbioru linii i efektywnie wykorzystywana jest tylko połowa pami˛eci (połowa zbiorów linii nie jest u˙zywana). Powoduje to tak˙ze odpowiedni spadek wydajno´sci.

Dla wy˙zszych warto´sci parametru ODSTEP funkcjonowanie pami˛eci podr˛ecznej zale˙zy od jej dro˙z-no´sci i całkowitej pojemdro˙z-no´sci. Dla warto´sci odpowiadaj ˛acej dwóm kolejnym blokom w pami˛eci DRAM oddzielonym rozmiarem całej pami˛eci podr˛ecznej, mo˙zna zało˙zy´c, ˙ze trafi ˛a one do tego samego zbioru (niezale˙znie od dro˙zno´sci, a nawet dla pami˛eci bezpo´srednio odwzorowanej). W przypadku omawianego algorytmu oznacza to np. warto´s´c 512, przy rozmiarze pami˛eci podr˛ecznej 32 kB i rozmiarze pojedynczej linii 64 B.

Do zbadania dro˙zno´sci pami˛eci podr˛ecznej wystarczy przyj˛ecie opisanej powy˙zej warto´sci ODSTEP i badanie przy jakiej warto´sci parametru LICZBA_LINII nast ˛api spadek wydajno´sci wielokrotnego wy-konania analizowanej p˛etli (mo˙zna tak˙ze bezpo´srednio zlicza´c liczb˛e chybie´n w pami˛eci podr˛ecznej za pomoc ˛a odpowiednich narz˛edzi). Dla warto´sci LICZBA_LINII poni˙zej dro˙zno´sci pami˛eci podr˛ecznej nie powinny wyst ˛api´c ˙zadne chybienia w pami˛eci, poza pocz ˛atkowymi, kiedy warto´sci po raz pierwszy pobierane s ˛a z pami˛eci DRAM. Po przekroczeniu tej warto´sci liczba chybie´n skokowo ro´snie.

Pami˛eci wielodro˙zne maj ˛a istotne zalety. Im wy˙zsza dro˙zno´s´c tym mniejsze prawdopodobie´nstwo, ˙ze w konkretnym programie dla pewnego zbiór zmiennych, intensywnie wykorzystywanych i przyporz ˛ ad-kowanych tej samej grupie linii pami˛eci podr˛ecznej, liczba linii oka˙ze si˛e zbyt mała, co b˛edzie prowadzi´c do cz˛estych podmian linii w tej grupie, podczas gdy pozostałe grupy linii nie b˛ed ˛a wykorzystane. Skraj-nym przypadkiem jest pami˛e´c w pełni skojarzeniowa (fully associative), w której ka˙zdy blok pami˛eci fizycznej mo˙ze by´c przechowywany w dowolnej linii pami˛eci podr˛ecznej. Daje to gwarancj˛e, ˙ze zawsze wykorzystywana b˛edzie pełna pojemno´s´c pami˛eci, nie doprowadzaj ˛ac do marnowania zasobów.

Jednak w praktyce dro˙zno´s´c pami˛eci podr˛ecznych nie ro´snie znacz ˛aco. Dla pami˛eci k-dro˙znych, pro-cesor przy ka˙zdorazowej próbie dost˛epu do pami˛eci musi sprawdzi´c k linii, czy przechowuj ˛a odpowiedni blok pami˛eci fizycznej. Oznacza to wzrost czasu potrzebnego na realizacje dost˛epów. Dla wi˛ekszo´sci programów, ten wzrost b˛edzie przewa˙zał nad zyskami z wi˛ekszej elastyczno´sci pami˛eci o wy˙zszej dro˙z-no´sci.

Szczegóły funkcjonowania pami˛eci podr˛ecznej

Poza omówionymi powy˙zej podstawowymi mechanizmami, funkcjonowanie pami˛eci podr˛ecznej obejmuje szereg szczegółowych rozwi ˛aza´n. Obejmuj ˛a one np. strategie podmiany linii (z najcz˛e´sciej stosowanymi: najdawniej u˙zyta, least recently used, LRU, i najrzadziej u˙zywana, least frequently used, LFU), u˙zycie tzw. victim cache wył ˛acznie dla podmienionych linii z pami˛eci bli˙zszej potokom wyko-nania, działanie nieblokuj ˛ace, kolorowanie stron, wykonanie potokowe, wielobankowo´s´c. Ka˙zdy z tych

mechanizmów ma wpływ na wydajno´s´c, jednak do ich wykorzystania nie ma jawnych mechanizmów programowania. , a techniki niejawne cz˛esto nie gwarantuj ˛a pewnego rezultatu i bywaj ˛a nieprzeno´sne.

Ju˙z sam fakt istnienia pami˛eci podr˛ecznej nie jest zaznaczony w praktycznie ˙zadnym z najwa˙zniejszych j˛ezyków programowania. Optymalizacja u˙zycia pami˛eci podr˛ecznej odbywa si˛e poprzez zmiany kodu

´zródłowego, co do których przewiduje si˛e, ˙ze b˛ed ˛a miały wpływ na wydajno´s´c (alternatyw ˛a jest ko-rzystanie z wybranych rozkazów z listy procesora, które jednak tak˙ze nie daj ˛a mo˙zliwo´sci sterowania wi˛ekszo´sci ˛a aspektów funkcjonowania pami˛eci podr˛ecznej). Im bardziej szczegółowy mechanizm dzia-łania pami˛eci tym trudniej jest optymalizowa´c jego wykorzystanie.

Powiązane dokumenty