Dlaczego rozmiar pamięci podręcznej L1 jest mniejszy niż w przypadku pamięci podręcznej l2 w większości procesorów?

Dlaczego rozmiar pamięci podręcznej L1 jest mniejszy niż rozmiar pamięci podręcznej l2 w większości procesorów?

Author: Peter Cordes, 2011-01-12

7 answers

Są ku temu różne powody.

L2 istnieje w systemie, aby przyspieszyć przypadek, w którym brakuje pamięci podręcznej L1. Jeśli rozmiar L1 był taki sam lub większy niż L2, to L2 nie mógł pomieścić większej liczby linii pamięci podręcznej niż L1 i nie byłby w stanie poradzić sobie z brakami pamięci podręcznej L1. Z punktu widzenia projektu/kosztów, pamięć podręczna L1 jest związana z procesorem i szybsza niż L2. Cała idea pamięci podręcznej polega na tym, że przyspieszasz dostęp do wolniejszego sprzętu, dodając pośredni sprzęt, który jest bardziej wydajny (i drogi) niż najwolniejszy sprzęt, a jednocześnie tańszy niż szybszy sprzęt, który masz. Nawet jeśli zdecydujesz się podwoić pamięć podręczną L1, możesz również zwiększyć L2, aby przyspieszyć chybienia pamięci podręcznej L1.

Więc dlaczego w ogóle jest L2 cache? Cóż, pamięć podręczna L1 jest zwykle bardziej wydajna i kosztowna w budowie i jest związana z pojedynczym rdzeniem. Oznacza to, że zwiększenie rozmiaru L1 o stałą ilość spowoduje pomnożenie tego kosztu przez 4 w procesorze dwurdzeniowym lub przez 8 w czterordzeniowym rdzeniu. L2 jest zwykle współdzielony przez różne rdzenie-w zależności od architektury może być współdzielony przez kilka lub wszystkie rdzenie procesora, więc koszt zwiększenia L2 byłby mniejszy, nawet jeśli cena L1 i L2 były takie same-co nie jest.

 27
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 10:52:12

L1 jest bardzo ściśle sprzężony z rdzeniem procesora i jest dostępny przy każdym dostępie do pamięci (bardzo często). Dlatego musi zwracać dane bardzo szybko(zwykle w ramach cyklu zegara). Opóźnienie i przepustowość (przepustowość) mają kluczowe znaczenie dla wydajności pamięci podręcznej danych L1. (np. opóźnienie w czterech cyklach oraz obsługa dwóch odczytów i jednego zapisu przez rdzeń PROCESORA w każdym cyklu zegara). Potrzebuje wielu portów odczytu/zapisu, aby obsługiwać tak wysoką przepustowość dostępu. Budowanie dużej pamięci podręcznej z tymi właściwościami jest niemożliwe. Tak więc projektanci utrzymują go na małym poziomie, np. 32KB w większości dzisiejszych procesorów.

L2 jest dostępny tylko na L1, więc dostęp jest rzadszy (Zwykle 1/20 L1). W ten sposób L2 może mieć większe opóźnienie (np. od 10 do 20 cykli) i mieć mniej portów. Dzięki temu projektanci mogą go powiększyć.


L1 i L2 odgrywają bardzo różne role. Jeśli L1 zostanie powiększony, zwiększy to opóźnienie dostępu do L1, co drastycznie zmniejszy wydajność, ponieważ będzie zależeć od wszystkich ładuje się wolniej i trudniej, aby ukryć realizację poza zamówieniem. Rozmiar L1 jest ledwo dyskusyjny.

Jeśli usuniemy L2, L1 będzie musiał przejść do następnego poziomu, powiedzmy pamięć. Oznacza to, że dużo dostępu będzie do pamięci, co oznaczałoby, że potrzebujemy większej przepustowości pamięci, co już jest wąskim gardłem. Tak więc utrzymanie L2 wokół jest korzystne.

