Ierarhia cache - Cache hierarchy

Ierarhia cache-ului sau cache-urile pe mai multe niveluri se referă la o arhitectură de memorie care utilizează o ierarhie de stocări de memorie bazată pe viteze de acces variate la datele cache. Datele foarte solicitate sunt stocate în cache în depozitele de memorie cu acces de mare viteză, permițând accesul mai rapid de către nucleele unității centrale de procesare (CPU).

Ierarhia cache este o formă și o parte a ierarhiei memoriei și poate fi considerată o formă de stocare pe niveluri . Acest design a fost destinat să permită procesarea mai rapidă a nucleelor ​​CPU, în ciuda latenței de memorie a accesului la memorie principală . Accesarea memoriei principale poate acționa ca un blocaj pentru performanța de bază a procesorului, pe măsură ce CPU așteaptă date, în timp ce creșterea vitezei de memorie principală poate fi costisitoare. Cache-urile de mare viteză sunt un compromis care permite accesul de mare viteză la datele cele mai utilizate de CPU, permițând un ceas CPU mai rapid .

Diagrama arhitecturii proceselor care prezintă patru procesoare independente conectate fiecare prin sisteme cache la memoria principală și la sistemul de intrare-ieșire.
Organizare generică a memoriei cache pe mai multe niveluri

fundal

În istoria dezvoltării computerelor și a cipurilor electronice, a existat o perioadă în care creșterea vitezei procesorului a depășit îmbunătățirile în viteza de acces la memorie. Decalajul dintre viteza CPU-urilor și memoria a însemnat că CPU-ul ar fi adesea inactiv. CPU-urile erau din ce în ce mai capabile să ruleze și să execute cantități mai mari de instrucțiuni într-un anumit timp, dar timpul necesar pentru accesarea datelor din memoria principală a împiedicat programele să beneficieze pe deplin de această capacitate. Această problemă a motivat crearea de modele de memorie cu rate de acces mai mari pentru a realiza potențialul procesorelor mai rapide.

Acest lucru a dus la conceptul de memorie cache , propus pentru prima dată de Maurice Wilkes , un om de știință în domeniul calculatoarelor britanic la Universitatea din Cambridge în 1965. El a numit astfel de modele de memorie „memorie sclavă”. Între anii 1970 și 1990, lucrările și articolele lui Anant Agarwal , Alan Jay Smith , Mark D. Hill , Thomas R. Puzak și alții au discutat despre proiectarea mai bună a memoriei cache. Primele modele de memorie cache au fost implementate în acel moment, dar chiar și în timp ce cercetătorii investigau și propuneau modele mai bune, a continuat nevoia de modele de memorie mai rapide. Această necesitate a rezultat din faptul că, deși modelele de cache timpurii au îmbunătățit latența accesului la date, în ceea ce privește costurile și limitările tehnice, nu a fost fezabil ca memoria cache a unui sistem informatic să se apropie de dimensiunea memoriei principale. Începând cu 1990, au fost propuse idei precum adăugarea unui alt nivel de cache (nivelul al doilea), ca o copie de rezervă pentru memoria cache de primul nivel. Jean-Loup Baer , Wen-Hann Wang, Andrew W. Wilson și alții au efectuat cercetări asupra acestui model. Când mai multe simulări și implementări au demonstrat avantajele modelelor de cache pe două niveluri, conceptul de cache-uri pe mai multe niveluri a prins ca un model nou și, în general, mai bun de memorie cache. Din 2000, modelele de cache pe mai multe niveluri au primit o atenție largă și sunt în prezent implementate în multe sisteme, cum ar fi cache-urile pe trei niveluri care sunt prezente în produsele Intel Core i7.

Cache pe mai multe niveluri

Accesarea memoriei principale pentru fiecare execuție a instrucțiunilor poate duce la o procesare lentă, viteza ceasului depinzând de timpul necesar pentru a găsi și prelua datele. Pentru a ascunde această latență de memorie de la procesor, se utilizează stocarea în cache a datelor. Ori de câte ori datele sunt solicitate de procesor, acestea sunt preluate din memoria principală și stocate în structura de memorie mai mică numită cache. Dacă mai este nevoie de aceste date, cache-ul este căutat mai întâi înainte de a merge în memoria principală. Această structură se află mai aproape de procesor în ceea ce privește timpul necesar pentru a căuta și prelua date cu privire la memoria principală. Avantajele utilizării cache-ului pot fi dovedite prin calcularea timpului mediu de acces (AAT) pentru ierarhia de memorie cu și fără cache.

