Gerarchia di memoria - Università del Salento

annuncio pubblicitario
Gerarchia di memoria
1
Gerarchia di memoria: Terminologia
• Hit: il dato appare in qualche blocco al livello superiore (Es.: Blocco X)
– Hit Rate: la frazione degli accessi di memoria trovati nel livello superiore
– Hit Time: tempo per accedere al livello superiore che consiste in
RAM access time + tempo per determinare hit/miss
• Miss: il dato deve essere estratto dal livello inferiore (Blocco Y)
– Miss Rate = 1 - (Hit Rate)
– Miss Penalty: tempo per sostituire un blocco nel livello superiore +
tempo per consegnare il blocco al processore
• Hit Time << Miss Penalty
Al processore
Dal processore
Memoria di
liv. superiore
Memoria di
liv. inferiore
Blocco X
Blocco Y
2
Il tempo necessario alla risoluzione di un fallimento nell’accesso alla cache
dipende sia dalla latenza della memoria sia dalla sua ampiezza di banda.
La latenza determina il tempo necessario a recuperare la prima parola del
blocco, mentre l’ampiezza di banda è responsabile del tempo richiesto per
accedere alla parte rimanente del blocco.
3
Gerarchia di memoria
Registri
1KB
1 ciclo
Cache L1
(dati o
istruzioni)
32KB
2 cicli
Cache L2
2MB
15 cicli
Memoria
1GB
300 cicli
Disco
80 GB
10M cicli
4
Gerarchia di memoria: Apple iMac G5 1.6 GHz
Gestiti da
compilatore
Gestiti da
hardware
Gestito da OS,
hardware,
applicazione
Reg
L1 Istr
L1 Dati
L2
DRAM
Disco
Dimensioni
1K
64K
32K
512K
256M
80G
Latenza
1 ciclo,
3 cicli,
3 cicli,
11 cicli,
88 cicli,
107cicli,
0.6 ns
1.9 ns
1.9 ns
6.9 ns
55 ns
12 ms
5
L1 (64K Istruzioni)
Regi
stri
512K
L2
(1K)
L1 (32K Dati)
6
4 Domande per la gerarchia di memoria
• D1: Dove può essere posto un blocco nel livello superiore?
(Block placement)
• D2: Come si fa a trovare un blocco se è a livello superiore?
(Block identification)
• D3: Quale blocco deve essere sostituito in occasione di un
miss?
(Block replacement)
• D4: Cosa accade in occasione di una write?
(Write strategy)
7
D1: Dove può essere posto un blocco nel
livello superiore?
• Blocco 12 posto in una cache di 8 blocchi:
Posizione di partenza nella cache =
Indirizzo del blocco in memoria Modulo Numero di linee per via
01234567
01234567
01234567
1111111111222222222233
01234567890123456789012345678901
8
D2: Come si fa a trovare un blocco se è a
livello superiore?
• Aumentando l’associatività si restringe index, si
espande tag
9
D3: Quale blocco deve essere sostituito in
occasione di un miss?
• In una write miss, si può scegliere di portare il blocco nella
cache (write-allocate) o no (write-no-allocate)
• In una read miss, si deve sempre portare il blocco nella
cache (località spaziale e temporale) – ma, se non ci sono
blocchi vuoti, quale blocco sostituire?
non c’è scelta per cache direct-mapped
prendere a caso la via da sostituire
sostituire la via least-recently used (LRU)
sostituzione FIFO (round-robin)
10
D4: Cosa accade in occasione di una write?
Le letture costituiscono il tipo dominante di accesso alla cache. Tutti gli
accessi per le istruzioni sono in lettura e la maggior parte delle istruzioni
non scrive dati in memoria.
Fortunatamente, il caso più frequente è anche quello che si può rendere
veloce più facilmente. Si può leggere un blocco della cache nello stesso
momento in cui si legge e si confronta il suo tag, in modo che la lettura di
un blocco inizi non appena è disponibile il suo indirizzo. Se la lettura è un
accesso con successo, la porzione di blocco richiesta viene
immediatamente trasferita al processore. Se, invece, si tratta di un
accesso con fallimento, non si trae beneficio da questa strategia, ma non
ci sono nemmeno conseguenze negative, se si eccettua un maggior
consumo di potenza: basta ignorare il valore che è stato letto.
Un tale ottimismo non è consentito quando si tratta di operazioni di
scrittura. La modifica di un blocco non può iniziare prima che sia
terminata la verifica del suo tag, per essere certi che l’accesso avvenga
con successo. Così, le operazioni di scrittura sono solitamente più lente
11
delle operazioni di lettura.
Write Buffer per Write-Through Caches
Processore
Cache
Memoria
di livello
inferiore
Write Buffer
Contiene dati in attesa di write-through alla memoria
di livello inferiore
Così la CPU non va in stallo
Burst di writes sono comuni
12
Migliorare le prestazioni delle cache
• Tempo di accesso medio in memoria
(Average memory access time - AMAT)
AMAT = hit time + miss rate * miss penalty
– Ridurre miss rate
– Ridurre miss penalty
– Ridurre hit time
13
Tipi di Cache Misses
• Compulsory misses: avvengono la prima volta che si
accede ad una parola di memoria – i miss di una cache
infinita
• Capacity misses: avvengono poiché il programma ha
“toccato” molte altre parole prima di toccare di nuovo la
stessa parola – i miss per una cache fully-associative
• Conflict misses: avvengono poiché due parole hanno un
mapping alla stessa locazione nella cache – i miss generati
se si passa da una cache fully-associative ad una directmapped
14
Ridurre miss rate
• Blocchi di grande dimensione – riduce
miss compulsory, riduce miss penalty
in caso di località spaziale – aumenta il
traffico tra differenti livelli, spreco di
spazio, e miss di conflitto
• Grandi cache – riduce miss di
capacità/conflitto – penalità in tempo di
accesso
• Alta associatività – riduce miss di conflitto – 2-way cache di capacità N/2
ha più o meno la stessa miss rate di 1-way cache di capacità N – penalità in
tempo di accesso
• Predizione della via – predicendo la via, il tempo di accesso è prossimo a
quello di una cache direct-mapped – può anche ridurre il consumo di
potenza
15
Ridurre miss penalty
• Cache multilivello
• Critical word first
• Priorità per le letture
• Victim caches
16
Ridurre Miss Penalty: cache multilivello
AMAT = HitTimeL1+MissRateL1MissPenaltyL1
MissPenaltyL1= HitTimeL2+MissRateL2MissPenaltyL2
MissPenaltyL2= HitTimeL3+MissRateL3MissPenaltyL3
• Proprietà di esclusione
– Se un blocco è nella cache L1, esso non è mai nella
cache L2
– Risparmia spazio in L2
• Proprietà di inclusione
– Se un blocco è nella cache L1, esso deve essere
anche nella cache L2
17
Ridurre Miss Penalty: Early Restart e
Critical Word First
• Non attendere l’intero blocco prima di far ricominciare la CPU
• Early Restart & Critical Word First
– Il trasferimento di un blocco prende tempo (bus troppo stretto)
• Early restart
– Quando la parola necessaria arriva, lasciare che il processore la usi
– Quindi continuare il trasferimento del blocco per riempire la linea di
cache
– Località spaziale
tende a volere la prossima parola in sequenza,
così non è chiaro il beneficio nell’adottare solo early restart
• Critical Word First
– Trasferire la parola loaded prima, quindi il resto del blocco
(con wrap-around per ottenere l’intero blocco)
– Usarlo con early restart per far sì che il processore riprenda appena
possibile
18
– Lunghi blocchi più popolari oggi
Critical Word 1st largamente usata
Ridurre Miss Penalty: priorità read/write
• Per cache writeback/thru, le write ai livelli inferiori sono poste in un
write buffer
• Quando si ha un read miss, si deve cercare nel write buffer prima di
controllare il livello inferiore
• Quando si ha un write miss, se il buffer contiene blocchi modificati, gli
indirizzi possono essere controllati per vedere se l’indirizzo del nuovo
dato si accorda con quello di una entry valida del write buffer: in tal caso,
il nuovo dato è combinato con quella entry
• Le read sono più urgenti delle write (la probabilità di un’istruzione in
attesa del risultato di una read è 100%, mentre la probabilità di
un’istruzione in attesa del risultato di una write è molto più piccola) –
quindi, le read hanno la precedenza a meno che il write buffer non sia
pieno
19
Ridurre Miss Penalty: Victim Caches
• Una cache direct-mapped soffre dai miss poiché pezzi
multipli di dati corrispondono alla stessa locazione
• Il processore spesso tenta di accedere a dati che ha
recentemente scartato – tutti gli scarti sono posti in una
piccola victim cache (4 o 8 entries) – la victim cache è
controllata prima di andare ad L2
• Può essere vista come associatività addizionale per alcuni
insiemi che tendono ad aver più conflitti
• In generale, miss che abbiamo nella nostra cache set
associativa ad N vie, ma che non avremmo avuto se la
cache fosse stata fully associative
20
Ridurre Miss Penalty: Prefetching di
istruzioni & dati
• Prefetching si basa sull’avere extra bandwidth di
memoria che può essere usata senza penalità
• Prefetching di istruzioni
– Tipicamente, la CPU estrae 2 blocchi ad ogni miss: il blocco
richiesto ed il prossimo blocco consecutivo
– Il blocco richiesto è posto nella cache di istruzioni, ed il blocco
prefetched è posto nel buffer dello stream di istruzioni
• Prefetching di dati
– I dati prefetched sono posti in L2
21
Ridurre Hit Time: piccole e semplici cache
• Selezionare una linea (index) e quindi confrontare i tag prende tempo
Piccole cache possono aiutare poiché memorie più piccole
•
richiedono meno tempo per index
– Per es., le cache L1 sono state della stessa dimensione per 3 generazioni di
microprocessori AMD: K6, Athlon, ed Opteron
– Anche una cache L2 abbastanza piccola da entrare su un chip con il processore evita
la time penalty di andare off chip
• Semplice
direct mapping
– Si può sovrapporre il controllo del tag con la trasmissione del dato poiché non c’è
scelta da effettuare
• Stime dei tempi di accesso:
Access time (ns)
2.50
1-way
2.00
2-way
4-way
8-way
1.50
1.00
0.50
16 KB
32 KB
64 KB
128 KB
Cache size
256 KB
512 KB
1 MB
22
Ridurre Hit Time: Way Prediction
• Come combinare I piccoli hit time di cache Direct Mapped ed avere
pochi conflict misses di cache set associative a 2 vie?
• Way prediction: la predizione della via tiene dei bit extra nella cache per
predire la “via” del prossimo accesso alla cache
– Per la via selezionata, si comporta come una cache direct mapped (“Si può
sovrapporre il controllo del tag con la trasmissione del dato poiché non c’è
scelta da effettuare”)
– Miss
controlla gli altri blocchi nel prossimo ciclo di clock
Hit Time
Way-Miss Hit Time
Miss Penalty
• Accuratezza ≈ 85%
• Inconveniente: per la pipeline è difficile se l’hit può prendere 1 o 2 cicli
23
Aumento di Bandwidth: Pipelining
• Pipeline dell’accesso in cache per mantenere la bandwidth,
ma latenza maggiore
– Essenziale per cache L1 ad alta frequenza
» Anche piccole cache hanno latenze di 2-3 cicli ad N GHz
– Usata anche in molte cache L2
-
penalità più alta in caso di branch mispredetti
più cicli di clock tra l’emissione di un load e l’uso del dato
24
Aumento di Bandwidth: Non-Blocking
• Idea: sovrapporre la latenza dei miss con lavoro utile
– Detto anche “latency hiding”
• Cache non-blocking
– Una cache blocking serve un accesso alla volta
» Mentre un miss è servito, altri accessi sono bloccati (wait)
– Una cache non-blocking rimuove questa limitazione
» Mentre un miss è servito, può trattare altre richieste
• Hit Under Miss
– Permette cache hit mentre un miss è in progresso
– Ma un altro miss deve attendere
• Miss Under Miss, Hit Under Multiple Misses
– Permette hit e miss quando altri miss sono in progresso
– Aumenta significativamente la complessità del controllore della cache
poiché ci possono essere parecchi accessi in memoria in sospeso
– Richiede banchi di memoria multipli
25
Scarica