Eksperci często odnoszą się do L1 jako filtra opóźnień (ponieważ sprawia, że częsty przypadek uderzeń L1 jest szybszy) i L2 jako filtr przepustowości, ponieważ zmniejsza wykorzystanie przepustowości PAMIĘCI.

Uwaga: założyłem 2-poziomową hierarchię pamięci podręcznej w moim argumencie, aby to uprościć. W wielu dzisiejszych układach wielordzeniowych istnieje pamięć podręczna L3 współdzielona między wszystkimi rdzeniami, podczas gdy każdy rdzeń ma swój własny prywatny L1, a może L2. W tych układach współdzielona pamięć podręczna ostatniego poziomu (L3) odgrywa rolę filtra przepustowości PAMIĘCI. L2 pełni rolę filtra przepustowości on-chip, tj. ogranicza dostęp do interkonektu on-chip i L3. Pozwala to na projektanci używają interkonektu o niższej przepustowości, jak pierścień, i powolnego jednoportowego L3, co pozwala im zwiększyć L3.

Być może warto wspomnieć, że liczba portów jest bardzo ważnym punktem projektowym, ponieważ wpływa na to, ile obszaru Chipa zużywa pamięć podręczna. Porty dodają Przewody do pamięci podręcznej, która zużywa dużo powierzchni chipów i energii.

 40
Author: Aater Suleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-24 07:43:39

@ODPOWIEDŹ Aater wyjaśnia niektóre z podstaw . Dodam jeszcze kilka szczegółów + przykład prawdziwej organizacji cache Na Intel Haswell i AMD Piledriver, z opóźnieniami i innymi właściwościami, nie tylko wielkością.

Po szczegóły dotyczące IvyBridge, zobacz moja odpowiedź na "jak cache może być tak szybki?", z omówieniem ogólnego opóźnienia obciążenia, w tym czasu obliczania adresu i szerokości magistrali danych między różnymi poziomami cache.


L1 musi być bardzo szybki (opóźnienie i przepustowość), nawet jeśli oznacza to ograniczoną liczbę uderzeń. L1d musi również obsługiwać jednobajtowe sklepy na prawie wszystkich architekturach, a także (w niektórych projektach) niepodpisane dostępy. To sprawia, że trudno jest używać ECC (kody korekcji błędów) do ochrony danych, a w rzeczywistości niektóre projekty L1D (Intel) po prostu używają parzystości, z lepszym ECC tylko w zewnętrznych poziomach pamięci podręcznej (L2/L3), gdzie ECC można zrobić na większych kawałkach dla niższe koszty.

Nie jest możliwe zaprojektowanie pojedynczego poziomu pamięci podręcznej, który mógłby zapewnić niskie średnie opóźnienie żądania (uśrednione dla wszystkich trafień i chybień) nowoczesnego wielopoziomowego bufora . Ponieważ nowoczesne systemy mają wiele bardzo głodnych rdzeni, wszystkie współdzielące połączenie z tą samą pamięcią DRAM o stosunkowo wysokim opóźnieniu, jest to niezbędne.

Każdy rdzeń potrzebuje własnego prywatnego L1 dla szybkości, ale przynajmniej ostatni poziom pamięci podręcznej jest zazwyczaj współdzielony, więc wielowątkowy program, który odczytuje te same dane z wielu wątków, nie musi przechodzić do pamięci DRAM dla każdego rdzenia. (I działać jako backstop dla danych zapisywanych przez jeden rdzeń i odczytywanych przez inny). To wymaga co najmniej dwóch poziomów pamięci podręcznej dla zdrowego systemu wielordzeniowego, i jest częścią motywacji dla więcej niż 2 poziomów w obecnych projektach. Nowoczesne wielordzeniowe procesory x86 mają szybką 2-poziomową pamięć podręczną w każdym rdzeniu i większą wolniejszą pamięć podręczną współdzieloną przez wszystkie rdzenie.

