Co to jest rozmiar pamięci podręcznej? Na co wpływa pamięć podręczna procesora L1 L2 L3?

Wszyscy użytkownicy doskonale zdają sobie sprawę z takich elementów komputera, jak procesor, który odpowiada za przetwarzanie danych, a także pamięć o dostępie swobodnym (RAM lub RAM), która jest odpowiedzialna za ich przechowywanie. Ale nie każdy zapewne wie, że istnieje również pamięć podręczna procesora (Cache CPU), czyli pamięć RAM samego procesora (tzw. ultra-RAM).

Co skłoniło projektantów komputerów do stosowania pamięci dedykowanej dla procesora? Czy pojemność pamięci RAM komputera nie jest wystarczająca?

Rzeczywiście, przez długi czas komputery osobiste radziły sobie bez pamięci podręcznej. Ale, jak wiadomo, procesor jest najszybszym urządzeniem w komputerze osobistym, a jego prędkość wzrasta z każdą nową generacją procesora. Obecnie jego prędkość mierzy się w miliardach operacji na sekundę. Jednocześnie standardowa pamięć RAM nie zwiększyła znacząco swojej wydajności podczas swojej ewolucji.

Ogólnie rzecz biorąc, istnieją dwie główne technologie układów pamięci – pamięć statyczna i pamięć dynamiczna. Nie wnikając w szczegóły ich konstrukcji, powiemy jedynie, że pamięć statyczna w odróżnieniu od pamięci dynamicznej nie wymaga regeneracji; Ponadto pamięć statyczna wykorzystuje 4-8 tranzystorów na jeden bit informacji, podczas gdy pamięć dynamiczna wykorzystuje 1-2 tranzystory. W związku z tym pamięć dynamiczna jest znacznie tańsza niż pamięć statyczna, ale jednocześnie znacznie wolniejsza. Obecnie kości RAM produkowane są w oparciu o pamięć dynamiczną.

Przybliżona ewolucja stosunku szybkości procesorów i pamięci RAM:

Gdyby więc procesor cały czas pobierał informacje z pamięci RAM, musiałby czekać na powolną pamięć dynamiczną i cały czas byłby bezczynny. W tym samym przypadku, gdyby jako pamięć RAM użyto pamięci statycznej, koszt komputera wzrósłby kilkukrotnie.

Dlatego wypracowano rozsądny kompromis. Większość pamięci RAM pozostała dynamiczna, a procesor otrzymał własną szybką pamięć podręczną opartą na statycznych układach pamięci. Jego objętość jest stosunkowo niewielka - na przykład rozmiar pamięci podręcznej drugiego poziomu to tylko kilka megabajtów. Warto jednak pamiętać, że cała pamięć RAM pierwszych komputerów IBM PC zajmowała mniej niż 1 MB.

Ponadto na celowość wprowadzenia technologii buforowania wpływa również fakt, że różne aplikacje zlokalizowane w pamięci RAM w różny sposób obciążają procesor, a w efekcie pojawia się dużo danych, które wymagają priorytetowego przetwarzania w porównaniu do innych.

Historia pamięci podręcznej

Ściśle rzecz biorąc, zanim pamięć podręczna przeniosła się do komputerów osobistych, z powodzeniem była stosowana w superkomputerach już od kilkudziesięciu lat.

Po raz pierwszy w komputerze PC opartym na procesorze i80386 pojawiła się pamięć podręczna o wielkości zaledwie 16 KB. Obecnie nowoczesne procesory korzystają z różnych poziomów pamięci podręcznej, od pierwszego (najszybsza pamięć podręczna o najmniejszym rozmiarze - zwykle 128 KB) do trzeciego (najwolniejsza pamięć podręczna o największym rozmiarze - do kilkudziesięciu MB).

Początkowo zewnętrzna pamięć podręczna procesora znajdowała się na osobnym chipie. Z biegiem czasu spowodowało to jednak, że magistrala znajdująca się pomiędzy pamięcią podręczną a procesorem stała się wąskim gardłem, spowalniając wymianę danych. W nowoczesnych mikroprocesorach zarówno pierwszy, jak i drugi poziom pamięci podręcznej znajdują się w samym rdzeniu procesora.

Przez długi czas procesory miały tylko dwa poziomy pamięci podręcznej, ale procesor Intel Itanium jako pierwszy posiadał pamięć podręczną trzeciego poziomu, wspólną dla wszystkich rdzeni procesorów. Istnieją również opracowania procesorów z czteropoziomową pamięcią podręczną.

Architektury i zasady pamięci podręcznej

Obecnie znane są dwa główne typy organizacji pamięci podręcznej, które wywodzą się z pierwszych osiągnięć teoretycznych w dziedzinie cybernetyki – architektury Princeton i Harvard. Architektura Princeton zakłada pojedynczą przestrzeń pamięci do przechowywania danych i poleceń, podczas gdy architektura Harvardu zakłada oddzielne przestrzenie. Większość procesorów komputerów osobistych x86 korzysta z oddzielnego typu pamięci podręcznej. Ponadto we współczesnych procesorach pojawił się także trzeci rodzaj pamięci podręcznej – tzw. asocjacyjny bufor translacyjny, mający na celu przyspieszenie konwersji adresów pamięci wirtualnej systemu operacyjnego na adresy pamięci fizycznej.

Uproszczony schemat interakcji pamięci podręcznej i procesora można opisać w następujący sposób. Najpierw procesor sprawdza obecność potrzebnych mu informacji w najszybszej pamięci podręcznej pierwszego poziomu, następnie w pamięci podręcznej drugiego poziomu itp. Jeśli na żadnym poziomie pamięci podręcznej nie zostaną znalezione niezbędne informacje, nazywa się to błędem lub brakiem pamięci podręcznej. Jeśli w ogóle nie ma informacji w pamięci podręcznej, procesor musi je pobrać z pamięci RAM lub nawet z pamięci zewnętrznej (z dysku twardego).

Kolejność, w jakiej procesor szuka informacji w pamięci:

W ten sposób Procesor wyszukuje informacje

Aby kontrolować działanie pamięci podręcznej i jej interakcję z jednostkami obliczeniowymi procesora, a także pamięcią RAM, istnieje specjalny kontroler.

Schemat organizacji interakcji rdzenia procesora, pamięci podręcznej i pamięci RAM:

Kontroler pamięci podręcznej jest kluczowym ogniwem pomiędzy procesorem, pamięcią RAM i pamięcią podręczną

Należy zaznaczyć, że buforowanie danych to złożony proces, w którym wykorzystuje się wiele technologii i algorytmów matematycznych. Do podstawowych koncepcji stosowanych w buforowaniu należą metody zapisu w pamięci podręcznej i architektura skojarzeń pamięci podręcznej.

Metody zapisu w pamięci podręcznej

