Învăț logica amintirilor cache. Mă întreb dacă puteți verifica dacă am înțeles corect. Dacă există o memorie cache în câmpul etichetei are 16 biți, câmpul setat are 10 biți și octetul din câmpul blocului este 6 biți, atunci pot deduce doar din acele informații că capacitatea este de 128 kbyte și este asociat în două direcții asociativ cu dimensiunea blocului 64 octeți, deoarece 2⁶ = 64 octeți din octetul din câmpul blocului. p>
Aflu că formulele sunt
numărul de blocuri = capacitate / blocuri
numărul de seturi = numărul de blocuri / # asociativitate
Prin urmare Aș putea dubla atât asociativitatea la 4 direcții, dar nu am putut satisface cerințele cu o memorie cache cu 4 direcții, deoarece este foarte bună uld necesită un alt număr de biți în câmpul setat.
Am înțeles corect?
Răspuns
Vă ajută această imagine să înțelegeți cum funcționează cache-urile asociative structural?
împrumutată de la aici
Pe scurt, biții de decalare a blocului determină dimensiunea blocului (câte octeți sunt într-un rând de cache, câte coloane dacă doriți). Biții index indică câte rânduri sunt în fiecare set. Capacitatea cache-ului este de 2 ^ (blockoffsetbits + indexbits) * #sets. În acest caz, acesta este 2 ^ (4 + 4) * 4 = 256 * 4 = 1 kilobyte.
Pentru aceeași dimensiune cache (capacitate), dacă ar fi să treceți de la 4 direcții la două- set asociativ, este asociat în două sensuri, puteți face acest lucru fie dublând rândurile din fiecare set, fie dublând coloanele din fiecare set, adică dublând numărul de linii cache sau dublând dimensiunea blocului.
Dacă ar fi să alegeți să dublați numărul de rânduri, ați ajunge cu adresa dvs. de 12 biți întreruptă într-un index de 5 biți și un bloc de 4 biți, lăsând o etichetă de 3 biți.
Dacă ar fi să alegeți să dublați dimensiunea blocului, ați ajunge cu adresa dvs. de 12 biți întreruptă într-un index de 4 biți, un offset de bloc de 5 biți, lăsând o etichetă de 3 biți.
Deci, pentru a reitera, cred că formulele de guvernare pentru cache-urile asociative sunt:
Cache Capacity = (Block Size in Bytes) * (Blocks per Set) * (Number of Sets) Index Bits = LOG2(Blocks per Set) Block Offset Bits = LOG2(Block Size in Bytes) Tag Bits = (Address Bits) - (Index Bits) - (Block Offset Bits)
În exemplul dvs. menționat inițial, nu ” Nu cred că puteți deduce dimensiunea cache-ului pe baza mărimii câmpurilor de biți de adresă respective fără a face o presupunere abo ut asociativitatea. Dacă este asociativ bidirecțional, atunci puteți spune:
Capacitatea cache = (2 ^ 6) * (2 ^ 10) * (2) = 2 ^ 18 = 2 ^ 8 kilobytes = 256 kilobytes. Nu sunt sigur cum ați venit cu 128 kilobyte. Acest lucru ar fi cazul dacă ar fi asociativ cu o singură direcție (mapat direct).
Pentru o capacitate de cache de 128kB (2 ^ 17 octeți), ar putea crea o memorie cache asociativă cu 4 căi cu o dimensiune a blocului de 64 de octeți spunând:
2^17 = 2^6 * (Blocks per Set) * 4 Blocks per Set = 2^17 / 2^6 / 2^2 = 2^9 = 512
… și, prin urmare, alocând 9 biți index, 4 biți offset bloc , iar restul (19) etichetă biți.