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