Istnieją dwie główne metody zapisywania informacji w pamięci podręcznej:

  1. Metoda zapisu zwrotnego – dane zapisywane są najpierw do pamięci podręcznej, a następnie, gdy zaistnieją określone warunki, do pamięci RAM.
  2. Metoda zapisu – dane są zapisywane jednocześnie do pamięci RAM i pamięci podręcznej.

Architektura skojarzeń pamięci podręcznej

Architektura skojarzeń pamięci podręcznej definiuje sposób, w jaki dane z pamięci RAM są mapowane do pamięci podręcznej. Główne opcje architektury skojarzeń buforowania to:

  1. Pamięć podręczna mapowana bezpośrednio - określona sekcja pamięci podręcznej odpowiada za określoną sekcję pamięci RAM
  2. W pełni asocjacyjna pamięć podręczna - dowolna część pamięci podręcznej może być powiązana z dowolną częścią pamięci RAM
  3. Mieszana pamięć podręczna (zestaw asocjacyjny)

Różne poziomy pamięci podręcznej mogą zazwyczaj wykorzystywać różne architektury skojarzeń pamięci podręcznej. Buforowanie pamięci RAM mapowanej bezpośrednio jest najszybszą opcją buforowania, dlatego ta architektura jest zwykle używana w przypadku dużych pamięci podręcznych. Z kolei w pełni skojarzeniowa pamięć podręczna ma mniej błędów pamięci podręcznej (chybień).

Wniosek

W tym artykule zapoznałeś się z koncepcją pamięci podręcznej, architekturą pamięci podręcznej i metodami buforowania oraz dowiedziałeś się, jak wpływa to na wydajność współczesnego komputera. Obecność pamięci podręcznej może znacznie zoptymalizować działanie procesora, skrócić jego czas bezczynności, a w konsekwencji zwiększyć wydajność całego systemu.

Wszystkie procesory od końca lat 90. mają wewnętrzną pamięć podręczną (lub po prostu pamięć podręczną). Pamięć podręczna to szybka pamięć, do której przenoszone są instrukcje i dane przetwarzane bezpośrednio przez procesor.

Nowoczesne procesory mają wbudowaną pamięć podręczną dwóch poziomów - pierwszego (L1) i drugiego (L2). Procesor jest nieco szybszy przy zawartości pamięci podręcznej L1, podczas gdy pamięć podręczna L2 jest zwykle nieco większa. Dostęp do pamięci podręcznej jest możliwy bez stanu oczekiwania, tj. Pamięć podręczna poziomu 1 (pamięć podręczna na chipie) działa z szybkością procesora.

Oznacza to, że jeśli dane potrzebne procesorowi znajdują się w pamięci podręcznej, nie występują opóźnienia w przetwarzaniu. W przeciwnym razie procesor musi pobierać dane z pamięci głównej, co znacznie zmniejsza wydajność systemu.

Aby jakościowo zrozumieć zasadę działania pamięci podręcznej obu poziomów, rozważmy jako przykład codzienną sytuację.

Codziennie o tej samej porze przychodzisz do kawiarni na lunch i zawsze siadasz przy tym samym stole. Zawsze zamawiaj standardowy zestaw trzech dań.

Kelner biegnie do kuchni, kucharz kładzie je na tacy, po czym przynoszą zamówienie. I tak, powiedzmy, trzeciego dnia kelner, żeby nie musieć znowu biegać do kuchni, spotyka Cię o wyznaczonej godzinie z gotowym, gorącym obiadem na tacy.

Nie musisz czekać na swoje zamówienie i oszczędzasz mnóstwo czasu. Taca z Twoimi naczyniami to skrytka pierwszego poziomu. Ale czwartego dnia nagle chcesz dodać kolejne danie, powiedzmy deser.

Choć o wyznaczonej godzinie czekała już na Państwa taca z zamówieniem, kelner i tak musiał biec do kuchni na deser.

A na piątym - znowu menu składające się z trzech pozycji. Na szóstym – znowu deser, ale inny niż poprzednie. A kelner, nie wiedząc, jaki deser chcesz zamówić (a nawet nie wiedząc, czy cokolwiek zamówisz), decyduje się na kolejny krok: obok Twojego stołu stawia szafkę z kilkoma rodzajami deserów.

A jeśli wyrazisz chęć, wszystko jest pod ręką, nie musisz biegać do kuchni. Szafka na desery to skrytka drugiego poziomu.

Wydajność procesora w znacznym stopniu zależy od wielkości pamięci podręcznej L1 (od 16 do 128 KB) i L2 (od 64 KB do 512 KB, w Pentium III Heop i AMD Opteron do 4 MB).

Procesory Intel Pentium III i oparte na nim procesory Celeron mają rozmiar pamięci podręcznej L1 wynoszącej 32 KB. Intel Pentium 4, a także oparte na nim wersje Celeron i Cheop, mają tylko 20 KB. Procesory AMD Duron, Athlon (w tym XP/MP) i Opteron, a także VIA SZ zawierają 128 KB pamięci podręcznej L1.

Nowoczesne procesory dwurdzeniowe mają pamięć podręczną pierwszego poziomu dla każdego rdzenia osobno, dlatego czasami w opisie pamięci podręcznej możemy zobaczyć liczbę 128x2. Oznacza to, że każdy rdzeń procesora ma 128 KB pamięci podręcznej L1.

Rozmiar pamięci podręcznej L1 jest ważny dla uzyskania wysokiej wydajności w większości typowych zadań (aplikacje biurowe, gry, większość aplikacji serwerowych itp.). Jego skuteczność jest szczególnie duża w przypadku obliczeń wielowątkowych (na przykład przetwarzania wideo).

Jest to jeden z powodów, dla których Pentium 4 jest stosunkowo nieefektywny w większości typowych zastosowań (chociaż jest to kompensowane przez jego wysoką częstotliwość taktowania). Pamięć podręczna L1 zawsze pracuje (wymienia informacje z rdzeniem procesora) z wewnętrzną częstotliwością procesora.

Natomiast pamięć podręczna L2 w różnych modelach procesorów działa z różnymi częstotliwościami (i odpowiednio wydajnością). Począwszy od Intel Pentium II, wiele procesorów korzystało z pamięci podręcznej L2 działającej z połową wewnętrznej częstotliwości procesora.

Rozwiązanie to zastosowano w przestarzałych procesorach Intel Pentium III (do 550 MHz) i przestarzałym AMD Athlon (w niektórych z nich wewnętrzna pamięć podręczna L2 pracowała z jedną trzecią częstotliwości rdzenia procesora). Rozmiar pamięci podręcznej L2 również różni się w zależności od procesora.

