Jeg lærer logikken til hurtigminnene. Jeg lurer på om du kan bekrefte at jeg har forstått det riktig. Hvis et hurtigminne i taggfeltet har 16 bits, settfeltet har 10 biter og byten i blokkfeltet er 6 bits, så kan jeg utlede fra bare den informasjonen at kapasiteten er 128 kbyte og at den er 2-veis satt assosiativ med blokkstørrelse 64 byte fordi 2⁶ = 64 byte fra byten i blokkfelt. 2¹⁰ = 1024, men kan en annen kapasitet med noe annet assosiativitetstall tilfredsstille kravene?
Jeg lærer at formlene er
antall blokker = kapasitet / blokkeringsstørrelse
antall sett = antall blokker / #associativity
Derfor Jeg kunne doblet både assosiativiteten til 4-veis, men jeg kunne ikke tilfredsstille kravene med en 4-veis cache fordi det var Du trenger et annet antall biter i det angitte feltet.
Forsto jeg riktig?
Svar
Hjelper dette bildet deg å forstå hvordan assosiative cacher fungerer strukturelt?
lånt fra her
I et nøtteskall bestemmer blokkforskyvningsbitene din blokkstørrelse (hvor mange byte som er i en cache-rad, hvor mange kolonner hvis du vil). Indeksbittene bestemmer hvor mange rader som er i hvert sett. Kapasiteten til hurtigbufferen er derfor 2 ^ (blockoffsetbits + indexbits) * #sets. I dette tilfellet er det 2 ^ (4 + 4) * 4 = 256 * 4 = 1 kilobyte.
For samme størrelse cache (kapasitet), hvis du skulle gå fra 4-veis til to- måte sett assosiativt, det toveis assosiativt, kan du gjøre det ved enten å doble radene i hvert sett eller ved å doble kolonnene i hvert sett, det vil si å doble antall cachelinjer eller doble blokkstørrelsen.
Hvis du velger å doble antall rader, vil du ende opp med at 12-biters adressen din blir brutt inn i en 5-biters indeks og en 4-biters blokkforskyvning, og etterlater en 3-biters tag.
Hvis du velger å doble blokkstørrelsen, vil du ende opp med at 12-biters adressen din blir delt inn i en 4-biters indeks, en 5-biters blokkforskyvning, og etterlater en 3-biters tag.
Så for å gjenta det, tror jeg de styrende formlene for assosierende cacher er:
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)
I det opprinnelig uttalte eksemplet, gjør jeg ikke » t tror du kan utlede størrelsen på hurtigbufferen basert på størrelsen på de respektive adressebitfeltene uten å anta ut assosiativiteten. Hvis er det 2-veis assosiativ, kan du si:
Cache Capacity = (2 ^ 6) * (2 ^ 10) * (2) = 2 ^ 18 = 2 ^ 8 kilobyte = 256 kilobyte. Jeg er ikke sikker på hvordan du kom opp med 128 kilobyte. Det ville være tilfelle hvis det var 1-veis assosiativ (direkte kartlagt). kunne lage en 4-veis assosiativ cache med 64 byte blokkstørrelse ved å si:
2^17 = 2^6 * (Blocks per Set) * 4 Blocks per Set = 2^17 / 2^6 / 2^2 = 2^9 = 512
… og derfor tildele 9 indeksbiter, 4 blokkeringsforskyvningsbiter , og resten (19) tagbiter.