L1 hit-rate jest nadal bardzo ważne, więc pamięci podręczne L1 nie są tak małe / proste / szybkie , jak mogłyby być, ponieważ zmniejszyłoby to liczbę trafień. Osiągnięcie tej samej ogólnej wydajności wymagałoby wyższych poziomów pamięci podręcznej, aby były szybsze. Jeśli wyższe poziomy obsługują większy ruch, ich opóźnienie jest większym składnikiem średniego opóźnienia i częściej ograniczają przepustowość (lub potrzebują wyższej przepustowości).

Wysoka przepustowość często oznacza możliwość obsługi wielu odczytów i zapisów w każdym cyklu, tj. wiele portów. Zajmuje to więcej przestrzeni i mocy dla tej samej pojemności co Pamięć podręczna o niższej przepustowości, więc jest to kolejny powód, dla którego L1 pozostaje mały.


L1 używa również szybkich trików, które nie zadziałałyby, gdyby były większe. np. większość projektów używa wirtualnie indeksowanych, fizycznie oznaczonych (vipt) L1, ale wszystkie bity indeksu pochodzą spod offsetu strony, więc zachowują się jak PIPT (ponieważ niskie bity wirtualnego adresu są takie same jak w fizycznym adres). Pozwala to uniknąć synonimów / homonimów (fałszywych trafień lub tych samych danych znajdujących się w pamięci podręcznej dwa razy, i zobaczyć szczegółową odpowiedź Paula Claytona na połączone pytanie), ale nadal pozwala część sprawdzania trafienia/pominięcia zdarzyć się równolegle z wyszukiwaniem TLB. Pamięć podręczna VIVT nie musi czekać na TLB, ale musi zostać unieważniona przy każdej zmianie tabel stron.

Na x86 (który używa stron pamięci wirtualnej 4kib), 32kib 8-drożne asocjacyjne pamięci podręczne L1 są powszechne we współczesnych projektach. The 8 znaczniki mogą być pobierane na podstawie niskich 12 bitów adresu Wirtualnego, ponieważ te bity są takie same w adresach wirtualnych i fizycznych(znajdują się poniżej offsetu strony dla stron 4kiB). Ten speed-hack dla pamięci podręcznych L1 działa tylko wtedy, gdy są na tyle małe i asocjacyjne, że indeks nie zależy od wyniku TLB. 32kib / 64B lines / 8-way associativity = 64 (2^6) sets. Tak więc najniższe 6 bitów adresu wybiera bajty w linii, a następne 6 bitów index Zestaw 8 znaczników. Ten zestaw 8 znaczników jest pobierany równolegle z wyszukiwaniem TLB, więc znaczniki mogą być sprawdzane równolegle z bitami wyboru strony fizycznej w wyniku TLB, aby określić ,które (jeśli istnieją) z 8 sposobów pamięci podręcznej przechowują dane.

Utworzenie większego bufora L1 oznaczałoby, że musiałby albo poczekać na wynik TLB, zanim zacznie pobierać znaczniki i ładować je do równoległych komparatorów, albo musiałby zwiększyć asocjację, aby zachować log2(sets) + log2 (line_size) mniej zestawów całkowitych = mniej bitów indeksu). Tak więc np. cache 64kiB musiałby być 16-drożny asocjacyjny: nadal 64 zestawy, ale każdy zestaw ma dwa razy więcej sposobów. To sprawia, że zwiększenie rozmiaru L1 poza obecny rozmiar jest zbyt drogie pod względem mocy, a prawdopodobnie nawet opóźnienia.

Wydatkowanie większej ilości energii na logikę pamięci podręcznej L1D pozostawiłoby mniej energii dostępnej do wykonania poza zamówieniem, dekodowania i oczywiście pamięci podręcznej L2 i tak dalej na . Uzyskanie całego rdzenia do pracy w 4GHz i utrzymania ~4 instrukcje na zegar (na kod high-ILP) bez topienia wymaga zrównoważonej konstrukcji. Zobacz ten artykuł: nowoczesne mikroprocesory: 90-minutowy Przewodnik!.