Timp mediu de acces (AAT)

Memoriile cache, având dimensiuni reduse, pot duce la pierderi frecvente - atunci când o căutare a cache-ului nu oferă informațiile căutate - rezultând un apel către memoria principală pentru a prelua date. Prin urmare, AAT este afectat de rata ratei fiecărei structuri din care caută datele.

AAT pentru memoria principală este dat de memoria principală Hit time . AAT pentru cache poate fi dat de

Memorie cache timp de lovire + ( Memorie cache rata ratată × Durată de penalizare ratată necesară pentru a merge în memoria principală după lipsa memoriei cache ).

Timpul de accesare pentru cache este mai mic decât timpul de accesare pentru memoria principală, astfel încât AAT pentru recuperarea datelor este semnificativ mai mic la accesarea datelor prin cache, mai degrabă decât memoria principală.

Compensări

În timp ce utilizarea cache-ului poate îmbunătăți latența memoriei, este posibil ca aceasta să nu conducă întotdeauna la îmbunătățirea necesară pentru timpul necesar preluării datelor din cauza modului în care sunt organizate și traversate cache-urile. De exemplu, cache-urile direct mapate care au aceeași dimensiune au de obicei o rată de ratare mai mare decât cache-urile complet asociative. Acest lucru poate depinde, de asemenea, de etalonul computerului care testează procesorul și de modelul instrucțiunilor. Dar utilizarea unui cache complet asociativ poate duce la un consum mai mare de energie, deoarece trebuie să caute în întregul cache de fiecare dată. Datorită acestui fapt, compromisul dintre consumul de energie (și căldura asociată) și dimensiunea cache-ului devine esențial în proiectarea cache-ului.

Evoluţie

O serie de dreptunghiuri cu proporții crescânde reprezentând creșterea memoriei din registrele de pe CPU și din memoria cache L1 prin L2, L3 și memoria principală.
Ierarhizarea cache-ului pentru un nivel de cache de până la L3 și memorie principală cu L1 on-chip

În cazul unei rate de cache, scopul utilizării unei astfel de structuri va fi inutilizat, iar computerul va trebui să meargă în memoria principală pentru a prelua datele necesare. Cu toate acestea, cu o memorie cache cu mai multe niveluri , dacă computerul ratează memoria cache cea mai apropiată de procesor (memoria cache de nivel unu sau L1), atunci va căuta prin cel mai apropiat nivel (e) de memorie cache și va merge în memoria principală numai dacă acestea metodele eșuează. Tendința generală este să păstreze memoria cache L1 mică și la o distanță de 1-2 cicluri de ceas CPU de la procesor, nivelurile mai mici de cache crescând în dimensiune pentru a stoca mai multe date decât L1, deci fiind mai îndepărtate, dar cu o pierdere mai mică rată. Acest lucru are ca rezultat un AAT mai bun. Numărul de niveluri de cache poate fi proiectat de arhitecți în funcție de cerințele acestora, după verificarea compromisurilor între cost, AAT și dimensiune.

Câștiguri de performanță

Cu scalarea tehnologică care a permis sistemelor de memorie capabile să fie găzduite pe un singur cip, majoritatea procesoarelor moderne au până la trei sau patru niveluri de cache. Reducerea AAT poate fi înțeleasă prin acest exemplu, în care computerul verifică AAT pentru diferite configurații până la cache-uri L3.

Exemplu : memorie principală = 50  ns , L1 = 1 ns cu 10% rate rate, L2 = 5 ns cu 1% rate rate), L3 = 10 ns cu 0,2% rate rate.

  • Fără cache, AAT = 50 ns
  • L1 cache, AAT = 1 ns + (0,1 × 50 ns) = 6 ns
  • L1-2 cache, AAT = 1 ns + (0,1 × [5 ns + (0,01 × 50 ns)]) = 1,55 ns
  • L1–3 cache, AAT = 1 ns + (0,1 × [5 ns + (0,01 × [10 ns + (0,002 × 50 ns)]))) = 1,5101 ns

