Lite hjälp med datorarkitektur

Permalänk

Lite hjälp med datorarkitektur

Hej!

Sitter under sommaren och försöker fila av det sista på min utbildning till civilingenjör i datateknik med inriktning mot inbyggda system. Håller på att plugga till en tenta i datorarkitektur och är lite ringrostig på det här med minnesadresser kontrar cache. Vi antar byteadresserat minne, i min kurs 4 byte för varje instruktion (32 bitars).

Jag kommer ihåg att adresserna består av olika fält: Tag, set/index/block och offset. Det jag har rört ihop lite är vad de olika fälten innebär och behöver lite hjälp med att se om jag kommer ihåg rätt.

Om vi börjar från höger och går till vänster.
| Tag | Set/Index/Block | Offset |

1. Offset. Detta bestämmer var i minnesblocket jag vill titta, vilken byte jag vill använda? Dock skulle jag gärna vilja ha detta fältet förklarat så enkelt som möjligt.

2. Set/Index/Block. Detta anger vilket minnesblock jag vill använda är någonstans? Detta blocket kan då i sin tur innehålla ett antal byte där jag kan hitta specifika byte genom att använda offset? Har jag förstått detta rätt?

3. Tag. Detta förstår jag används för att försäkra sig om att man har hittat rätt data. Men jag förstår inte riktigt mekanismen bakom det. Jag förstår att om tagen överensstämmer med den i cacheadressen så är det en hit men hur funkar mekanismen? Är det tagfältet i minnesadressen som jag jämför med cacheadressen?

Försöker nöta detta så gott det går, men behöver som sagt lite hjälp att förstå detta igen. Skriver på telefonen så lite knepigt för tillfället att rita bilder på vad jag menar 😅

Tack på förhand!

Visa signatur

Nuvarande rigg: CPU: AMD R7 3700X, RAM: G.Skill Flare X, GPU: EVGA 1080Ti FTW3, Moderkort: Gigabyte GA-AX370-Gaming K7 (F51g), HDD: Samsung 840 SSD Pro Basic, WD Black Caviar 1TB SATA II, CPU-kylare: Corsair H115i (Noctua NF-A14), Chassi: Fractal Design R5, PSU: Seasonic Prime GX 1000

Permalänk
Medlem

Ett litet exempel kan nog belysa saker

Antag till att börja med att ingen MMU är inblandad, utan virtuella addresser är identiska med fysiska addresser. Detta bara för att inte krångla till saker i onödan.

Antag att vi har 128kB cache, och varje cache-linje innehåller 64 byte data. Då har vi 128k/64 = 2048 cache-linjer (eller cache-block).
Antag även att det är en direkt-mappad cache, vilket innebär att en given minnesaddress mappas mot exakt en cache-linje.

Eftersom addressrymden är mycket större än cachen så kommer ju många olika minnesaddresser att mappas till samma cache-linje.

64-bytes cache-linje betyder att vi behöver 6 bitar för att välja byte inom blocket. De 6 bitarna motsvarar "Offset" i din modell, och är de 6 minst signifikanta bitarna i addressen.
2048 olika cache-linjer innebär 11 bitar för att ange vilken cache-linje som används. Dessa motsvarar "Index" i din modell.

Återstående 32-(11+6) = 15 bitar blir Tag.

En given cache-linje innehåller förutom de 64 bytes data, även 15 (i det här fallet) bitar Tag, och en Valid bit.

Vid en läsning så används Index för att välja rätt cache-linje. Cachens Valid bit kollas för att se om det överhuvudtaget finns riktig data i cache-blocket.
Sedan jämförs minnesaddressens Tag fält med Tag fältet i cachen. Är de lika så är det rätt minnesblock som ligger lagrat i cachen, och det blir en cache-träff. Om Tag fälten inte matchar så var det något annat minnesblock som låg i cachen, och det blir en cache-miss.

Vid en skrivning så slår man upp rätt cache-block via Index, skriver datat till cachen och det riktiga minnet, sätter cachens Valid bit, och sätter cache-blockets Tag fält till samma som minnesaddressen.

Ovanstående är nästintill enklast möjliga cache-implementation, och sådana används i verkligheten.
Det finns dock en hel del extra finesser som ofta används och krånglar till det och gör att det krävs extra bitar i cachen:

Write-back cache kontra write-through (ovanstående är write-through)
Associativ cache (där en minnesaddress kan mappas mot flera cache-linjer
Virtually indexed/Physically tagged kontra Virtually Indexed/Virtually tagged cache (när man har virtuella minnesaddresser som översätts till fysiska)
Flera nivåer av cachear med olika egenskaper
Multi-CPU system som delar på en eller flera cache-nivåer och där koherens mellan CPUerna behöver upprätthållas
Och så vidare....

Permalänk

Tackar så mycket för hjälpen Erik!

Du gjorde det betydligt mer klarare, men nu kommer följdfrågorna haha.

För att sammanfatta i koppling till ditt exempel: Offset anger vilken byte i linjen som ska användas, Index anger vilken linje ska användas och tagen som bekräftar att detta är den datan från minnet som just ligger i cachen. Tagen är alltså mer eller mindre en identifierare för datat i cachen och minnet om jag förstår rätt? Valid-biten ringer en klocka i bakhuvudet men ska kika lite mer på det, även skriv-strategier som write-back och write-through.

Har även en del om set-associativa cacher. Om jag inte minns fel så gör detta att du kan ha ett block/linje som är mappad mot samma tag, men du särskiljer de olika blocken från varandra genom set-bitarna? Eller är det tvärt om?

"En given cache-linje innehåller förutom de 64 bytes data, även 15 (i det här fallet) bitar Tag, och en Valid bit."
Här blev jag lite osäker på vad du menar. Jag har en linje som har plats för 64 bytes data, men också 15 bitar tag säger du. Är detta inne i blocket där datat faktiskt ligger eller är det utanför i adressfältet? Alltså har jag i verkligheten 64*8-(15+1) bitar för faktisk data?

Återkommer om write-back och write-through vid ett senare tillfälle då läraren förklarade det lite knepigt.

Visa signatur

Nuvarande rigg: CPU: AMD R7 3700X, RAM: G.Skill Flare X, GPU: EVGA 1080Ti FTW3, Moderkort: Gigabyte GA-AX370-Gaming K7 (F51g), HDD: Samsung 840 SSD Pro Basic, WD Black Caviar 1TB SATA II, CPU-kylare: Corsair H115i (Noctua NF-A14), Chassi: Fractal Design R5, PSU: Seasonic Prime GX 1000