Im większa jest pamięć podręczna, tym więcej tracisz przez jej spłukanie, więc duża pamięć podręczna VIVT L1 byłaby gorsza niż obecna VIPT-która działa-jak-PIPT. I większe, ale większe opóźnienie L1D prawdopodobnie też byłoby gorsze.

Według @ PaulClayton , L1 pamięć podręczna często pobiera wszystkie dane W Zestawie równolegle ze znacznikami, więc jest tam gotowa do wybrania po wykryciu WŁAŚCIWEGO znacznika. Koszt zasilania skaluje się z asocjacją, więc Duży wysoce asocjacyjny L1 byłby naprawdę zły dla wykorzystania mocy, jak również obszaru matrycy (i latencji) . (W porównaniu do L2 i L3, nie byłoby to dużo obszaru, ale fizyczna bliskość jest ważna dla latencji. Prędkość propagacji światła ma znaczenie, gdy cykle zegara wynoszą 1/4 a nanosekundy.)

Wolniejsze pamięci podręczne (jak L3) mogą pracować przy niższym napięciu / taktowaniu, aby wytwarzać mniej ciepła. Mogą nawet używać różnych układów tranzystorów dla każdej komórki pamięci, aby pamięć była bardziej zoptymalizowana pod kątem mocy niż wysokiej prędkości.

Istnieje wiele powodów związanych z wykorzystaniem mocy dla wielopoziomowych pamięci podręcznych. Moc / ciepło jest jednym z najważniejszych ograniczeń w nowoczesnej konstrukcji procesora, ponieważ chłodzenie małego Chipa jest trudne. Wszystko to kompromis między prędkością a moc (i / lub obszar matrycy). Ponadto wiele procesorów zasilanych jest bateriami lub znajduje się w centrach danych, które wymagają dodatkowego chłodzenia.


L1 jest prawie zawsze dzielony na oddzielne pamięci podręczne instrukcji i danych. zamiast dodatkowego portu odczytu w unified L1 obsługującego pobieranie kodu, możemy mieć oddzielną pamięć podręczną L1I powiązaną z oddzielnym i-TLB. (Nowoczesne procesory często mają L2-TLB, który jest drugim poziomem pamięci podręcznej dla tłumaczeń, który jest współdzielony przez L1 i-TLB i D-TLB, a nie TLB używany przez zwykła Pamięć podręczna L2). Daje nam to 64 KiB pamięci podręcznej L1, statycznie podzielonej na pamięci podręczne kodu i danych, za znacznie tańsze (i prawdopodobnie mniejsze opóźnienie) niż Monster 64K L1 unified cache z tą samą całkowitą przepustowością. Ponieważ kod i dane Zwykle pokrywają się w niewielkim stopniu, jest to duża wygrana.

L1I może być fizycznie blisko logiki code-fetch, podczas gdy L1D może być fizycznie blisko jednostek load/store. Prędkość transmisji światła-opóźnienia linii są duże gdy cykl zegara trwa tylko 1/3 nanosekundy. Routing okablowania jest również dużą sprawą: np. Intel Broadwell ma 13 warstw miedzi nad silikonem.

Split L1 bardzo pomaga w szybkości, ale zunifikowany L2 jest najlepszym wyborem. Niektóre obciążenia mają bardzo mały kod, ale dotykają wielu danych. Logiczne jest ujednolicenie pamięci podręcznych wyższego poziomu w celu dostosowania się do różnych obciążeń, zamiast statycznego podziału na kod i dane. (np. prawie wszystkie L2 będą buforowanie danych, a nie kodu, podczas uruchamiania dużej macierzy mnożenia, vs. posiadanie dużej ilości gorącego kodu podczas uruchamiania nadętego programu C++, czy nawet wydajnej implementacji skomplikowanego algorytmu (np. uruchamianie gcc)). Kod można kopiować jako dane, nie zawsze tylko ładować z dysku do pamięci za pomocą DMA.