Dezavantaje

  • Memoria cache are un cost marginal crescut decât memoria principală și astfel poate crește costul întregului sistem.
  • Datele stocate în cache sunt stocate numai atâta timp cât este furnizată energie în cache.
  • Creșterea suprafeței on-chip necesară pentru sistemul de memorie.
  • Beneficiile pot fi minimizate sau eliminate în cazul unui program mare cu localitate temporală slabă , care accesează frecvent memoria principală.

Proprietăți

trei pătrate care arată cache-uri L1 separate pe CPU pentru instrucțiuni și date, un cache L2 off-chip și memorie principală.
Organizarea cache-ului cu L1 separat și L2 unificat

Bancar versus unificat

Într-un cache bancar, cache-ul este împărțit într-un cache dedicat stocării instrucțiunilor și un cache dedicat datelor. În schimb, un cache unificat conține atât instrucțiunile, cât și datele în același cache. În timpul unui proces, cache-ul L1 (sau cel mai mare cache de nivel superior în raport cu conexiunea sa la procesor) este accesat de procesor pentru a prelua atât instrucțiunile, cât și datele. Solicitarea ambelor acțiuni pentru a fi implementate în același timp necesită mai multe porturi și mai mult timp de acces într-un cache unificat. Pentru a avea mai multe porturi este nevoie de hardware și cablare suplimentare, ceea ce duce la o structură semnificativă între cache și unități de procesare. Pentru a evita acest lucru, cache-ul L1 este adesea organizat ca un cache bancar, ceea ce duce la mai puține porturi, mai puțin hardware și, în general, timpi de acces mai mici.

Procesoarele moderne au cache-uri împărțite, iar în sistemele cu cache-uri pe mai multe niveluri cache-urile de nivel superior pot fi unificate, în timp ce nivelurile inferioare se împart.

Politici de incluziune

o diagramă a sistemului de memorie care arată o copie a L1 în L2 și o copie a L2 în L3.
Organizare cache inclusivă

Dacă un bloc prezent în stratul cache superior poate fi prezent și în nivelul cache inferior este guvernat de politica de includere a sistemului de memorie, care poate fi inclusivă, exclusivă sau neinclusivă neexclusivă (NINE).

Cu o politică inclusivă, toate blocurile prezente în memoria cache de nivel superior trebuie să fie prezente și în memoria cache de nivel inferior. Fiecare componentă cache de nivel superior este un subset al componentei cache de nivel inferior. În acest caz, deoarece există o dublare a blocurilor, există o pierdere de memorie. Cu toate acestea, verificarea este mai rapidă.

În conformitate cu o politică exclusivă, toate componentele ierarhiei cache sunt complet exclusive, astfel încât orice element din memoria cache de nivel superior nu va fi prezent în niciuna dintre componentele cache inferioare. Aceasta permite utilizarea completă a memoriei cache. Cu toate acestea, există o latență mare de acces la memorie.

Politicile de mai sus necesită respectarea unui set de reguli pentru a le implementa. Dacă niciuna dintre acestea nu este forțată, politica de incluziune rezultată se numește neinclusiv neexclusiv (NOUĂ). Aceasta înseamnă că memoria cache de nivel superior poate fi sau nu prezentă în memoria cache de nivel inferior.

Scrieți politici

Există două politici care definesc modul în care un bloc cache modificat va fi actualizat în memoria principală: scriere și scriere înapoi.

În cazul politicii de scriere prin trecere, ori de câte ori se modifică valoarea blocului cache, acesta este modificat și în ierarhia de memorie de nivel inferior. Această politică asigură faptul că datele sunt stocate în siguranță, așa cum sunt scrise în întreaga ierarhie.

Cu toate acestea, în cazul politicii de scriere, blocul cache modificat va fi actualizat în ierarhia de nivel inferior numai atunci când blocul cache este evacuat. Un „bit murdar” este atașat la fiecare bloc cache și setat de fiecare dată când blocul cache este modificat. În timpul evacuării, blocurile cu un bit murdar setat vor fi scrise în ierarhia de nivel inferior. Conform acestei politici, există riscul pierderii de date, deoarece cea mai recentă copie modificată a unei date este stocată numai în cache și, prin urmare, trebuie respectate unele tehnici corective.

