Practicum talstelsels

advertisement
1COSY1 - 4
http://www.voti.nl/1COSY1
P 1 van 6
Caching
Dit is een individueel practicum.
Student
Sudienummer
In dit practicum gaan we rekenen aan cache systemen en werken met een cache simulator.
Een cache is een geheugen dat tussen een hoofdgeheugen en de gebruiker van dat hoofdgeheugen in
zit. Het cache geheugen is kleiner maar sneller dan het hoofd geheugen. Het doel van de cache is om
zo veel mogelijk geheugen benaderingen (met name lees acties) door de cache te laten afhandelen,
zodat het lijkt of het gecombineerde geheugen systeem (cache + hoofdgeheugen) de omvang van het
hoofdgeheugen heeft, maar de snelheid van het cache geheugen.
Een cache kan je bv vinden tussen de processor en het RAM geheugen (processor cache), maar ook
tussen de processor en een harde schijf (disk cache), of tussen de processor en het internet (web
cache). Voor normaal computer gebruik is vooral de processor cache onontbeerlijk: zonder de cache
zou je computer tergend traag zijn.
We gaan nu eerst wat rekenen. Ga uit van de volgende gegevens (realistisch voor een moderne CPU):
reactiesnelheid hoofdgeheugen
reactiesnelheid cache geheugen
100 μs
1 μs
Om de gemiddelde snelheid van dit geheugensysteem uit te rekenen moeten we ook nog weten
hoeveel hits door de cache worden afgehandeld en hoeveel door het tragere hoofdgeheugen. Als de
cache een hitrate heeft van 80%, dus 80% van de geheugen operaties wordt door de cache
afgehandeld, en 20% door het hoofdgeheugen, dan is dan de gemiddelde snelheid van het geheugen
systeem 0.8 * 1 μs + 0.2 * 100 μs = 20.8 μs. Dat is dus al bijna 5 keer zo snel als hoofdgeheugen,
maar nog wel iets meer dan 4 keer zo langzaam als het cache geheugen.
Als de hitrate 95% is, dus 95% van de geheugen operaties wordt door de cache afgehandeld, en 5%
door het hoofdgeheugen, wat is dan de gemiddelde snelheid van het geheugen systeem? (voor wie dit
niet uit z’n hood kan: Start > run > calc )
1COSY1 - 4
http://www.voti.nl/1COSY1
P 2 van 6
We willen de snelheid van het geheugensysteem flink willen verbeteren. Reken uit wat zinniger is:
a) de snelheid van de cache verhogen (tot bv 0.1 μs)
b) de hitrate van de cache verhogen (tot bv 98%)
Als zeer eenvoudige vuistregel kan je aannemen dat een geheugen-met-cache systeem goed
ontworpen is als ongeveer de helft van de totale geheugen reactietijd wordt bepaald door het
hoofdgeheugen en de andere helft door de cache. De miss-rate (= 1 – hitrate) is dan ongeveer gelijk
aan de verhouding van de snelheden van de cache en het hoofdgeheugen.
Wat moet de hitrate ongeveer zijn voor ons 100 μs / 1 μs geheugensysteem om aan dit criterium te
voldoen?
Een cache is (behalve aan de reactiesnelheid van het systeem) niet waarneembaar voor de gebruiker
(‘transparant’). De truuk van een goede cache is dat hij die geheugen regels (geheugen adressen +
bijbehorende inhoud) bevat die de gebruiker gaat gebruiken. Let op: ‘gaat’ is toekomst. Helaas kan
ook een cache de tekomst niet voorspellen, dus bij het bepalen welke data regels hij moet opslaan kan
hij alleen uitgaan van het verleden. (Resultaten behaald in het verleden…)
De meeste software gebruikt het geheugen niet ‘random’. Als instructie N wordt uitgevoerd, zal in de
meeste gevallen daarna instructie N+1 worden uitgevoerd. Een programma bevat vaak korte loops,
dus het is ook redelijk waarschijnlijk dat in de nabije toekomst instructie N weer wordt uitgevoerd. Als
data op adres Y wordt opgevraagd, dan is er een redelijke kans dat snel daarna de data op adres Y
weer wordt opgevraagd, of anders wel data in de buurt van adres Y. Deze effecten worden localiteit
genoemd.
Wat gebeurt er als de gebruiker (= processor) een geheugen adres opvraagt? Eerst checkt de cache of
hij die geheugen regel heeft opgeslagen. Als dat zo is dan wordt de aanvraag door de cache
afgehandeld, en de processor krijgt dus met de snelheid van de cache de geheugenwaarde
aangeleverd. Zit het opgevraagde adres niet in de cache, dan moet het hoofdgeheugen benaderd
worden, en de processor en cache zitten stil totdat het langzame hoofdgeheugen de waarde heeft
geleverd. Deze waarde wordt aan de processor gegeven en die kan verder. Gezien het
bovengenoemde verschijnsel van localiteit is het waarschijnlijk dat ditzelfde geheugenadres in de
nabije toekomst weer zal worden opgevraagd, dus de cache moet dit adres en de bijbehorende waarde
gaan opslaan. Maar de cache zit al vol, dus er moet een adres dat nu in de cache zit worden
weggegooid.
Welk adres moet er worden weggegooid? Daarvoor zijn in de loop der tijd een aantal strategieën
ontwikkeld, bv:
a) Gooi het oudste (= langst niet gebruikte) adres weg (LRU = least recently used)
b) Gooi het oudste (= langst geleden geladen) adres weg (FIFO)
c) Gooi een willekeurig adres weg (Random)
De eerste optie lijkt op het eerste gezicht erg logisch (en werkt in de praktijk ook erg goed), maar
heeft als nadeel dat er extra hardware in de cache moet worden ingebouwd om van ieder adres te
1COSY1 - 4
http://www.voti.nl/1COSY1
P 3 van 6
onthouden hoe lang geleden het gebruikt is. Bij gelijkblijvende prijs gaat dit ten koste van iets anders,
vaak van de omvang van de cache. De laatste optie lijkt nogal dom, maar werkt in de praktijk voor
een processor cache bijna net zo goed als de alternatieven. FIFO werkt bijna net zo goed als LRU, en
vereist veel minder extra hardware. Voor een disk cache telt het nadeel van ‘extra hardware’ niet
omdat de administratie in software kan worden uitgevoerd. Disk caches, en bv ook de web cache van
je brouwser, gebruiken daarom meestal LRU.
We gaan nu werken met de cache simulator op
http://myweb.lsbu.ac.uk/%7Echalkbs/research/CacheApplet.htm (die link staat natuurlijk ook op de
webpagina van dit practicum). De simulator start in een browser window:
Stel de simulator als volgt in:
Capacity
Speed
Watch
Replacement
Program
Block
Placement
Met de
8
fast
Hits
LRU
Loop, size=6
1-word
Fully associative
knop kan je door het programma heen stappen. Het is een kort lusje:
MOV
MOV
MOV
MOV
LOOP: ADD
MOV
MUL
MOV
CMP
BLE
STP
#0,R0
#0,R1
#2,R1
R1,R2
#1,R0
R0,R2
R1,R0
R1,R2
#256, R0
LOOP
0
Als je door de eerste 8 instructies stapt zie je dat ze worden uitgevoerd en dat de instructies worden
opgeslagen in de (voorheen lege) cache. De volgende twee instructies (CMP #256,R0 en BLE 8) zijn de
9e en 10e, en overschrijven dus de oudste (eerste twee) instructies in de cache (LRU replacement). Na
de “BLE 8” zijn we weer terug bij de 5e instructie, en die zit nog in de cache, en wordt dus door de
cache geleverd. Je ziet de cache entry even opflikkeren. Het zelfde geld voor de volgende instructies:
de loop is korter dan de cache, dus alle instructies in de loop worden (op de eerste keer na) door de
cache geleverd. Uiteindelijk kom je op een STP (= STOP) instructie en je kan links in de simulator zien
wat de performance van de cache is geweest.
1COSY1 - 4
http://www.voti.nl/1COSY1
P 4 van 6
In deze test zijn 42 van de 53 geheugen benaderingen door de cache geleverd, de hitrate is dus 79%.
Wat is, met de snelheden die we eerder aannamen, de gemiddelde snelheid van dit geheugensysteem,
voor dit stukje code?
Welke instructies veroorzaken de cache misses? Wat zal er met de cache hit rate gebeuren als we de
lus niet 7 maar heel vaak (bv 10000 keer) doorlopen?
We hebben nu het LRU replacement algoritme gebruikt, wat in dit geval prima werkte. Selecteer nu
het (theoretisch wat minder goede) FIFO replacement algoritme en test het uit. Je moet de simulator
eerst stoppen en clearen voor je de instellingen kan veranderen en opnieuw kan starten. Wat is het
resultaat van FIFO replacement ten opzichte van LRU replacement? Hoe verklaar je dit? Zou Random
replacement een ander resultaat opleveren?
1COSY1 - 4
http://www.voti.nl/1COSY1
P 5 van 6
Test nu met het “loop, size=12” programma. Zoals de naam al aangeeft is de loop body nu niet 6 maar
12 instructies lang:
MOV #0,R0
MOV R0,TEMP
LOOP:
MUL
MOV
MOV
DIV
MOV
ADD
MOV
ADD
MOV
MOV
CMP
BNE
STP
#0,R4
#2,R1
#4,R5
R5,R1
#2,R2
R2,R3
TEMP,R0
#1,R0
R0,TEMP
#10,R4
R4,R0
LOOP
0
TEMP: DS 1
Bepaald de hitrate met LRU replacement, en met een verschillende cache sizes, en reken de
gemiddelde snelheid van het geheugen systeem uit (met de bekende aannames):
Cache size
Hit rate in %
Snelheid in μs
0
8
16
32
De hit rate bij een cache size van 8 is veel lager dan bij het eerste programma. Verklaar dit.
1COSY1 - 4
http://www.voti.nl/1COSY1
P 6 van 6
Met een cache size van 16 is de hit rate natuurlijk beter dan bij een size van 8. Maar bij het verder
verhogen van de cache size naar 32 neemt de hit rate niet meer toe. Verklaar dit.
Bij een cache zoals we die tot nu toe hebben bekeken kan iedere cache regel een willekeurig geheugen
adres bevatten. Als de cache moet opzoeken of hij het adres dat de processor opvraagt opgeslagen
heeft, dan moet hij dus alle regels bekijken. Vergelijk dit met een bibliotheek waar alle boeken op een
willekeurige plaats kunnen staan. Als je daar snel wil opzoeken heb je 1 assisent per boek nodig: jij
schreeuwt de titel, alle assistenten vergelijken die titel tegelijk (= parallel) met hun boek, en de gene
die het boek heeft schreeuwt terug. Dit is snel, en er zijn geen beperkingen aan waar je een boek kan
opslaan, maar je hebt veel hardware (= assistenten) nodig. Voor een chip betekent dit dat er veel chip
oppervlak gebruikt moet worden voor de comparatoren (een comparator neemt veel meer ruimte in
beslag dan de geheugencel voor het adres), en omdat de comparatoren allemaal tegelijk moeten
werken verbruiken ze dus allemaal stroom, en dat veroorzaakt warmte, wat tegenwoordig vaak een
groter probleem is dan chip oppervalk.
Een oplossing hiervoor is om niet het hele adres te vergelijken, maar een deel, bv alles behalve de
laagste 2 bits. De adressen 0..3, 4..7, 8..11, etc worden zo op 1 hoop gegooid. Dit sluit goed aan bij
moderne RAM hardware: die kan een blok van 4 opeenvolgende adressen bijna net zo snel leveren als
1 los adres. We cachen dus niet meer per adres, maar per blok van 4 adressen.
Gebruik de simulator nu met de volgende settings, kijk wat er gebeurt, en noteer de hit rate. Verklaar
waarom deze cache vorm, met veel minder hardware dan een block=1-word cache, toch beter
presteert.
Capacity
Speed
Watch
Replacement
Program
Block
Placement
Paraaf docent
8
fast
Hits
LRU
Loop, size=6
4-word
Direct mapped
Download