Pamięci podręczne również potrzebują logiki do śledzenia zaległych błędów (ponieważ out-of-order execution oznacza, że nowe żądania mogą być generowane, zanim pierwsze błędy zostaną rozwiązane). Mając wiele misses outstanding oznacza nakładanie się opóźnień błędów, osiągając wyższą przepustowość. Powielanie logiki i / lub statyczne dzielenie kodu i danych w L2 nie byłoby dobre.

Większe pamięci podręczne o niższym natężeniu ruchu są również dobrym miejscem do wprowadzenia logiki wstępnego pobierania. Wstępne pobieranie sprzętowe zapewnia dobrą wydajność dla takich rzeczy, jak zapętlanie tablicy bez każdego fragmentu kodu wymagającego Instrukcji oprogramowania-prefetch. (SW prefetch był ważny przez jakiś czas, ale HW prefetchers są mądrzejsi niż kiedyś, więc ta rada w Ulricha Dreppera jest znakomita co każdy programista powinien wiedzieć o pamięci jest nieaktualny dla wielu przypadków użycia.)

W przypadku pamięci podręcznych o niskim natężeniu ruchu pamięci podręczne wyższego poziomu mogą pozwolić sobie na opóźnienie, aby zrobić sprytne rzeczy, takie jak użycie polityki adaptacyjnej wymiany zamiast zwykłego LRU. procesory Intel IvyBridge i późniejsze to robią, aby oprzeć się wzorcom dostępu, które nie mają trafień cache dla działającego zestawu tylko nieco za duży, aby zmieścić się w pamięci podręcznej. (np. dwukrotne zapętlenie niektórych danych w tym samym kierunku oznacza, że prawdopodobnie zostaną one eksmitowane tuż przed ponownym użyciem.)

Prawdziwy przykład: Intel Haswell . Źródło: Analiza mikroarchitektury Davida Kantera i wyniki badań Agnera Foga (mikroarchitektura pdf) . Zobacz także instrukcje optymalizacji Intela (linki w x86 Tag wiki).

Ponadto napisałem osobną odpowiedź na: który cache technika mapowania stosowana jest w procesorze intel core i7?

[[0]}nowoczesne projekty Intela wykorzystują dużą pamięć podręczną L3 współdzieloną przez wszystkie rdzenie jako zabezpieczenie dla ruchu cache-coherence . Jest fizycznie rozprowadzany między rdzeniami, z 2048 zestawami * 16-drożnymi (2MiB) na rdzeń (z Polityką adaptacyjnej wymiany w IvyBridge i późniejszych).

Niższe poziomy pamięci podręcznej są per-core.

  • L1: per-core 32kib każda instrukcja i dane (split), 8-kierunkowy asocjacyjny. latencja = 4 cykle. Co najmniej 2 porty odczytu + 1 port zapisu. ( może nawet więcej portów do obsługi ruchu między L1 i L2, a może otrzymanie linii pamięci podręcznej z L2 koliduje z wycofaniem sklepu.) Może śledzić 10 zaległych błędów pamięci podręcznej (10 buforów wypełnienia).
  • L2 : unified per-core 256kiB, 8-drożny asocjacyjny. latencja = 11 lub 12 cykli. Odczyt przepustowości: 64 bajty / cykl. Główne prefetching logika prefetches do L2. Can utwór 16. Może dostarczyć 64B na cykl do L1I lub L1D. rzeczywista liczba portów nieznana.
  • [[10]}L3 : zunifikowany, współdzielony (przez wszystkie rdzenie) 8MiB (dla czterordzeniowego i7). Inclusive (wszystkich pamięci podręcznych L2 i L1 na rdzeń). 12 lub 16 sposób asocjacyjny. latencja = 34 cykle. Działa jako zabezpieczenie dla spójności pamięci podręcznej, więc zmodyfikowane współdzielone dane nie muszą wychodzić do pamięci głównej i z powrotem.