W starszych i niektórych nowszych procesorach Intel Pentium III wielkość pamięci podręcznej L2 wynosi 512 KB, w pozostałych procesorach Pentium III 256 KB. Procesor Intel Celeron oparty na Pentium III był dostępny z 128 i 256 KB pamięci podręcznej L2, podczas gdy procesor oparty na Pentium 4 był dostępny tylko z 128 KB. Różne wersje procesora Intel Pentium 4 z procesorem Xeon mają do 4 MB pamięci podręcznej L2.

Nowe procesory Pentium 4 (niektóre serie o częstotliwości 2000 MHz i wszystkie dla wyższych częstotliwości) mają 512 KB pamięci podręcznej L2, pozostałe Pentium 4 mają 256 KB. Procesory Xeop (oparte na Pentium 4) posiadają 256 lub 512 KB pamięci podręcznej L2.

Ponadto mają także pamięć podręczną L3 trzeciego poziomu. Zintegrowana pamięć podręczna L3 w połączeniu z szybką magistralą systemową tworzy szybki kanał wymiany danych z pamięcią systemową.

Z reguły tylko procesory do rozwiązań serwerowych lub specjalne modele procesorów „do komputerów stacjonarnych” są wyposażone w pamięć podręczną L3. Na przykład linie procesorów, takie jak Xeon DP, Itanium 2 i Xeon MP, mają pamięć podręczną L3.

Procesor AMD Duron ma 128 KB pamięci podręcznej L1 i 64 KB pamięci podręcznej L2. Procesory Athlon (z wyjątkiem najstarszego), Athlon MP i większość wariantów Athlon XP mają 128 KB pamięci podręcznej L1 i 256 KB pamięci podręcznej L2, a najnowszy Athlon XP (2500+, 2800+, 3000+ i wyższe) ma 512 KB pamięci L2 Pamięć podręczna. AMD Opteron zawiera 1 MB pamięci podręcznej L2.

Najnowsze modele procesorów Intel Pentium D, Intel Pentium M, Intel Core 2 Duo dostępne są z 6 MB pamięci podręcznej L2, a Core 2 Quad - 12 MB pamięci podręcznej L2.

Najnowszy procesor Intel Core i7 w momencie pisania tej książki ma 64 KB pamięci podręcznej L1 dla każdego z 4 rdzeni, a także 256 KB pamięci L2 dla każdego rdzenia. Oprócz pamięci podręcznej pierwszego i drugiego poziomu procesor ma także wspólną dla wszystkich rdzeni pamięć podręczną trzeciego poziomu, równą 8 MB.

W przypadku procesorów, które mogą mieć różne rozmiary pamięci podręcznej L2 (lub w przypadku Intel Xeon MP - L3) dla tego samego modelu, wielkość ta musi być wskazana w momencie sprzedaży (oczywiście od tego zależy cena procesora). Jeśli procesor sprzedawany jest w opakowaniu „pudełkowym” (dostawa w pudełku), zwykle jest na nim wskazany rozmiar pamięci podręcznej.

W przypadku normalnych zadań użytkownika (w tym gier) prędkość pamięci podręcznej L2 jest ważniejsza niż jej wielkość; wręcz przeciwnie, w przypadku zadań serwerowych ważniejsza jest głośność. Najbardziej produktywne serwery, zwłaszcza te z dużą ilością pamięci RAM (kilka gigabajtów), wymagają maksymalnego rozmiaru i maksymalnej szybkości pamięci podręcznej L2.

Wersje Cheop procesorów Pentium III pozostają pod tymi parametrami niedoścignione. (Procesor Xeon MP w dalszym ciągu okazuje się bardziej produktywny w zadaniach serwerowych niż Pentium III Xeon, ze względu na wyższą częstotliwość taktowania samego procesora i szyny pamięci.) Z powyższego wnioskujemy: pamięć podręczna poprawia interakcję między szybki procesor i wolniejszą pamięć RAM, a także pozwala zminimalizować okresy oczekiwania występujące podczas przetwarzania danych. Decydującą rolę odgrywa w tym pamięć podręczna L2 umieszczona na chipie procesora.

Jednym z ważnych czynników zwiększających wydajność procesora jest obecność pamięci podręcznej, a raczej jej objętość, szybkość dostępu i dystrybucja między poziomami.

Od dłuższego czasu prawie wszystkie procesory są wyposażone w tego typu pamięć, co po raz kolejny potwierdza przydatność jej obecności. W tym artykule porozmawiamy o strukturze, poziomach i praktycznym przeznaczeniu pamięci podręcznej, co jest bardzo ważne. charakterystyka procesora.

Co to jest pamięć podręczna i jej struktura

Pamięć podręczna to ultraszybka pamięć używana przez procesor do tymczasowego przechowywania najczęściej używanych danych. Tak w skrócie można opisać ten typ pamięci.

Pamięć podręczna zbudowana jest na przerzutnikach, które z kolei składają się z tranzystorów. Grupa tranzystorów zajmuje znacznie więcej miejsca niż te same kondensatory, które ją tworzą Baran. Pociąga to za sobą wiele trudności w produkcji, a także ograniczenia wolumenowe. Dlatego pamięć podręczna jest pamięcią bardzo kosztowną, a jednocześnie ma znikome wolumeny. Ale z tej struktury wynika główna zaleta takiej pamięci - szybkość. Ponieważ przerzutniki nie wymagają regeneracji, a czas opóźnienia bramki, na której są zamontowane, jest niewielki, czas na przełączenie przerzutnika z jednego stanu do drugiego następuje bardzo szybko. Dzięki temu pamięć podręczna może działać z tymi samymi częstotliwościami, co nowoczesne procesory.

Ważnym czynnikiem jest także umiejscowienie pamięci podręcznej. Znajduje się on na samym chipie procesora, co znacznie skraca czas dostępu. Wcześniej pamięć podręczna niektórych poziomów znajdowała się poza chipem procesora, na specjalnym chipie SRAM gdzieś na płycie głównej. Obecnie prawie wszystkie procesory mają pamięć podręczną umieszczoną w chipie procesora.


Do czego służy pamięć podręczna procesora?

Jak wspomniano powyżej, głównym celem pamięci podręcznej jest przechowywanie danych często używanych przez procesor. Pamięć podręczna jest buforem, do którego ładowane są dane i mimo niewielkich rozmiarów (ok. 4-16 MB) nowoczesne procesory zapewnia znaczny wzrost wydajności w każdej aplikacji.

Aby lepiej zrozumieć potrzebę pamięci podręcznej, wyobraźmy sobie organizację pamięci komputera jak w biurze. Pamięć RAM będzie szafką zawierającą foldery, do których księgowy okresowo uzyskuje dostęp w celu pobrania dużych bloków danych (tj. folderów). A stół będzie pamięcią podręczną.

