Documente Academic
Documente Profesional
Documente Cultură
Seminar 2 - Memoria Cache 1. Principiul memoriei cache 2. Politici de Fetch 3. Politici de Scriere 4. Funcia de mapare 4.1 Memorii cache mapate direct 4.2 Memorii cache complet-asociative 4.3 Memorii cache asociative pe mulimi (N-way set-associative) 4.4 Politici de evacuare a liniilor de cache 5. Organizarea memoriei cache 5.1 Ocolirea cache-ului 5.2 Memorii cache divizate prin utilitate 5.3 Memorii cache divizate pe niveluri 6. Memorii cache pentru sisteme multi-procesor Bibliografie
n seminarul precedent a fost studiat arhitectura calculatoarelor din prisma execuiei instruciunilor n procesor, urmnd ca n cadrul acestui seminar s se abordeaze mecanismele de funcionare i implementare ale memoriei rapide cache. Dup cum s-a discutat la partea de pipeline, execuia unei instruciuni presupune n cele mai multe cazuri i aducerea sau scrierea operanzilor din sau n memorie, iar pentru ca aceste operaii s nu impun ntrzieri prea mari, procesoarele folosesc memorii cache, mai rapide dect memoria principal, ns cu o capacitate mult mai mic (figura 1).
Prin adaugarea memoriei cache n ierarhia de memorii, interfaa dintre procesor i memoria principal rmne neschimbat i, dintr-un punct de vedere funcional, accesul se realizeaz ca i n cazul n care nu exist cache. Ideea de baz este c, din moment ce cache-ul este mai mic dect memoria principal, el stocheaz o submulime din coninutul acesteia. Totui, deoarece cache-ul poate fi implementat cu o tehnologie mai rapid (SRAM) dect memoria principal (DRAM), accesul la coninutul cache-ului este mai rapid. Ca rezultat al localitii fluxului de adrese, cache-ul reduce ncrcarea restului ierarhiei de memorie deoarece poate fi administrat s rein mulimea curent de date i instruciuni. Atunci cnd procesorul ncearc citirea unui cuvnt din memorie, se testeaz dac respectivul cuvnt se afl n memoria cache. n caz afirmativ, cuvntul este furnizat unitii centrale de execuie. n caz contrar, se ncarc n memoria cache un bloc al memoriei principale, constnd dintr-un numr fix de cuvinte, iar apoi cuvntul este returnat unitii centrale. Se cunoate c programele nu acceseaz memoria n mod complet aleator. Dac se face o referire la o anumit adres, este probabil c urmtoarea referire la memorie va fi n vecintatea acestei adrese. n spaiul adreselor de memorie, cteva regiuni au o probabilitate ridicat de a fi accesate, cteva au o probabilitate moderat, iar celelalte au o probabilitate foarte mic de a fi accesate n viitorul apropiat. O regiune care are o probabilitate nalt este cea corespunztoare contorului de program actual, deoarece este probabil s se execute urmtoarea instruciune din secvena de instruciuni. Alte regiuni care au o probabilitate mare de a fi accesate sunt cele care conin datele active, procedurile i punctul de ntoarcere dintr-o procedur. Atunci cnd vorbim de mbunatirile de performan rezultate din folosirea cache-ului, vom folosi urmtorii termeni: Cache hit - generat atunci cnd pentru a accesa date din memoria principala le lum din cache. Cache miss - generat atunci cnd datele nu sunt n cache, fiind aduse procesorului direct din memoria principal. cache miss obligatoriu cauzat de primul accesul la o zon de memorie. cache miss de capacitate cauzat de capacitatea limitat a cache-ului. cache miss conflictual cauzat de nlocuirea unui element din cache cu unul nou adus. Fetch - aducerea unui bloc de cuvinte din memoria principala ntr-o linie de cache. Atenie! n cache ncrcm linii care conin mai multe cuvinte, nu putem ncrca doar un anumit cuvnt. Aceasta structur a cache-ului este descris i n figura 2. Principiul localitii - aa cum am exemplificat mai sus, se refera la accesul programului la date din aceeai zon. Exist dou tipuri de localitate a datelor: localitatea spaial - se refer la faptul c datele aflate adiacent n memorie au o probabilitate mare de a fi folosite mpreun; organizarea pe linii a cache-ului face ca atunci cnd un cuvnt este accesat, ntreaga linie care conine acel cuvnt i cuvintele adiacente s fie ncrcat n cache, astfel accesele la cuvintele adiacente vor fi servite din cache. localitatea temporal - se refer la faptul c datele accesate recent au o probabilitate mare de a fi accesate din nou n viitorul apropiat; cache-ul mrete performana sistemului deoarece stocheaz datele accesate recent de program ntro memorie de mare vitez de unde pot fi reaccesate rapid. Performana programului este cu att mai mare cu ct timpul mediu de acces la memorie este mai mic.
unde
Pentru proiectarea memoriei cache trebuie luate n considerare o serie de mecanisme pentru scrierea datelor, citirea datelor i evacuarea liniilor, mecanisme care afecteaz performana i complexitatea cache-ului. Ne referim astfel la : Politici de fetch Politici de scriere Funcia de mapare Politici de evacuare
2. Politici de Fetch
Atunci cnd datele de care procesorul are nevoie nu se regsesc n cache, ele sunt aduse n cache pe baza politicii de fetch. S considerm exemplul unei memorii cache cu 1024 de octei, organizai pe 256 de linii cu cte 4 cuvinte. Procesorul emite o cerere de ncrcare din memorie de la adresa 2, care se mapeaz direct n prima linie a cache-ului (cuvintele de la 0 la 3). Cache-ul nu conine pe prima linie datele asociate cu adresa 2, deci trebuie executat un fetch, fiind adus tot blocul din memorie care conine acel cuvnt. Problema care se pune este n ce ordine vor fi aduse cuvintele din memoria principal. Exist dou opiuni: cuvntul critic mai nti (critical word first) presupune o ncrcare a cuvintelor n ordinea 2,3,0,1. Cuvntul de la adresa de care avem nevoie este ncrcat primul. Aceast tehnic micoreaz miss-penalty (timpul de acces la memorie pentru a face fetch la date n cazul unui cache-miss) n cazul liniilor de dimensiuni mai mari. n exemplul dat, diferena de performan este neglijabil. cuvntul natural mai nti (natural word first) presupune o ncrcare a cuvintelor n ordinea 0,1,2,3. Adresa de la nceputul liniei este ncrcat prima. Chiar dac politica critical word first prezint avantajul aducerii cuvntului necesar mai repede n procesor, sporind viteza acestuia de lucru, ofer totui dezavantajul unui mecanism de gestiune a cache-ului mai complicat. Pre-fetching O alt tehnic de optimizare a timpului de acces la memorie, este prin aducerea n avans a datelor din memorie n cache prin tehnici de pre-fetching. Prin anticiparea accesrii datelor putem reduce numrul de cache-miss ns algoritmul/euristicile pe baza cruia se face speculaia trebuie s nu polueze cache-ul cu date ce nu sunt folosite, sau sunt folosite rar. n cazul instruciunilor, acestea sunt executate de cele mai multe ori consecutiv (excepii apar n cazul instructiunilor de salt) i de aceea exist o mare probabilitate ca dup instruciunile dintrun bloc K de cuvinte (linie cache) procesorul s execute i instruciunile stocate n blocul urmtor K+1. Prin pre-fetching se aduce din memorie acest bloc i se mapeaz pe una din liniile din cache, nainte de aprea o cerere de la procesor pentru vreo adres din bloc. n cazul datelor, pre-fetching-ul este mai complicat i, de obicei, are performane bune cnd blocurile de date sunt prelucrate secvenial, de exemplu prelucrari de vectori i matrici. Metodele de pre-fetching pot fi implementate att la nivel software, prin optimizri fcute de ctre compilatoare, ct i la nivel hardware prin analiza adreselor de cache-miss folosind memory reference patterns, sau analiza adreselor instruciunilor (pentru cazul cache-ului de instruciuni). O scurt descriere a principalelor metode este fcut aici.
3. Politici de Scriere
Politicile de scriere n cache se refer la fluxul de date dinspre procesor spre memoria cache i spre memoria principal. Astfel, difereniem dou situaii:
1. Datele aflate deja n cache trebuie actualizate (write-hit policies). 2. Datele care trebuie scrise nu se afl n cache (write-miss policies). Pentru primul caz problema ce trebuie adresat de politicile de scriere este cea a pstrrii consistenei dintre memoria principal i memoria cache. Cele dou opiuni sunt: write-through: Cnd procesorul emite o cerere de scriere, un cache write-through actualizeaz datele din cache, executnd, eventual, operaia de fetch (dac datele nu se aflau n cache), dar actualizeaz i datele din memoria principal. Avantaj: implementare simpl, asigur uor consistena dintre memorii: dac memoria cache i cea principal au mereu acelai coninut, ele sunt consistente. Dezavantaj: atunci cnd datele sunt actualizate des i la intervale scurte de timp, devine ineficient accesul repetat la memoria principal pentru efectuarea operaiilor de scriere, ducnd la scderea performanei. write-back: Cnd procesorul emite o cerere de scriere, un cache write-back actualizeaz datele din cache, ns nu actualizeaz imediat i pe cele din memorie. Avantaj: prin acest mencanism se elimin traficul inutil dintre cache i memoria principal. Dezavantaje: duce la cerete complexitii hardware-ului, fiind necesar reinerea (marcarea) acelor linii care au devenit inconsistente cu memoria principal. Pentru a marca aceste linii (murdare), se include un indicator suplimentar pe fiecare linie. n momentul evacurii, dac linia este murdar va fi scris n memoria principal. n cazul sistemelor multicore n care avem cache-uri individuale pentru fiecare core/ procesor, care partajeaz memoria principal, pstrarea consistenei devine mai dificil, necesitnd mecanisme i hardware i mai complex (discutat n seciunea 6). n cazul n care datele ce vin de la procesor nu se afl n cache, avem urmtoarele opiuni pentru implementarea scrierii n cache: write-allocate: se aloc o linie n cache pentru datele respective. no-write-allocate: nu se aloc o linie n cache pentru datele respective. fetch-on-write: se aduce linia n cache din memoria principala (sau dintr-un cache de la un nivel superior); implicit se face i alocarea liniei. no-fetch-on-write: dac se foloseste i optiunea write-allocate atunci linia este scris doar n cache i invalidat, altfel cu no-write-allocate datele sunt actualizate direct n memoria principal (write-around). Folosirea opiunii write-allocate poate duce la poluarea cache-ului. O metod de optimizare a performanelor cache-ului, prin minimizarea numrului de cache missuri, se foloseste de felu n care este implementat scrierea. De obicei, ntre CPU i cache avem cel puin un buffer n care sunt puse datele ce trebuie scrise. De aceea e bine ca nainte de a cuta datele n cache, s fie nti cutate n acest buffer. n multe cazuri avem operaii de read imediat dup cele de write. Aceast tehnic o putei gsi descris i sub numele de Priority to Read Misses Over Write.
4. Funcia de mapare
O caracteristic de baz a memoriei cache este funcia de mapare (de translatare), care atribuie unui bloc din memoria principal o locaie din memoria cache. Se pot utiliza trei tehnici: mapare direct mapare asociativ mapare asociativ pe seturi Aceste alternative se vor examina printr-un exemplu. Se consider o memorie cache de 1024 (1K) octei. Datele se transfer ntre memoria principal i memoria cache n blocuri de cte 8 octei. Aceasta nseamn c memoria cache are 128 de linii de cte 8 octei fiecare. Memoria principal const din 64K octei, fiecare octet fiind direct adresabil printr-o adres de 16 bii. Se poate considera c memoria principal const din 8K blocuri de cte 8 octei fiecare. Deoarece exist un numr mai mic de linii ale memoriei cache fa de numrul blocurilor memoriei principale, este necesar un algoritm pentru plasarea blocurilor memoriei principale n liniile memoriei cache. n plus, este necesar un mijloc de a determina care bloc al memoriei principale ocup la un moment dat o linie a memoriei cache.
Astfel, adresele cuvintelor din memoria principal vor fi interpretate dup formatul prezentat n figura 3, pentru a putea fi mapate pe locaii din cache.
Procedeul prin care se verific existena unui cuvnt n cache este urmtorul (figura 4): 1. Fiind dat o adres A, cache-ul calculeaz cele trei componente. 2. Inspecteaz valoarea C[Aline]valid. 3. Dac nu are coninut valid, cuvntul nu este rezident i are loc un cache-miss. 4. Dac linia are coninut valid, se inspecteaz valoarea C[Aline]tag i se compar cu Atag. 5. Dac cele dou etichete nu se potrivesc, are loc un cache-miss. 6. Dac etichetele se potrivesc, are loc un cache-hit i cuvntul este rezident n C[Aline]
data[Aword]
Figura 4. Diagrama procedeului de lucru pentru memoria cache mapat direct Figura 5. Exemplu de mapare direct pentru un cache de 1K i memorie principal de 64K
asociativ permite ca o locaie de memorie s fie mapat n mai multe linii de cache; un cache complet-asociativ permite unei locaii de memorie s fie mapat pe orice linie. Din moment ce acum datele necesare ar putea fi oriunde n cache, cutarea lor este mai complex i realizarea hardware este mai mare i consum mai mult energie. Totui, memoriile cache asociative pot avea un factor de miss mult mai mic dect cele mapate direct. Din moment ce un bloc de cuvinte poate fi mapat pe oricare linie din cache (figura 8), nu se mai poate identifica indexul liniei prin intermediul adresei. De aceea formatul folosit de ctre maparea complet asociativa este cel descris n figura 6.
Valoarea
ce identific cuvintele dintr-un bloc (linie) este construit, ca i la memoria , care reprezint
cache mapat direct, din ultimii k cei mai puin semnificativi bii. Valoarea identificatorul (eticheta) blocului de cuvinte este dat de restul biilor.
Dup traducerea adresei pentru a realiza operaia de fetch, trebuie s analizm problema gsirii liniei n momentul iniierii unei operaii de citire. Datorit modului n care s-a depus n cache linia mapat, este necesar a efectua o cutare n ntregul su cuprins. Pentru c memoria cache trebuie s fie foarte rapid, o cutare liniar (sau chiar binar) nu este o opiune; trebuie investigate toate liniile n paralel, cea ce mrete complexitatea hardware a logicii asociate cacheului, ducnd i la costuri mai mari. Procedeul prin care se verific existena unui cuvnt n cache este urmtorul (figura 7): 1. Fiind dat o adres A, cache-ul calculeaz cele dou componente. 2. Se inspecteaz toate valorile Ctag i se compar cu valoarea Atag. 3. Dac nici una din etichete nu se potriveste, are loc un cache-miss. 4. Dac o etichet se potrivete, se inspecteaz valoarea C{Atag}valid. 5. Dac linia nu are coninut valid, cuvntul nu este rezident i are loc un cache-miss. 6. Dac linia este valid, are loc un cache-hit i cuvntul este rezident n C{Atag}data[Aword] Obs: C{Atag} = C[i], unde C[i]tag = Atag
Figura 7. Procedeul prin care se verific existena unui cuvnt n cache pentru maparea complet asociativ
Figura 8. Exemplu de mapare complet asociativ pentru un cache de 1K si memorie principal de 64K
unei linii se face ntr-o manier complet-asociativ. Ca i n cazurile anterioare, este necesar calcularea anumitor valori pentru poziionare n memoria cache i identificare unic. Aword = A mod Cwords Aset = [A div Cwords] mod Cset Atag = [A div Cwords] div Cset Valoarea Aword identific indexul cuvntului n cadrul blocului (liniei), Aset identific indexul setului, iar Atag este eticheta blocului. Formatul adresei cuvintelor pentru maparea set asociativ este prezentat n figura 9.
Procedeul prin care se verific existena unui cuvnt n cache este urmtorul (figura 10): 1. Fiind dat o adres A, cache-ul calculeaz cele trei componente. 2. In cadrul setului Aset se inspecteaz toate valoarile C[Aset]tag i se compar cu valoarea Atag. 3. Dac nici una dintre etichetele din cadrul setului nu coincide cu Atag are loc un cache-miss. 4. Dac o etichet se potrivete, se inspecteaz valoarea C[Aset]{Atag}valid. 5. Dac linia nu are coninut valid, cuvntul nu este rezident i are loc un cache-miss. 6. Dac linia este valid are loc un cache-hit i cuvntul este rezident n C[Aset]{Atag}data[Aword] Obs: C[Aset]{Atag} = C[Aset][i], unde C[Aset][i]tag = Atag
Figura 10. Procedeul prin care se verific existena unui cuvnt n cache pentru maparea set asociativ
Figura 11. Exemplu de mapare set asociativ pentru un cache de 1K cu 2 linii pe set i memorie principal de 64K
Pentru a nlocui o linie n cadrul unui segment, vom urma una dintre politicile de evacuare. Am putea selecta LRU. Pentru c N este de dimensiuni reduse (2, 4, 8), este fezabil alegerea unei politici de evacuare foarte eficiente precum LRU. Aceast opiunea este neviabil pentru memoriile complet asociative datorit faptului c acolo exist prea multe posibiliti pentru a permite o realizare eficient i acceptabil ca pre.
procesorului unul sau mai multe core-uri pot partaja acelai cache i numrul de niveluri poate varia n funcie de costurile i utilitatea procesorului. Ideea din spatele implementrii este c L1 cache se va ocupa de majoritatea accesrilor memoriei, ntr-un timp foarte scurt, fiind separat n memorie cache de date i memorie cache de instruciuni. Cele pe care nu le poate deservi vor fi preluate de celelalte niveluri de cache, n locul memoriei principale. Pentru a avea o oarecare eficien, acest mecanism se bazeaz pe valabilitatea principiului localitii. Exist dou filozofii de construcie a memoriei cache pe niveluri: 1. cache exclusiv liniile evacuate din cache L1 sunt trimise n cache L2 i aa mai departe. Aducerea liniilor n memoria cache L1 se face direct, deci rapid. 2. cache inclusiv liniile din cache L1 sunt prezente mereu n toate nivelele de cache. Evacuarea liniilor este mai rapid.
n imagine sunt prezentate cele patru nuclee ale procesorului. Nucleele au un cache L1 pentru date, unul pentru instruciuni i un cache L2 unificat. Chiar dac nucleele au propriul set de regitrii, cache L1 i L2, ele partajeaz memoria cache L3 i memoria principal. Aceast structur aduce pe lng beneficii i noi probleme. Astfel, n sistemele multi-procesor simetrice, memoriile cache ale diferitelor procesoare nu pot lucra independent. Toate procesoarele trebuie s vad, la un anumit moment de timp, exact aceleai date n memorie. Meninerea acestei uniformiti a vederii memoriei poart numele de asigurarea coerenei memoriei cache. Pentru cazul cel mai ntlnit, al memoriilor cache de tip write-back, dac un procesor ar analiza doar coninutul propriului cache nu ar vedea liniile murdare din cache-urile celorlalte procesoare. O soluie deloc eficient ar fi furnizarea accesului la cache-ul unui procesor ctre celelalte procesoare. O alt soluie, mai eficient, are la baz detectarea de ctre celelalte procesoare/ nuclee a inteniei unui procesor/nucleu de a scrie n propriul cache. Dac s-a detectat o operaiune de scriere n cache-ul altui procesor, celelalte procesoare i vor marca linia respectiv ca invalid. Cnd vor dori s acceseze acea linie, va avea loc o operaie de fetch din memoria principal. Memoriile cache avansate ofer suport pentru tehnici de snooping. Cnd un procesor cere o linie murdrit de alt procesor, procesorul care a murdrit acea linie detecteaz (snoops in on the other processors) cererea i transmite linia direct n cache-ul primului procesor, eventual scriind-o i n memoria principal n proces. Pentru meninerea coerenei memoriei cache s-au dezvoltat numeroi algoritmi, cel mai important fiind MESI (Modified, Exclusive, Shared, Invalid). Numele acestuia provine de la cele patru stri n care se poate afla o linie din cache, cele mai importante tranziiile dintre acestea fiind date de urmtoarele condiii: o linie murdar este prezent n cache-ul unui singur procesor cel care a murdrit-o
copii curate ale aceleiai linii se pot regsi n orict de multe cache-uri
Partajarea memoriei principale i a cache-ului n sistemele multicore i multiprocesor reprezint o problem complex i necesit o tratare separat, de aceea accentul acestui laborator nu este pus pe aceast tematic. Mai multe informaii putei s gsiti n articole de pe site-urile din domeniu [1] [2] sau n articole academice.
Bibliografie
[1] J. Hennessy, D. Patterson. Computer Architecture: A quantitative approach, 4th ed. [2] D.Page. A Practical Introduction to Computer Architecture, Springer, 2009 [3] W. Stallings. Computer Organization & Architecture, Pearson Education, Prentice Hall, 2003 [4] N. Jouppi. Cache Write Policies and Performance, 1991 [5] S. Berg. Cache Prefetching, 2002. pdf download [6] Software Techniques for shared cache multi-core systems: http://software.intel.com/en-us/ articles/software-techniques-for-shared-cache-multi-core-systems/, last accessed 16.11.2011 [7] Effective Use of the Shared Cache in Multi-core Architectures: http://drdobbs.com/embeddedsystems/196902836, last accessed 16.11.2011