Memoria Associativa

Transcript

Memoria Associativa
Cache associativa
Possibili alternative per il trasferimento di un blocco dalla
memoria inferiore alla memoria superiore:
1. Indirizzamento diretto (già visto). Ogni blocco della memoria
inferiore può essere mappato in un unico blocco della memoria
superiore.
2. Alternativa estrema: indirizzamento completamente associativo.
Ogni blocco della memoria inferiore può essere mappato in un
qualsiasi blocco della memoria superiore.
3. Soluzione intermedia: indirizzamento semi-associativo (o setassociativo). Ogni blocco della memoria inferiore può essere
mappato in un insieme di blocchi della memoria superiore.
vantaggi
e
svantaggi
1)
il controllo di presenza
dato è molto semplice
(bit validità + tag)
non è possibile scegliere
quale blocco
“riscrivere”
2)
c’è completa libertà di
scelta del blocco da
“riscrivere”
il controllo di presenza
dato è molto complesso
(scansione memoria)
3) C’è abbastanza libertà di scelta del blocco da “riscrivere”.
Il controllo "presenza dato" è in parte diretto e in parte a
scansione.
Cache set-associativa
In una memoria set-associativa un blocco rimane associato
univocamente ad un insieme di blocchi mentre rimane libera la sua
posizione all’interno dell’insieme.
L’associazione blocco/insieme-di-blocchi è data da:
Indirizzo di blocco (nella memoria inferiore)
modulo Numero di insiemi della cache.
Il numero di insiemi della cache dipende dalla dimensione della
cache e dalla dimensione dell’insieme.
Se l’insieme contiene s elementi si parla anche di
memoria associativa ad s vie
Esempio. Consideriamo il blocco di indirizzo 12 ed i tre tipi di
indirizzamento in una memoria che può contenere 8 blocchi.
set-associativo
diretto
associativo a 2 vie
compl. associativo
0 1 2 3 4 5 6 7
12 modulo 8 =4
0 1 2
4 5 6 7
3
12 modulo 4 = 0
Nota. Ogni tipo di indirizzamento può essere visto come una
variante di un indirizzamento set-associativo:
Diretto
= associativo ad una via
Completamente associativo = associativo ad m vie, dove m è il
numero di parole nella cache.
Esempio.
Si considerino tre cache di 4 blocchi di una parola. La prima è ad
indirizzamento diretto, la seconda è associativa a 2 vie e la terza è
completamente associativa.
Per ogni tipo di cache, trovare il numero di miss per la seguente
sequenza di indirizzi: 0, 8, 0, 6, 8.
Indirizzamento diretto:
C1
0
8
0
6
8
0 mod 4 = 0
8 mod 4 = 0
0 mod 4 = 0
6 mod 4 = 2
8 mod 4 = 0
miss
miss
miss
miss
miss
La situazione finale per C1 è:
Val
Y
N
Y
N
Tag
… . 010
Dato
Mem[8]
… . 001
Mem[6]
Per la cache associativa a 2 vie deve essere prima stabilita una
regola per decidere quale blocco dell’insieme viene scritto.
La regola più comune è quella che prevede di riscrivere l’elemento
che è stato referenziato (in lettura o scrittura) meno recentemente
Least Recently Used (LRU).
Associativa a 2 vie: 2 insiemi di 2 elementi ciascuno
0
8
0
6
8
C2
Set
blocco
0 mod 2 = 0
0
8 mod 2 = 0
1
0 mod 2 = 0
0
6 mod 2 = 0
1
8 mod 2 = 0
0
miss
miss
hit
miss
miss
La situazione finale per C2 è:
Y ......0100
N
Blocco 0
Mem[8]
Y
0011
Blocco 1
Mem[6]
Completamente associativa:
0
8
0
6
8
Set
0
0
0
0
0
C3
blocco
0
1
0
2
1
miss
miss
hit
miss
hit
La situazione finale per C3 è:
Y
Y
Y
N
.. 00000
.. 01000
.. 00110
Mem[0]
Mem[8]
Mem[6]
Blocco 0
Blocco 1
Blocco 2
Blocco 3
Unico insieme
Ricerca di un blocco in una cache set-associativa
•Consideriamo una cache associativa con 2k insiemi di m blocchi
di una parola ciascuno.
•Consideriamo un blocco (nella memoria principale) di byteindirizzo i:
31
k+2 | k+1
Tag
Indice
2|1
0
Offset
Il campo Indice è formato da k bit sufficienti per individuare uno
dei 2k insiemi della cache.
Se il campo Tag viene scritto nella cache assieme al dato (e al bit
di validità), la presenza del blocco i nella cache può essere
verificata:
•selezionando l’insieme di indirizzo Indice,
•confrontando, in parallelo, gli m campi Tag memorizzati con
quello del dato cercato.
Esempio.
Consideriamo una cache a 4 vie con 28 insiemi.
31
10| 9
Tag
Indice
2|1
0
Offset
Il campo Indice contiene gli 8 bit che individuano un insieme, il
campo Tag fornisce gli altri 22 bit che permettono di individuare il
blocco all’interno dell’insieme.
A parità di dimensioni della cache, aumentando il livello di
associatività (ovvero considerando insiemi di cardinalità
maggiore)
•diminuisce il numero degli insiemi (e quindi il numero di bit del
campo indice),
•aumenta la dimensione del campo Tag ,
•aumenta il numero di confronti che devono essere fatti in
parallelo.
Esempio. Dimezzando il numero di insiemi:
•si raddoppia la cardinalità di ciascun insieme;
•si diminuisce il campo Indice di un bit
•si aumenta il campo Tag di un bit.
Tag
Tag
Indice
Indice
L’aumento del campo Tag e del numero di confronti che devono
essere fatti in parallelo ha chiaramente un costo sia in termini di
tempo che di complessità dell’hardware.
Questo costo deve essere contriobilanciato dalla diminuzione del
miss rate per rendere conveniente la scelta associativa.
La scelta di quale blocco sostituire, all’interno di un dato insieme,
influenza certamente il miss rate.
Cache a più livelli
Abbiamo visto che non si può ottenere un sensibile aumento delle
prestazioni finchè non si riesce a ridurre il tempo totale dedicato
alla gestione dei miss
Questo si può ottenere utilizzando più cache a vari livelli.
Esempio.
Supponiamo
•di avere un processore con una CPIideale (senza stalli di
memoria) di 1.0 e una frequenza di clock di 500MHz;
•che un accesso alla memoria principale (con gestione dei miss)
costi 200ns;
•che il miss rate per istruzione sulla cache (primaria) sia del 5%.
Calcoliamo CPIstalli cioè il valore di CPI nel caso reale in cui ci
siano gli stalli
Con una frequenza di 500MHz, un ciclo di clock ha durata di 2ns.
La miss penality è quindi di 200ns/2ns = 100 cicli di clock
Osserviamo che in questo caso è noto il miss rate per istruzione e
non quello "per ascessi alla memoria". Il numero totale di miss è
quindi 5% × I.
Il numero di cicli di clock spesi per stallo di memoria si ottiene
quindi moltiplicando il miss rate per istruzione per il numero di
istruzioni e per la miss penality: 5% × I ×100 = 5 × I
CPIstalli = CPIbase + 5 = 6
Supponiamo di inserire tra la cache primaria e la memoria
principale una cache secondaria
•sufficientemente grande da abbassare il miss rate sulla memoria
principale al 2% ,
•con tempo di accesso di 20ns.
Che miglioramento otteniamo?
- La miss penality per un accesso alla memoria secondaria è di
20ns/2ns = 10 cicli.
- In caso che si debba accederere sia alla cache secondaria che
alla memoria principale (miss sulla secondaria) la miss penality
sale a 100 + 10 =110 cicli.
-
Il numero di miss sulla cache primaria che vengono risolti in
quella secondaria è (5% − 2% ) × I,
Pertanto:
•il numero medio di cicli di stallo per istruzione per miss nella
cache primaria che vengono risolti in quella secondaria è
(5% − 2% ) × 10 = 0.3
•il numero medio di cicli di stallo per istruzione per miss in
entrambe le cache è 2% × 110 = 2.2
Il valore di CPI che tiene conto degli stalli di memoria sui due
livelli di cache è: 1.0 + 0.3 + 2.2 = 3.5.
L’uso della cache secondaria ha portato un miglioramento di
6.0/3.5 = 1.7 volte