Na biurku księgowego trafiają elementy, do których wraca on kilkukrotnie w ciągu godziny. Mogą to być na przykład numery telefonów, przykłady dokumentów. Tego typu informacje znajdują się bezpośrednio na stole, co z kolei zwiększa szybkość dostępu do nich.

W ten sam sposób można dodać dane z dużych bloków danych (folderów) do tabeli w celu szybkiego wykorzystania, na przykład dokumentu. Gdy dokument ten nie jest już potrzebny, jest on umieszczany z powrotem w szafce (do pamięci RAM), w ten sposób czyszcząc tabelę (pamięć podręczną) i zwalniając tę ​​tabelę na nowe dokumenty, które będą używane w następnym okresie.

Również w przypadku pamięci podręcznej, jeśli są jakieś dane, do których najprawdopodobniej będzie można ponownie uzyskać dostęp, dane z pamięci RAM są ładowane do pamięci podręcznej. Bardzo często dzieje się to poprzez wspólne ładowanie danych, które najprawdopodobniej zostaną użyte po danych bieżących. Oznacza to, że istnieją założenia dotyczące tego, co zostanie użyte „po”. Są to złożone zasady działania.

Poziomy pamięci podręcznej procesora

Nowoczesne procesory są wyposażone w pamięć podręczną, która często składa się z 2 lub 3 poziomów. Oczywiście są wyjątki, ale często tak się dzieje.

Ogólnie rzecz biorąc, mogą istnieć następujące poziomy: L1 (pierwszy poziom), L2 (drugi poziom), L3 (trzeci poziom). Teraz trochę więcej szczegółów na temat każdego z nich:

Pamięć podręczna pierwszego poziomu (L1)– najszybszy poziom pamięci podręcznej, który współpracuje bezpośrednio z rdzeniem procesora, dzięki tej ścisłej interakcji poziom ten ma najkrótszy czas dostępu i działa na częstotliwościach bliskich procesorowi. Jest to bufor pomiędzy procesorem a pamięcią podręczną drugiego poziomu.

Rozważymy wolumeny na wysokowydajnym procesorze Intel Core i7-3770K. Procesor ten jest wyposażony w 4x32 KB pamięci podręcznej L1 4 x 32 KB = 128 KB. (32 KB na rdzeń)

Pamięć podręczna drugiego poziomu (L2)– drugi poziom ma większą skalę niż pierwszy, ale w rezultacie ma niższą „charakterystykę prędkości”. W związku z tym służy jako bufor pomiędzy poziomami L1 i L3. Jeśli ponownie spojrzymy na nasz przykład Core i7-3770 K, wówczas rozmiar pamięci podręcznej L2 wynosi 4x256 KB = 1 MB.

Pamięć podręczna poziomu 3 (L3)– trzeci poziom znów jest wolniejszy niż dwa poprzednie. Ale nadal jest znacznie szybszy niż pamięć RAM. Rozmiar pamięci podręcznej L3 w i7-3770K wynosi 8 MB. Jeśli poprzednie dwa poziomy są wspólne dla każdego rdzenia, wówczas poziom ten jest wspólny dla całego procesora. Wskaźnik jest dość solidny, ale nie wygórowany. Ponieważ na przykład dla procesorów z serii Extreme, takich jak i7-3960X, jest to 15 MB, a dla niektórych nowych procesorów Xeon ponad 20.

W ciągu ostatnich kilku lat procesory komputerowe poczyniły znaczące postępy w rozwoju. Rozmiar tranzystorów maleje z roku na rok, a wydajność rośnie. Jednocześnie prawo Moore'a nie ma już znaczenia. Jeśli chodzi o wydajność procesora, należy wziąć pod uwagę nie tylko liczbę tranzystorów i częstotliwość, ale także rozmiar pamięci podręcznej.

Być może słyszałeś już o pamięci podręcznej podczas wyszukiwania informacji o procesorach. Zwykle jednak nie przywiązujemy do tych liczb dużej uwagi, nie wyróżniają się one nawet zbytnio w reklamach procesorów. Zastanówmy się, na co wpływa pamięć podręczna procesora, jakie są rodzaje pamięci podręcznej i jak to wszystko działa.

Mówiąc najprościej, pamięć podręczna procesora to po prostu bardzo szybka pamięć. Jak już wiesz, komputer ma kilka rodzajów pamięci. Jest to pamięć trwała, która służy do przechowywania danych, systemu operacyjnego i programów, np. dysk SSD lub dysk twardy. Komputer korzysta również z pamięci RAM. Jest to pamięć o dostępie swobodnym, która działa znacznie szybciej w porównaniu do pamięci trwałej. Wreszcie, procesor ma jeszcze szybsze bloki pamięci, które łącznie nazywane są pamięciami podręcznymi.

Jeśli pomyślimy o pamięci komputera jako o hierarchii opartej na jej szybkości, pamięć podręczna będzie znajdować się na szczycie tej hierarchii. Ponadto jest najbliżej rdzeni obliczeniowych, ponieważ jest częścią procesora.

Pamięć podręczna procesora jest pamięcią statyczną (SRAM) i ma na celu przyspieszenie pracy z pamięcią RAM. W przeciwieństwie do dynamicznej pamięci o dostępie swobodnym (DRAM) może przechowywać dane bez ciągłego ich aktualizowania.

Jak działa pamięć podręczna procesora?

Jak być może już wiesz, program to zestaw instrukcji wykonywanych przez procesor. Kiedy uruchamiasz program, komputer musi przesłać te instrukcje z pamięci stałej do procesora. W tym miejscu wchodzi w grę hierarchia pamięci. Najpierw dane są ładowane do pamięci RAM, a następnie przesyłane do procesora.

Obecnie procesor może przetwarzać ogromną liczbę instrukcji na sekundę. Aby w pełni wykorzystać swoje możliwości, procesor potrzebuje superszybkiej pamięci. Dlatego opracowano pamięć podręczną.

Kontroler pamięci procesora pobiera dane z pamięci RAM i wysyła je do pamięci podręcznej. W zależności od procesora użytego w systemie kontroler ten może znajdować się na mostku północnym płyty głównej lub w samym procesorze. W pamięci podręcznej przechowywane są także wyniki wykonywania instrukcji w procesorze. Ponadto sama pamięć podręczna procesora ma również własną hierarchię.

Poziomy pamięci podręcznej procesora - L1, L2 i L3

