25.12.2014 Views

Laboration 2

Laboration 2

Laboration 2

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Laboration</strong> 2<br />

Ange antalet adressbitar i tag-fältet för en fullt associativt avbildande cache med storleken 8 ord samt blockstorleken<br />

1 ord om huvudminnets storlek är 64 kord.<br />

Svar: _____________________________________________________________________________________<br />

——————————————————————————————————— Slut på hemuppgift 2.3<br />

Vi skall nu studera en direkt-avbildande cache genom att exekvera programmet example0.<br />

Uppgift 2.4<br />

Gå ur simulatorn och starta den med det första programmet (cache example0). Peka på cachen och tryck på<br />

vänster musknapp. Du får då upp en popup-meny i vilken du väljer Change. Du kan nu välja cacheorganisation.<br />

Välj cache-storlek enligt uppgift 2.3. Välj blockstorlek 1 samt antal mängder så att cachen blir direkt-avbildande.<br />

Ändra dock inga andra fält. Stäng därefter fönstret med Close .<br />

I Cache-menyn väljer du nu Contents som skapar ett fönster i vilket du kan studera cacheinnehållet.<br />

———————————————————————————————————— Slut på uppgift 2.4<br />

Varje rad i cachen mostvarar ett block. Till varje block hör en statusbit V, en tag samt blockinnehållet. V biten<br />

(Valid) anger om blocket innehåller giltig data (jfr. med Figur 2.4).<br />

Uppgift 2.5<br />

Gör nu reset och exekvera programmet stegvis genom att trycka på Step . Följ hela tiden med i programlistan<br />

så att du vet vilka instruktioner som exekveras. Fortsätt tills cachen fyllts. Tryck ytterligare en gång och notera<br />

noga vilket block som byts ut.<br />

Vilket block byts ut och varför<br />

Svar: _____________________________________________________________________________________<br />

Vilken instruktion hämtades in i cachen<br />

Svar: _____________________________________________________________________________________<br />

Fortsätt nu stegvis tills hela loopen ligger i cachen. Studera därefter cachens beteende genom att låta ett antal steg<br />

exekveras i halvfart. Detta gör du genom att skriva in ett antal (välj 32) i fältet No of steps. Tryck därefter på<br />

Visual . Cachen blinkar till vid träff och minnet vid miss.<br />

Det genereras två missar per varv i loopen. Vilka adresser motsvarar dessa<br />

Svar: _____________________________________________________________________________________<br />

Varför genereras missar vid just dessa adresser<br />

Svar: _____________________________________________________________________________________<br />

———————————————————————————————————— Slut på uppgift 2.5<br />

11<br />

<strong>Laboration</strong> 2<br />

Trots att hela adressrymden som loopen refererar till får plats i cachen erhålls missar. Detta beror på en svaghet<br />

hos direkt-avbildande cachar som går under benämningen konfliktmissar (eng. conflict misses) eller “bumps”.<br />

Utbytesalgoritmer<br />

Antalet konfliktmissar, dvs situationer där två minnesadresser konkurrerar om samma block i cachen, kan minskas<br />

genom att välja en mängd-associativ cache med färre antal mängder än antal block i cachen. Extremfallet motsvaras<br />

av fullt associativa cachar.<br />

För alla cachar som inte är direkt-avbildande är det inte självklart vilket block som skall bytas ut då man erhåller<br />

en cache-miss. Många algoritmer är tänkbara men måste förkastas pga att de ej går att implementera till rimlig kostnad.<br />

Vi skall studera tre utbytesalgoritmer, nämligen Random, FIFO och LRU.<br />

Vid Random (eller pseudo-random) väljs det block som skall bytas ut slumpmässigt. Denna algoritm kan approximeras<br />

med round-robin som är ganska lätt att implementera. I simulatorn är Random implementerad genom<br />

slumptalsdragning.<br />

Vid FIFO (First In First Out) bytes det block ut som funnits längst tid i cachen. Denna algoritm kan implementeras<br />

exakt genom att associera en räknare till varje block. Vid varje blockutbyte inkrementeras samtliga räknare. Det<br />

block vars räknare har högst värde byts ut. Räknarens storlek definieras av antalet block i setet. Nackdelen med<br />

denna algoritm är främst att det block som varit längst i cachen nödvändigtvis inte behöver vara det som är minst<br />

refererat.<br />

LRU (Least Recently Used) tar hänsyn till referensintensiteten till varje block. Man associerar en räknare till varje<br />

block. Räknaren nollställs då blocket refereras. Övriga räknare inkrementeras. Vid utbyte väljs det block vars räknare<br />

har högst värde. Räknaren kan teoretiskt behöva vara hur stor som helst. I praktiken räcker det med ett fåtal<br />

bitar (många implementeringar använder endast en bit). I simulatorn anges räknarens värde under R i fönstret med<br />

cachens innehåll.<br />

Val av utbytesalgoritm påverkar kostnaden för cachen på grund av de statusbitar som behövs för beslutsfunktionen.<br />

Uppgift 2.6<br />

Gör nu cachen i förra uppgiften fullt associativ och välj LRU som utbytesalgoritm. Exekvera tills cachen fyllts.<br />

Studera speciellt hur räknarnas värden förändras.<br />

Vilket block kommer att bytas ut vid nästa referens och varför Ledning: Studera räknarnas värde för de olika<br />

blocken<br />

Svar: _____________________________________________________________________________________<br />

Verifiera resultatet!<br />

Fortsätt nu tills hela loopen finns i cachen och exekvera sedan programmet i halvfart 32 steg.<br />

Vilken minnesoperation ger upphov till att både cachen och minnet blinkar<br />

Svar: _____________________________________________________________________________________<br />

Hur många missar genereras per varv och varför<br />

Svar: _____________________________________________________________________________________<br />

_________________________________________________________________________________________<br />

12

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!