Kolejny prawdziwy przykład: AMD Piledriver: (np. Procesory Opteron i desktop FX.) Rozmiar Cache-line jest nadal 64B, jak Intel i AMD używane od kilku lat. Tekst skopiowany głównie z mikroarchitektury Agner Fog, z dodatkowymi informacjami z niektórych slajdów, które znalazłem, i więcej szczegółów na temat zapisu przez L1 + 4K write-combining cache na blogu Agner, z komentarzem , że tylko L1 jest WT, a nie L2.

  • L1I : 64 kB, 2-drożny, współdzielony między parą rdzeni (wersja SMD AMD ma bardziej statyczne partycjonowanie niż Hyperthreading, a każdy z nich nazywa się rdzeniem. Każda para dzieli jednostkę wektorową / FPU oraz inne zasoby potoków.)
  • L1D: 16 kB, 4-drożny, na rdzeń. latencja = 3-4 c. (Zauważ, że wszystkie 12 bitów poniżej offsetu strony są nadal używane do indeksu, więc zwykły trik VIPT działa.) (przepustowość: dwie operacje na zegar, do jednej z nich jest sklep). Polisa = Write-Through, z połączeniem zapisu 4k cache.
  • L2 : 2 MB, 16-drożny, współdzielony między dwoma rdzeniami. latencja = 20 zegarów . Odczyt przepustowości 1 na 4 zegary. Przepustowość zapisu 1 na 12 zegarów.
  • L3 : 0 - 8 MB, 64-drożny, współdzielony między wszystkimi rdzeniami. latencja = 87 zegar . Odczyt przepustowości 1 na 15 Zegar. Zapis przepustowości 1 na 21 Zegar

Agner Fog informuje, że przy obu rdzeniach pary aktywnych, przepustowość L1 jest niższa niż w przypadku, gdy druga połowa pary jest bezczynna. On nie wiadomo, co się dzieje, ponieważ pamięć podręczna L1 powinna być oddzielona dla każdego rdzenia.

 14
Author: Peter Cordes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 03:02:50

Myślę, że głównym powodem dla tego ist, że L1-Cache jest szybszy, a więc jest droższy.

 2
Author: basti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 08:42:58

Dla zainteresowanych tego typu pytaniami, moja Uczelnia poleca architekturę komputera: podejście ilościowe oraz organizację i projektowanie komputera: interfejs sprzętowy/programowy. Oczywiście, jeśli nie masz na to czasu, szybki przegląd jest dostępny na Wikipedia.

 2
Author: Ilia K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 01:12:34

Inne odpowiedzi tutaj podają konkretne i techniczne powody, dla których L1 i L2 są takie, jakie są, i chociaż wiele z nich motywuje do rozważań dla poszczególnych architektur, nie są one naprawdę konieczne: podstawowa presja architektoniczna prowadząca do zwiększenia (prywatnych) rozmiarów pamięci podręcznej w miarę oddalania się od rdzenia jest dość uniwersalna i jest taka sama jak rozumowanie dla wielu pamięci podręcznych w pierwszej kolejności.

Trzy podstawowe fakty to:

  1. dostęp do pamięci dla większości zastosowań wykazują wysoki stopień lokalizacji czasowej, z niejednolitym rozkładem.
  2. w wielu różnych procesach i projektach rozmiar pamięci podręcznej i szybkość pamięci podręcznej (opóźnienie i przepustowość) mogą być wymieniane między sobą1.
  3. każdy odrębny poziom pamięci podręcznej wiąże się z przyrostowymi kosztami projektu i wydajności.

Więc na poziomie podstawowym, możesz być w stanie powiedzieć dwukrotnie rozmiar pamięci podręcznej, ale ponieść karę opóźnienia 1.4 w porównaniu do mniejszego cache.