Pamięć podręczna procesora jest podzielona na trzy poziomy: L1, L2 i L3. Hierarchia ta opiera się również na szybkości pamięci podręcznej, a także na jej rozmiarze.

  • Pamięć podręczna L1 (pamięć podręczna pierwszego poziomu)- Jest to najszybszy typ pamięci podręcznej w procesorze. Jeśli chodzi o priorytet dostępu, ta pamięć podręczna zawiera dane, których program może potrzebować do wykonania określonej instrukcji;
  • Pamięć podręczna L2 (pamięć podręczna drugiego poziomu procesora)- wolniejszy w porównaniu do L1, ale większy. Jego objętość może wynosić od 256 kilobajtów do ośmiu megabajtów. Pamięć podręczna L2 zawiera dane, których procesor może potrzebować w przyszłości. Większość nowoczesnych procesorów ma pamięć podręczną L1 i L2 na samych rdzeniach procesora, przy czym każdy rdzeń ma własną pamięć podręczną;
  • Pamięć podręczna L3 (pamięć podręczna trzeciego poziomu)- jest to największa i najwolniejsza pamięć podręczna. Jego rozmiar może wynosić od 4 do 50 megabajtów. W nowoczesnych procesorach na chipie przydzielona jest osobna przestrzeń na pamięć podręczną L3.

W tej chwili są to wszystkie poziomy pamięci podręcznej procesora; Intel próbował utworzyć pamięć podręczną L4, jednak ta technologia jeszcze się nie zakorzeniła.

Do czego służy pamięć podręczna w procesorze?

Czas odpowiedzieć na główne pytanie tego artykułu: na co wpływa pamięć podręczna procesora? Dane przepływają z pamięci RAM do pamięci podręcznej L3, następnie do L2, a następnie do L1. Kiedy procesor potrzebuje danych do wykonania operacji, próbuje je znaleźć w pamięci podręcznej L1 i jeśli je znajdzie, wówczas taką sytuację nazywa się trafieniem w pamięć podręczną. W przeciwnym razie wyszukiwanie będzie kontynuowane w pamięciach podręcznych L2 i L3. Jeśli nadal nie można znaleźć danych, do pamięci RAM wysyłane jest żądanie.

Wiemy już, że pamięć podręczna ma na celu przyspieszenie przesyłania informacji między pamięcią RAM a procesorem. Czas potrzebny na pobranie danych z pamięci nazywany jest opóźnieniem. Pamięć podręczna L1 ma najniższe opóźnienia, więc jest najszybsza, a pamięć podręczna L3 ma najwyższą. Gdy w pamięci podręcznej nie ma danych, opóźnienia są jeszcze większe, ponieważ procesor musi uzyskać dostęp do pamięci.

Wcześniej przy projektowaniu procesorów pamięci podręczne L2 i L3 były przenoszone na zewnątrz procesora, co prowadziło do dużych opóźnień. Jednak ograniczenie procesu produkcyjnego stosowanego do produkcji procesorów pozwala na umieszczenie miliardów tranzystorów na znacznie mniejszej przestrzeni niż dotychczas. W rezultacie zwalnia się miejsce, aby umieścić pamięć podręczną jak najbliżej rdzeni, co jeszcze bardziej zmniejsza opóźnienia.

Jak pamięć podręczna wpływa na wydajność?

Wpływ pamięci podręcznej na wydajność komputera zależy bezpośrednio od jego wydajności i liczby trafień w pamięci podręcznej. Sytuacje, w których w pamięci podręcznej nie ma danych, znacznie zmniejszają ogólną wydajność.

Wyobraź sobie, że procesor ładuje dane z pamięci podręcznej L1 100 razy z rzędu. Jeśli współczynnik trafień w pamięci podręcznej wynosi 100%, pobranie tych danych zajmie procesorowi 100 nanosekund. Jednak gdy tylko współczynnik trafień spadnie do 99%, procesor będzie musiał pobrać dane z pamięci podręcznej L2, a opóźnienie wynosi już 10 nanosekund. Wynik to 99 nanosekund na 99 żądań i 10 nanosekund na 1 żądanie. Dlatego zmniejszenie procentu trafień w pamięci podręcznej o 1% zmniejsza wydajność procesora o 10%.

W czasie rzeczywistym współczynnik trafień w pamięci podręcznej wynosi od 95 do 97%. Ale jak rozumiesz, różnica w wynikach między tymi wskaźnikami nie wynosi 2%, ale 14%. Należy pamiętać, że w przykładzie zakładamy, że wybaczone dane zawsze znajdują się w pamięci podręcznej L2, w prawdziwym życiu dane mogą zostać usunięte z pamięci podręcznej, co oznacza, że ​​będą musiały zostać pobrane z pamięci RAM, która ma opóźnienie 80- 120 nanosekund. Tutaj różnica między 95 a 97 procent jest jeszcze bardziej znacząca.

Słaba wydajność pamięci podręcznej w procesorach AMD Bulldozer i Piledriver była jednym z głównych powodów, dla których przegrały one z procesorami Intela. W tych procesorach pamięć podręczna L1 była współdzielona pomiędzy kilka rdzeni, co czyniło ją bardzo nieefektywną. Nowoczesne procesory Ryzen nie mają tego problemu.

Możemy stwierdzić, że im większa pamięć podręczna, tym wyższa wydajność, ponieważ procesor będzie w stanie szybciej uzyskać potrzebne dane w większej liczbie przypadków. Warto jednak zwrócić uwagę nie tylko na wielkość pamięci podręcznej procesora, ale także na jego architekturę.

wnioski

Teraz wiesz, za co odpowiedzialna jest pamięć podręczna procesora i jak działa. Projekt pamięci podręcznej stale się rozwija, a pamięć staje się szybsza i tańsza. AMD i Intel przeprowadziły już wiele eksperymentów z pamięcią podręczną, a Intel próbował nawet użyć pamięci podręcznej L4. Rynek procesorów rośnie szybciej niż kiedykolwiek. Architektura pamięci podręcznej dotrzyma kroku stale rosnącej mocy procesorów.

Ponadto wiele się robi, aby wyeliminować wąskie gardła, jakie mają współczesne komputery. Zmniejszanie opóźnień pamięci jest jedną z najważniejszych części tej pracy. Przyszłość wygląda bardzo obiecująco.

Powiązane posty.

Prawie wszyscy programiści wiedzą, że pamięć podręczna procesora to mała, ale szybka pamięć, w której przechowywane są dane z ostatnio odwiedzanych obszarów pamięci - definicja jest krótka i dość dokładna. Jednak znajomość nudnych szczegółów na temat mechanizmów pamięci podręcznej jest konieczna, aby zrozumieć czynniki wpływające na wydajność kodu.

W tym artykule przyjrzymy się szeregowi przykładów ilustrujących różne cechy pamięci podręcznych i ich wpływ na wydajność. Przykłady będą w języku C#, wybór języka i platformy nie wpływa znacząco na ocenę wydajności i wnioski końcowe. Naturalnie, w rozsądnych granicach, jeśli wybierzesz język, w którym odczytanie wartości z tablicy jest równoznaczne z dostępem do tablicy mieszającej, nie otrzymasz żadnych możliwych do zinterpretowania wyników. Przypisy tłumacza pisane są kursywą.