În cazul unei scrieri în care octetul nu este prezent în blocul cache, octetul poate fi adus în cache așa cum este determinat de o politică de alocare a scrierii sau de scriere fără alocare. Politica de alocare a scrierii stabilește că, în cazul unei greșeli de scriere, blocul este preluat din memoria principală și plasat în memoria cache înainte de scriere. În politica de scriere fără alocare, dacă blocul este ratat în cache, acesta va scrie în ierarhia de memorie de nivel inferior fără a prelua blocul în cache.

Combinațiile comune ale politicilor sunt „bloc de scriere”, „alocare la scriere” și „scriere prin scriere fără alocare” .

Partajat versus privat

Trei procesoare au fiecare cache cache L1 private, dar partajează memoria L2, L3 și memoria principală off-chip.
Organizare cache cu L1 privat și L2 și L3 partajate

O memorie cache privată este alocată unui anumit nucleu dintr-un procesor și nu poate fi accesată de niciun alt nucleu. În unele arhitecturi, fiecare nucleu are propriul cache privat; acest lucru creează riscul de blocuri duplicate în arhitectura cache a unui sistem, ceea ce duce la o utilizare a capacității redusă. Cu toate acestea, acest tip de alegere de design într-o arhitectură cache cu mai multe straturi poate fi, de asemenea, bun pentru o latență mai mică a accesului la date.

Un cache partajat este un cache care poate fi accesat de mai multe nuclee. Deoarece este partajat, fiecare bloc din cache este unic și, prin urmare, are o rată de acces mai mare, deoarece nu vor exista blocuri duplicate. Cu toate acestea, latența de acces la date poate crește pe măsură ce mai multe nuclee încearcă să acceseze același cache.

La procesoarele multi-core , alegerea de proiectare pentru a crea o memorie cache partajată sau privată afectează performanța procesorului. În practică, cache-ul de nivel superior L1 (sau uneori L2) este implementat pe măsură ce cache-urile de nivel inferior sunt implementate ca partajate. Acest design oferă rate de acces ridicate pentru cache-urile de nivel înalt și rate de ratare scăzute pentru cache-urile de nivel inferior.

Modele de implementare recente

Image
Organizarea cache a microarhitecturii Intel Nehalem

Microarhitectura Intel Broadwell (2014)

  • Cache L1 (instrucțiuni și date) - 64  kB pe nucleu
  • Cache L2 - 256 kB pe nucleu
  • Cache L3 - 2  MB la 6 MB partajate
  • Cache L4 - 128 MB eDRAM (numai pentru modelele Iris Pro)

Microarhitectura Intel Kaby Lake (2016)

  • Cache L1 (instrucțiuni și date) - 64 kB pe nucleu
  • Cache L2 - 256 kB pe nucleu
  • Cache L3 - 2 MB până la 8 MB partajate

Microarhitectura AMD Zen (2017)

  • Cache L1 - date de 32 kB și instrucțiuni de 64 kB pe nucleu, cu 4 căi
  • Memorie cache L2 - 512 kB per nucleu, cu 4 căi inclusiv
  • Cache L3 - 4 MB local și la distanță per CCX cu 4 nuclee, 2 CCX per chiplet, 16-way non-inclusive. Până la 16 MB pe CPU-uri desktop și 64 MB pe CPU-uri server

Microarhitectura AMD Zen 2 (2019)

  • Cache L1 - date de 32 kB și instrucțiuni de 32 kB pe nucleu, pe 8 căi
  • Memorie cache L2 - 512 kB pe nucleu, inclusiv în 8 căi
  • L3 cache - 16 MB local pe 4 nuclee CCX, 2 CCX-uri pe chiplet, 16 căi neincluse. Până la 64 MB pe CPU-uri desktop și 256 MB pe CPU-uri server

IBM Power 7

  • Cache L1 (instrucțiuni și date) - fiecare 64-bancat, fiecare bancă are 2 + 1wr porturi 32 kB, asociativ în 8 căi, bloc 128B, scriere prin
  • Cache L2 - 256 kB, 8 căi, bloc 128B, scriere înapoi, inclusiv L1, latență de acces 2 ns
  • Cache L3 - 8 regiuni de 4 MB (total 32 MB), regiune locală 6 ns, la distanță 30 ns, fiecare regiune asociativă pe 8 căi, matrice de date DRAM, matrice de etichete SRAM

Vezi si

Referințe