Staje się więc problemem optymalizacyjnym: ile powinieneś mieć buforów i jak duże powinny być? Gdyby dostęp do pamięci był całkowicie jednolity w ramach zestawu roboczego, prawdopodobnie skończyłbyś z pojedynczą dość dużą pamięcią podręczną lub w ogóle jej nie było. Jednak dostęp jest silnie niejednorodny, więc mała i szybka pamięć podręczna może przechwycić dużą liczbę dostępu, nieproporcjonalnie dużą w stosunku do jej rozmiaru.

Gdyby fakt 2 nie istniał, po prostu stworzyłbyś bardzo dużą, bardzo szybką pamięć podręczną L1 wewnątrz inne ograniczenia twojego chipa i nie potrzebujesz żadnych innych poziomów pamięci podręcznej.

Gdyby fact 3 nie istniał, skończyłbyś z ogromną liczbą drobnoziarnistych "pamięci podręcznych", szybszych i małych w centrum, a wolniejszych i większych Na zewnątrz, lub może pojedynczą pamięć podręczną o zmiennym czasie dostępu: szybszą dla części najbliżej rdzenia. W praktyce zasada 3 oznacza, że każdy poziom pamięci podręcznej ma dodatkowy koszt, więc zwykle kończy się na kilku skwantowanych poziomach pamięci podręcznej2.

Inne Ograniczenia

Daje to podstawowe ramy do zrozumienia liczby pamięci podręcznej i decyzji o rozmiarze pamięci podręcznej, ale istnieją również czynniki drugorzędne. Na przykład Intel x86 ma rozmiary stron 4K, a ich pamięci podręczne L1 używają architektury vipt. VIPT oznacza, że rozmiar pamięci podręcznej podzielonej przez liczbę sposobów nie może być większy3 niż 4 KiB. Tak więc 8-drożna pamięć podręczna L1 używana w pół tuzina projektów Intela może wynosić co najwyżej 4 KiB * 8 = 32 KiB. To chyba nie przypadek, że to jest dokładnie rozmiar pamięci podręcznej L1 na tych projektach! Gdyby nie to ograniczenie, jest całkowicie możliwe, że zobaczyłbyś niższą asocjację i / lub większe pamięci podręczne L1 (np. 64 KiB, 4-way).


1 oczywiście, istnieją inne czynniki zaangażowane w tradeoff, jak również, takie jak obszar i moc, ale trzymając te czynniki stałe wielkość-prędkość tradeoff ma zastosowanie, a nawet jeśli nie utrzymywane stałe podstawowe zachowanie jest takie samo.

2 oprócz tego jak większość projektów L1, scheduler out-of-order może optymistycznie przesyłać operacje, które zależą od obciążenia pamięci w cyklu, który cache L1 zwróci, odczytując wynik z sieci obejścia. Zmniejsza to kontrowersje i być może zmniejsza cykl opóźnień na ścieżce krytycznej. Powoduje to presję na najbardziej wewnętrzny poziom pamięci podręcznej, aby mieć jednolite / przewidywalne opóźnienia i prawdopodobnie skutkuje mniejszą ilością pamięci podręcznej poziomy.

3 zasadniczo można używać pamięci podręcznych VIPT bez tego ograniczenia, ale tylko przez wymaganie obsługi systemu operacyjnego (np. kolorowanie stron) lub z innymi ograniczeniami. Arch x86 tego nie zrobił i prawdopodobnie nie może teraz zacząć.

 1
Author: BeeOnRope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 20:01:30

Logicznie, pytanie odpowiada samo.

Gdyby L1 było większe niż L2 (połączone), wtedy nie byłoby potrzeby L2 Cache.

Dlaczego przechowujesz swoje rzeczy na napędzie taśmowym, jeśli możesz przechowywać je wszystkie na dysku twardym ?

 -2
Author: Ajeet Ganga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 08:44:23