Habracut - - -

Przykład 1: Dostęp do pamięci i wydajność

Jak myślisz, o ile szybszy jest drugi cykl niż pierwszy?
int arr = nowy int;

// Pierwszy
for (int i = 0; tj< arr.Length; i++) arr[i] *= 3;

// drugi
for (int i = 0; tj< arr.Length; i += 16) arr[i] *= 3;


Pierwsza pętla mnoży wszystkie wartości w tablicy przez 3, druga pętla mnoży tylko co szesnastą wartość. Drugi cykl kończy się dopiero 6% pracy pierwszy cykl, ale na nowoczesnych maszynach oba cykle wykonywane są w przybliżeniu w równym czasie: 80 ms I 78 ms odpowiednio (na moim komputerze).

Rozwiązanie jest proste - dostęp do pamięci. Szybkość tych pętli zależy przede wszystkim od szybkości podsystemu pamięci, a nie od szybkości mnożenia liczb całkowitych. Jak zobaczymy w następnym przykładzie, liczba dostępów do pamięci RAM jest taka sama zarówno w pierwszym, jak i drugim przypadku.

Przykład 2: Wpływ linii pamięci podręcznej

Zagłębmy się w szczegóły i wypróbujmy inne wartości kroków, a nie tylko 1 i 16:
for (int i = 0; tj< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

Oto czasy działania tej pętli dla różnych wartości kroku K:

Należy pamiętać, że przy wartościach kroku od 1 do 16 czas pracy pozostaje praktycznie niezmieniony. Ale przy wartościach większych niż 16 czas działania zmniejsza się o około połowę za każdym razem, gdy podwajamy krok. Nie oznacza to, że pętla w magiczny sposób zacznie działać szybciej, po prostu liczba iteracji również maleje. Kluczową kwestią jest ten sam czas pracy z wartościami kroków od 1 do 16.

Powodem tego jest to, że nowoczesne procesory nie uzyskują dostępu do pamięci po bajcie, ale raczej w małych blokach zwanych liniami pamięci podręcznej. Zwykle rozmiar ciągu wynosi 64 bajty. Kiedy czytasz jakąkolwiek wartość z pamięci, co najmniej jedna linia pamięci podręcznej trafia do pamięci podręcznej. Późniejszy dostęp do dowolnej wartości z tego wiersza jest bardzo szybki.

Ponieważ 16 wartości int zajmuje 64 bajty, pętle z krokami od 1 do 16 uzyskują dostęp do tej samej liczby linii pamięci podręcznej, a dokładniej do wszystkich linii pamięci podręcznej tablicy. W kroku 32 dostęp następuje do co drugiej linii, w kroku 64 do co czwartej.

Zrozumienie tego jest bardzo ważne w przypadku niektórych technik optymalizacji. Liczba dostępów do niego zależy od lokalizacji danych w pamięci. Na przykład niewyrównane dane mogą wymagać dwóch dostępów do pamięci głównej zamiast jednego. Jak dowiedzieliśmy się powyżej, prędkość robocza będzie dwukrotnie niższa.

Przykład 3: Rozmiary pamięci podręcznej poziomu 1 i 2 (L1 i L2)

Nowoczesne procesory mają zazwyczaj dwa lub trzy poziomy pamięci podręcznej, zwykle nazywane L1, L2 i L3. Aby sprawdzić rozmiary pamięci podręcznych na różnych poziomach, możesz użyć narzędzia CoreInfo lub funkcji API systemu Windows GetLogicalProcessorInfo. Obie metody dostarczają również informacji o rozmiarze linii pamięci podręcznej dla każdego poziomu.

Na moim komputerze CoreInfo zgłasza 32 KB pamięci podręcznej danych L1, 32 KB pamięci podręcznej instrukcji L1 i 4 MB pamięci podręcznej danych L2. Każdy rdzeń ma własne osobiste pamięci podręczne L1, pamięci podręczne L2 są współdzielone przez każdą parę rdzeni:

Mapa procesora logicznego do pamięci podręcznej: *--- Pamięć podręczna danych 0, poziom 1, 32 KB, Assoc 8, Rozmiar linii 64 *--- Pamięć podręczna instrukcji 0, poziom 1, 32 KB, Assoc 8, Rozmiar linii 64 -*-- Pamięć podręczna danych 1, poziom 1, 32 KB, Assoc 8, LineSize 64 -*-- Instrukcja Cache 1, poziom 1, 32 KB, Assoc 8, LineSize 64 **-- Unified Cache 0, poziom 2, 4 MB, Assoc 16, LineSize 64 --*- Pamięć podręczna danych 2, poziom 1, 32 KB, Assoc 8, rozmiar linii 64 --*- Pamięć podręczna instrukcji 2, poziom 1, 32 KB, Assoc 8, rozmiar linii 64 ---* Pamięć podręczna danych 3, poziom 1, 32 KB, Assoc 8, LineSize 64 ---* Instrukcja Cache 3, poziom 1, 32 KB, Assoc 8, LineSize 64 --** Unified Cache 1, poziom 2, 4 MB, Assoc 16, LineSize 64
Sprawdźmy tę informację eksperymentalnie. Aby to zrobić, przejrzyjmy naszą tablicę, zwiększając co 16 wartość – łatwy sposób na zmianę danych w każdej linii pamięci podręcznej. Kiedy dotrzemy do końca, wracamy do początku. Sprawdźmy różne rozmiary tablic; powinniśmy zauważyć spadek wydajności, gdy tablica nie mieści się już w pamięciach podręcznych o różnych poziomach.

Kod to:

int kroki = 64 * 1024 * 1024; // liczba iteracji
int długośćMod = arr.Length - 1; // rozmiar tablicy -- potęga dwójki

for (int i = 0; tj< steps; i++)
{
// x & długośćMod = x % arr.Length, ponieważ potęgi dwójki
arr[(i * 16) & długośćMod]++;
}


Wyniki testu:

Na moim komputerze zauważalne są spadki wydajności po 32 KB i 4 MB - są to rozmiary pamięci podręcznych L1 i L2.

Przykład 4: Równoległość instrukcji

Teraz spójrzmy na coś innego. Twoim zdaniem, która z tych dwóch pętli wykona się szybciej?
int kroki = 256 * 1024 * 1024;
int a = nowy int;

// Pierwszy
for (int i = 0; tj< steps; i++) { a++; a++; }

// drugi
for (int i = 0; tj< steps; i++) { a++; a++; }


Okazuje się, że druga pętla działa niemal dwukrotnie szybciej, przynajmniej na wszystkich testowanych przeze mnie maszynach. Dlaczego? Ponieważ polecenia wewnątrz pętli mają różne zależności danych. Pierwsze polecenia mają następujący łańcuch zależności:

W drugim cyklu zależności są następujące:

Części funkcjonalne nowoczesnych procesorów są w stanie wykonywać jednocześnie pewną liczbę określonych operacji, zwykle niezbyt dużą. Przykładowo możliwy jest równoległy dostęp do danych z pamięci podręcznej L1 pod dwoma adresami, a także jednoczesne wykonywanie dwóch prostych instrukcji arytmetycznych. W pierwszym cyklu procesor nie może wykorzystać tych możliwości, ale w drugim już tak.

Przykład 5: Powiązanie pamięci podręcznej

Jednym z kluczowych pytań, na które należy odpowiedzieć projektując pamięć podręczną, jest to, czy dane z określonego obszaru pamięci można przechowywać w dowolnych komórkach pamięci podręcznej, czy tylko w niektórych z nich. Trzy możliwe rozwiązania:
  1. Bezpośrednia pamięć podręczna mapowania,Dane każdej linii pamięci podręcznej w pamięci RAM są przechowywane tylko w jednej, predefiniowanej lokalizacji pamięci podręcznej. Najprostszy sposób obliczenia mapowania to: indeks_wiersza_w_pamięci % liczba_komórek_pamięci_cache. Dwie linie odwzorowane na tę samą komórkę nie mogą znajdować się w pamięci podręcznej w tym samym czasie.
  2. Pamięć podręczna częściowo skojarzeniowa z N wpisami, każda linia może być przechowywana w N różnych lokalizacjach pamięci podręcznej. Na przykład w pamięci podręcznej z 16 wpisami wiersz może być przechowywany w jednej z 16 komórek tworzących grupę. Zwykle wiersze z równymi najmniej znaczącymi bitami indeksów dzielą jedną grupę.
  3. W pełni skojarzeniowa pamięć podręczna, dowolna linia może być przechowywana w dowolnej lokalizacji pamięci podręcznej. Rozwiązanie jest w swoim zachowaniu równoważne tabeli mieszającej.
Pamięci podręczne mapowane bezpośrednio są podatne na rywalizację, na przykład gdy dwa wiersze konkurują o tę samą komórkę, naprzemiennie wykluczają się z pamięci podręcznej, wydajność jest bardzo niska. Z drugiej strony, w pełni asocjacyjne pamięci podręczne, choć pozbawione tej wady, są bardzo złożone i kosztowne w implementacji. Częściowo asocjacyjne pamięci podręczne stanowią typowy kompromis pomiędzy złożonością implementacji a wydajnością.

Na przykład na moim komputerze pamięć podręczna L2 o wielkości 4 MB to 16-wejściowa pamięć podręczna częściowo skojarzona. Cała pamięć RAM jest podzielona na zestawy linii według najmniej znaczących bitów ich indeksów, linie z każdego zestawu konkurują o jedną grupę 16 komórek pamięci podręcznej L2.

Ponieważ pamięć podręczna L2 ma 65 536 komórek (4 * 2 20/64), a każda grupa składa się z 16 komórek, mamy w sumie 4096 grup. Zatem dolne 12 bitów indeksu wiersza określa, do której grupy należy ten wiersz (2 12 = 4096). W rezultacie wiersze z adresami będącymi wielokrotnościami 262 144 (4096 * 64) dzielą tę samą grupę 16 komórek i konkurują w niej o miejsce.

Aby efekty skojarzeń zadziałały, musimy stale uzyskiwać dostęp do dużej liczby wierszy z tej samej grupy, na przykład za pomocą następującego kodu:

public static long UpdateEveryKthByte (bajt arr, int K)
{
stała int rep = 1024 * 1024; // liczba iteracji

Stoper sw = Stoper.StartNew();

int p = 0;
for (int i = 0; tj< rep; i++)
{
arr[p]++;

P += K; if (p >= długość tablicy) p = 0;
}

Przeł.Stop();
return sw.ElapsedMillisekundy;
}


Metoda zwiększa każdy K-ty element tablicy. Kiedy dotrzemy do końca, zaczynamy od nowa. Po dość dużej liczbie iteracji (2 20) zatrzymujemy się. Zrobiłem przebiegi dla różnych rozmiarów tablic i wartości kroku K. Wyniki (niebieski – długi czas działania, biały – krótki):

Niebieskie obszary odpowiadają przypadkom, gdy przy ciągłych zmianach danych pamięć podręczna nie jest w stanie pomieścić wszystkie potrzebne dane na raz. Jasnoniebieski kolor oznacza czas działania około 80 ms, prawie biały - 10 ms.

Zajmijmy się niebieskimi obszarami:

  1. Dlaczego pojawiają się pionowe linie? Pionowe linie odpowiadają wartościom kroków, przy których uzyskuje się dostęp do zbyt wielu wierszy (więcej niż 16) z jednej grupy. W przypadku tych wartości 16-wpisowa pamięć podręczna mojego komputera nie może pomieścić wszystkich niezbędnych danych.

    Niektóre z nieprawidłowych wartości kroków to potęgi dwójki: 256 i 512. Weźmy na przykład krok 512 i tablicę 8 MB. W tym kroku w tablicy znajdują się 32 sekcje (8 * 2 20 / 262 144), które konkurują ze sobą o komórki w 512 grupach pamięci podręcznej (262 144 / 512). Są 32 sekcje, ale w pamięci podręcznej jest tylko 16 komórek dla każdej grupy, więc nie ma wystarczającej ilości miejsca dla wszystkich.

    Inne wartości kroków, które nie są potęgami dwójki, są po prostu pechowe, co powoduje dużą liczbę trafień do tych samych grup pamięci podręcznej, a także prowadzi do pojawienia się na rysunku pionowych niebieskich linii. W tym miejscu miłośnicy teorii liczb proszeni są o zastanowienie się.

  2. Dlaczego pionowe linie pękają na granicy 4 MB? Gdy rozmiar tablicy wynosi 4 MB lub mniej, 16-wpisowa pamięć podręczna zachowuje się jak w pełni asocjacyjna pamięć podręczna, to znaczy może pomieścić wszystkie dane w tablicy bez konfliktów. Nie więcej niż 16 obszarów walczy o jedną grupę pamięci podręcznej (262 144 * 16 = 4 * 2 20 = 4 MB).
  3. Dlaczego w lewym górnym rogu znajduje się duży niebieski trójkąt? Ponieważ przy małym kroku i dużej tablicy pamięć podręczna nie jest w stanie zmieścić wszystkich niezbędnych danych. Stopień asocjatywności pamięci podręcznej odgrywa tu drugorzędną rolę, ograniczenie związane jest z wielkością pamięci podręcznej L2.

    Na przykład przy rozmiarze tablicy 16 MB i kroku 128 uzyskujemy dostęp do co 128 bajtu, modyfikując w ten sposób co drugą linię pamięci podręcznej tablicy. Aby przechowywać co drugą linię w pamięci podręcznej, potrzebujesz 8 MB pamięci podręcznej, ale na moim komputerze mam tylko 4 MB.

    Nawet gdyby pamięć podręczna była w pełni skojarzeniowa, nie pozwoliłaby na przechowywanie w niej 8 MB danych. Należy zauważyć, że w omawianym już przykładzie z krokiem 512 i rozmiarem tablicy 8 MB potrzebujemy tylko 1 MB pamięci podręcznej do przechowywania wszystkich niezbędnych danych, ale jest to niemożliwe ze względu na niewystarczającą asocjatywność pamięci podręcznej.

  4. Dlaczego lewa strona trójkąta stopniowo zyskuje na intensywności? Maksymalna intensywność występuje przy wartości kroku wynoszącej 64 bajty, która jest równa rozmiarowi linii pamięci podręcznej. Jak widzieliśmy w pierwszym i drugim przykładzie, sekwencyjny dostęp do tego samego wiersza nie kosztuje prawie nic. Powiedzmy, że z krokiem 16 bajtów mamy cztery dostępy do pamięci w cenie jednego.

    Ponieważ liczba iteracji jest taka sama w naszym teście dla dowolnej wartości kroku, tańszy krok skutkuje krótszym czasem wykonania.

Odkryte efekty utrzymują się przy dużych wartościach parametrów:

Łączność pamięci podręcznej to interesująca rzecz, która może objawiać się w pewnych warunkach. W przeciwieństwie do innych problemów omówionych w tym artykule, nie jest on tak poważny. Na pewno nie jest to coś, co wymaga ciągłej uwagi podczas pisania programów.

Przykład 6: Fałszywe partycjonowanie pamięci podręcznej

Na maszynach wielordzeniowych możesz napotkać inny problem - spójność pamięci podręcznej. Rdzenie procesorów mają częściowo lub całkowicie oddzielne pamięci podręczne. Na moim komputerze pamięci podręczne L1 są oddzielne (jak zwykle) i są też dwie pamięci podręczne L2 współdzielone przez każdą parę rdzeni. Szczegóły mogą się różnić, ale ogólnie rzecz biorąc, nowoczesne procesory wielordzeniowe mają wielopoziomową hierarchiczną pamięć podręczną. Co więcej, najszybsze, ale i najmniejsze pamięci podręczne należą do poszczególnych rdzeni.

Kiedy jeden rdzeń modyfikuje wartość w swojej pamięci podręcznej, inne rdzenie nie mogą już używać starej wartości. Wartość w pamięci podręcznej innych rdzeni musi zostać zaktualizowana. Co więcej, należy zaktualizować cała linia pamięci podręcznej, ponieważ pamięci podręczne działają na danych na poziomie wiersza.

Zademonstrujmy ten problem za pomocą następującego kodu:

prywatny statyczny int s_counter = nowy int;

prywatny nieważny licznik aktualizacji (pozycja int)
{
for (int j = 0; j< 100000000; j++)
{
s_licznik = s_licznik + 3;
}
}


Jeśli na mojej czterordzeniowej maszynie wywołam tę metodę z parametrami 0, 1, 2, 3 jednocześnie z czterech wątków, to czas działania wyniesie 4,3 sekundy. Ale jeśli wywołam metodę z parametrami 16, 32, 48, 64, to czas działania będzie wynosił tylko 0,28 sekundy.

Dlaczego? W pierwszym przypadku wszystkie cztery wartości przetwarzane przez wątki w danym momencie prawdopodobnie wylądują w jednej linii pamięci podręcznej. Za każdym razem, gdy jeden rdzeń zwiększa wartość, oznacza komórki pamięci podręcznej zawierające tę wartość w innych rdzeniach jako nieprawidłowe. Po tej operacji wszystkie pozostałe jądra będą musiały ponownie buforować linię. To sprawia, że ​​mechanizm buforowania nie działa, co obniża wydajność.

Przykład 7: Złożoność sprzętu

Nawet teraz, gdy zasady działania pamięci podręcznej nie są dla Ciebie tajemnicą, sprzęt wciąż będzie sprawiał Ci niespodzianki. Procesory różnią się między sobą metodami optymalizacji, heurystyką i innymi subtelnościami implementacyjnymi.

Pamięć podręczna L1 niektórych procesorów może uzyskać dostęp do dwóch komórek równolegle, jeśli należą one do różnych grup, ale jeśli należą do tej samej grupy, tylko sekwencyjnie. O ile mi wiadomo, niektórzy mogą nawet uzyskać równoległy dostęp do różnych części tej samej komórki.

Procesory mogą zaskoczyć Cię sprytnymi optymalizacjami. Przykładowo, kod z poprzedniego przykładu dotyczący fałszywego udostępniania pamięci podręcznej nie działa na moim domowym komputerze zgodnie z przeznaczeniem – w najprostszych przypadkach procesor potrafi zoptymalizować pracę i ograniczyć negatywne skutki. Jeśli trochę zmodyfikujesz kod, wszystko ułoży się na swoim miejscu.

Oto kolejny przykład dziwnych dziwactw sprzętowych:

prywatny statyczny int A, B, C, D, E, F, G;

prywatna statyczna nieważność Dziwność()
{
for (int i = 0; tj< 200000000; i++)
{
<какой-то код>
}
}


Jeśli zamiast tego<какой-то код>Zastąp trzy różne opcje, aby uzyskać następujące wyniki:

Zwiększanie pól A, B, C, D trwa dłużej niż zwiększanie pól A, C, E, G. Jeszcze dziwniejsze jest to, że zwiększanie pól A i C trwa dłużej niż pól A, C I E, G. Nie wiem dokładnie, jakie są tego przyczyny, ale być może są one związane z bankami pamięci ( tak, tak, ze zwykłymi trzylitrowymi bankami pamięci oszczędnościowej, a nie tym, o czym myślałeś). Jeśli masz jakieś przemyślenia na ten temat, prosimy o wypowiedzenie się w komentarzach.

Na moim komputerze nie obserwuje się powyższego, jednak czasami występują wyjątkowo złe wyniki - najprawdopodobniej harmonogram zadań wprowadza własne „korekty”.

Lekcja, jaką można wyciągnąć z tego przykładu, jest taka, że ​​bardzo trudno jest całkowicie przewidzieć zachowanie sprzętu. Tak, Móc dużo przewidzieć, ale trzeba stale potwierdzać swoje przewidywania poprzez pomiary i testy.

Wniosek

Mam nadzieję, że wszystko omówione powyżej pomogło ci zrozumieć konstrukcję pamięci podręcznej procesora. Teraz możesz zastosować tę wiedzę w praktyce, aby zoptymalizować swój kod.