Jag lär mig logiken för cacheminnen. Jag undrar om du kan verifiera att jag förstod rätt. Om ett cacheminne i taggfältet har 16 bitar, det inställda fältet har 10 bitar och byten i blockfältet är 6 bitar, då kan jag härleda från endast den informationen att kapaciteten är 128 kbyte och att den är 2-vägs inställd associerande med blockstorlek 64 byte eftersom 2⁶ = 64 byte från byten i blockfältet. 2¹⁰ = 1024 men kan någon annan kapacitet med något annat associativitetstal uppfylla kraven?
Jag lär mig att formlerna är
antal block = kapacitet / blockstorlek
antal uppsättningar = antal block / #associativitet
Därför Jag kunde fördubbla både associativiteten till 4-vägs men jag kunde inte uppfylla kraven med ett 4-vägs cache eftersom det var Du behöver ytterligare antal bitar i det inställda fältet.
Förstod jag rätt?
Svar
Hjälper den här bilden dig att förstå hur associativa cacher fungerar strukturellt?
lånat från här
I ett nötskal bestämmer blockoffsetbitarna din blockstorlek (hur många byte som finns i en cacherad, hur många kolumner om du vill). Indexbitarna avgör hur många rader som finns i varje uppsättning. Cache-kapaciteten är därför 2 ^ (blockoffsetbits + indexbits) * #sets. I det här fallet är det 2 ^ (4 + 4) * 4 = 256 * 4 = 1 kilobyte.
För samma storlek cache (kapacitet), om du skulle gå från 4-vägs till två- sätt uppsättning associativ, det tvåvägs associativ, kan du göra det genom att antingen fördubbla raderna i varje uppsättning eller genom att fördubbla kolumnerna i varje uppsättning, det vill säga fördubbla antalet cachelinjer eller fördubbla blockstorleken.
Om du skulle välja att fördubbla antalet rader, skulle du sluta med att din 12-bitars adress delades in i ett 5-bitarsindex och en 4-bitars blockoffset och lämnade en 3-bitars tagg.
Om du skulle välja att fördubbla blockstorleken skulle du sluta med att din 12-bitars adress delades upp i ett 4-bitarsindex, en 5-bitars blockoffset, och lämnade en 3-bitars tagg.
Så för att upprepa det, tror jag att de styrande formlerna för associerande cachar är:
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 ditt ursprungligen angivna exempel gör jag inte ” t tror att du kan härleda storleken på cachen baserat på storleken på dina respektive adressbitfält utan att anta något om ut associativiteten. Om är det 2-vägs associativt kan du säga:
Cache Capacity = (2 ^ 6) * (2 ^ 10) * (2) = 2 ^ 18 = 2 ^ 8 kilobyte = 256 kilobyte. Jag är inte säker på hur du kom med 128 kilobyte. Det skulle vara fallet om det var 1-vägs associativ (direkt mappad).
För en 128 kB (2 ^ 17 byte) cachekapacitet, du kunde skapa en 4-vägs associativ cache med en 64 byte blockstorlek genom att säga:
2^17 = 2^6 * (Blocks per Set) * 4 Blocks per Set = 2^17 / 2^6 / 2^2 = 2^9 = 512
… och allokerar därför 9 indexbitar, 4 block offsetbitar och resten (19) taggbitar.