memoria cache

Transcript

memoria cache
S
D
I
Memoria cache
Corso di Laurea in Ingegneria dell’Informazione
Università degli Studi di Firenze
AA 2008/2009
Introduzione
Il problema delle prestazioni dei calcolatori copre diversi aspetti, ma con l’aumentare delle prestazioni in termine di
frequenza di clock dei microprocessori, uno degli aspetti più critici è diventato il tempo di accesso alla memoria. Dal
momento che non è possibile, o economicamente vantaggioso costruire la memoria centrale del calcolatore con RAM
statiche molto veloci, per la realizzazione della memoria centrale del calcolatore avviene utilizzando RAM dinamiche,
che in termini di prestazioni, sono notevolmente (20 volte) più lente delle statiche.
Questo squilibrio in termini di prestazioni può essere parzialmente coperto utilizzando una piccola parte di memoria
statica con la funzione di tampone fra il processore e la memoria centrale del calcolatore. Questo gruppo di memorie è
detto cache. Nella figura seguente sono rappresentate le reciproche relazioni fra CPU, cache e memoria centrale.
CPU
Cache
Memoria
Centrale
La cache quindi memorizza in maniera temporanea parti della memoria centrale e le rende disponibili al processore con
tempi di accesso molto rapidi. Naturalmente non tutti i dati che sono in memoria centrale possono essere
contemporaneamente all’interno della cache in quanto questo comporterebbe una dimensione della cache pari a quella
della memoria centrale, pertanto se riesco a trovare il dato in cache (hit) ho un accesso molto veloce, altrimenti la cache
deve andare a cercarlo nella memoria centrale e trasferirlo al proprio interno (miss). Si parla quindi di ‘hit’ quando si
riesce a leggere il dato voluto dalla cache, altrimenti si parla di un ‘miss’.
Principio di località
Il principio teorico su cui si basa la cache e che permette di ottenere tassi di hit di almeno 0.8è rappresentato dal
comportamento che normalmente ha un programma durante la sua esecuzione. Tale comportamento è basato su due
principi fondamentali: il principio di località temporale ed il principio di località spaziale.
Il principio di località spaziale enuncia che in un certo intervallo di tempo un programma accederà a celle di memoria
spazialmente vicine o accederà nuovamente alla stessa cella mi memoria più volte, mentre il principio di località
temporale dice che un programma eseguirà normalmente le sue istruzioni in maniera sequenziale, garantendo così
un'alta probabilità che la prossima cella di memoria letta sia contigua all’attuale. Se pensiamo quindi di memorizzare
all’interno della cache non solo una locazione di memoria, ma anche le locazioni ad essa contigue (solitamente indicate
come linea di cache), abbiamo una alta probabilità che la cella di memoria letta successivamente sia già presente in
cache.
Prestazioni
Se supponiamo di avere un calcolatore senza memoria cache, il tempo di lettura medio può essere indicato con:
Tnoncache = t rd
dove
t rd è il tempo medio di accesso e lettura ad una memoria dinamica.
La stima dei tempi medi di lettura per un calcolatore con cache è leggermente più complicato, in quanto è necessario
considerare il tasso di hit, cioè la frazione di letture che è possibile effettuare direttamente in cache, rispetto alle letture,
che oltre ad un accesso alla cache richiedono anche una lettura dalla memoria centrale. Nel caso in cui si ha un miss,
infatti al tempo di lettura in cache deve essere aggiunto anche il tempo di lettura dalla memoria centrale. Detto quindi h
il tasso di hit e m=1-h il tasso di miss possiamo esprimere il tempo medio di accesso alla memoria con la seguente
equazione
Tcache = ht rs + m(t rs + t rd ) = ht rs + (1 − h)(t rs + t rd ) = ht rs + t rs + t rd − ht rs − ht rd = t rs + t rd − ht rd
dove t rs è il tempo medio di accesso e lettura ad una memoria statica.
Per valutare la convenienza di utilizzare un sistema con cache dobbiamo verificare quando il tempo di accesso di tale
sistema è minore del tempo di accesso di un sistema tradizionale, pertanto dalla relazione
Tcache < Tnocache
otteniamo:
t rs + t rd − ht rd < t rd
t rs < ht rd
da cui possiamo dedurre che esistono vantaggi nell’utilizzo della cache allorquando il tasso di hit riesce a sopravanzare
la lentezza della memoria, in altre parole supponendo che
t rd = kt rs ,
k >> 1
si ottiene
t rs < hkt rs
hk > 1
dal momento che k è normalmente almeno dell’ordine di 20, per avere vantaggi nell’utilizzo di una cache dobbiamo
avere un tasso di hit maggiore di 1/20, e quindi di almeno il 5%. Se consideriamo che il tasso di hit si attesta
normalmente intorno all’80%, abbiamo un buon margine nel miglioramento delle prestazioni.
Memoria Cache a Mappatura Diretta
La cache a mappatura diretta prevede che una linea di memoria sia sempre memorizzata in una sola linea di cache. Per
ottenere questo risultato è necessario che la memoria indirizzabile sia un multiplo intero della dimensione della cache.
Ogni unità di memoria con dimensione pari a quella della cache è detto blocco.
Linea i
blocco 0
Ogni linea di cache è
composta da più word
Linea i
blocco 1
Linea i
Linea i
blocco 2
Linea i
blocco 3
Linea i
blocco n-1
Ing. Marius Spinu AA 2008/2009 – Sistemi Operativi
2
Ogni locazione all’offset i di ogni blocco di memoria può essere collocato solo all’offset i del blocco di cache.
Per capire a quale blocco di memoria appartiene una singola linea di cache è necessario costruire un indice dei contenuti
della memoria cache. Questo indice, detto TAG, ha un numero di locazioni pari al numero di linee contenute nella
cache ed ogni locazione del TAG contiene l’indirizzo del blocco a cui la linea in cache appartiene. Considerando che
dobbiamo indirizzare anche la linea all’interno della cache e la word all’interno della linea, un indirizzo generato dal
processore per leggere una parola (e non un byte) in memoria può essere scomposto come nella figura seguente:
dove il campo IB contiene l’indirizzo di blocco (composto da b bit), IL contiene l’indirizzo di linea (composto da l bit)
ed IW contiene l’indirizzo di parola (composto da w bit). In generale a destra di IW sarà presente un campo IS di s bit
atto ad individuare il byte all’interno della parola; se la parola è di 32 bit (4 byte), avremo s=2, mentre se la parola è di
128 bit (16 byte), s assumerà il valore 4.
Prima di procedere nel calcolo dei bit occupati da ciascun campo esaminiamo lo schema interno di una memoria cache a
mappatura diretta, rappresentato nella seguente figura:
Come precedentemente accennato una memoria cache è composta da una DATA RAM che contiene i veri e propri dati,
e da una TAG RAM che contiene l’indice dei contenuti della DATA RAM.
Ogni cella del TAG può contenere altri bit opzionali come il bit di validità (che indica se il contenuto della linea di
cache è ancora valido), il bit di lettura (che indica se la linea è stata letta), ed ulteriori bit per altri scopi (algoritmi di
sostituzione delle linee di cache, livello di accesso alla linea, ecc.)
Dato che una linea di cache contiene normalmente più di una parola, è necessario selezionare tramite il campo IW la
parola all’interno della cache. La linea di cache da mandare in uscita è invece selezionata dal campo IL, mentre il
campo IB viene confrontato con il contenuto del TAG per verificare che la linea selezionata sia del blocco corretto. Nel
caso di comparazione effettuata con successo, il segnale hit (attivo alto) abilita l’uscita del selettore, altrimenti viene
generato il segnale /miss (attivo basso), per segnalare che la locazione non è stata trovata in cache.
Ing. Marius Spinu AA 2008/2009 – Sistemi Operativi
3
Cache completamente associativa
Il limite della cache a mappatura diretta consiste nel non poter memorizzare celle di blocchi diversi con lo stesso offset.
Questo limite è completamente eliminato nella cache completamente associativa, nella quale ogni linea di memoria può
essere collocata in ogni linea della cache. Questo fatto provoca la scomparsa del concetto di blocco, condensando in un
solo elemento i capi IL ed IB della cache a mappatura diretta; tale campo avrà dimensione pari alla somma della
dimensione dei campi IL e IW della cache a mappatura diretta, e sarà convenzionalmente indicato con IX.
Lo schema di una cache completamente associativa è riportato nella figura seguente:
In questo tipo di cache ogni elemento del TAG contiene i t bit di IX più i campi opzionali elencati per la cache a
mappatura diretta. Il contenuto del campo IX deve essere quindi confrontato con ogni elemento del TAG, ottenendo 2l
bit come risultato. Dal momento che la parte DATA della cache è una memoria è deve quindi essere indirizzata con un
indirizzo ad l bit, è necessario codificare il risultato del confronto, tramite l’elemento detto CODIFICATORE e
rappresentato nella figura precedente. Tale elemento ha un comportamento analogo al codificatore a priorità utilizzato
anche nel PIC e genera a partite da N=2n ingressi, la relativa codifica ad n bit.
Il segnale di /hit (attivo basso) è generato come l’AND di tutte le uscite degli XOR che operano come comparatori ed
abilita l’uscita /OE del selettore di parola, che riceve come ulteriore ingresso il campo IW, utilizzato per la selezione
della parola all’interno della linea. Il segnale /READ è il segnale /MRD del processore che abilita la lettura di una cella
di memoria.
Cache associativa a “n” vie
Per avere una versatilità maggiore della cache a mappatura diretta, senza avere la complessità circuitale ed il ritardo di
una cache completamente associativa è stato creato il modello di cache associativa ad n vie in cui la cache (ed i relativi
blocchi in memoria) vengono suddivisi in n parti più piccole permettendo quindi che una linea di memoria possa essere
collocata in uno degli n blocchi di cache, secondo lo schema riportato nella figura seguente:
Ing. Marius Spinu AA 2008/2009 – Sistemi Operativi
4
Linea i
blocco
Linea i
blocco
Linea i
blocco
Linea i
blocco
Linea i
blocco n-1
Linea i
……
…
Linea i
Di seguito, per semplicità di rappresentazione, viene riportato lo schema interno di una cache associativa a 2 vie:
La cache associativa ad n vie, avendo n distinti blocchi di DATA RAM ha bisogno anche di n distinti blocchi di TAG.
Si noti che a parità di dimensione della cache, il blocco di una cache a mappatura diretta è n volte più grande del blocco
di una cache associativa ad n vie.
In questo tipo di cache, come per la cache a mappatura diretta, si ha la scomposizione dell’indirizzo in 4 parti. Il campo
IW seleziona la word in uscita da ognuna delle vie nella DATA RAM, mentre un numero di comparatori pari al numero
di vie è utilizzato per la generazione dei segnali di hit, che vengono messi in OR per generare il segnale generale di hit
(attivo alto) che abilita le uscite dei selettori di parola.
Ing. Marius Spinu AA 2008/2009 – Sistemi Operativi
5
Algoritmi di rimpiazzamento
Una volta che la cache è stata riempita di dati e viene generato un miss, è necessario rimpiazzare le linee di cache con
altre linee provenienti dalla memoria. Esistono tre principali algoritmi di rimpiazzamento, dei quali sono riportate solo
le definizioni, senza gli algoritmi veri e propri che esulano dal contesto del corso.
Algoritmo LRU
L’algoritmo LRU (Least Recently Used) rimpiazza la linea di cache usata meno di recente, sono quindi necessari dei bit
aggiuntivi nel TAG per indicare quale locazione è stata utilizzata meno recentemente
Algoritmo RAND
L’algoritmo RAND rimpiazza una linea in maniera casuale. Questo algoritmo ha prestazioni comparabili con il
precedente, in quanto il numero di bit utilizzabile per segnalare la linea utilizzata meno recentemente è molto limitato e
quindi si ottiene sempre un gruppo di celle passibili di rimpiazzamento, fra le quali la scelta viene effettuata in modo
pseudo-casuale.
Algoritmo FIFO
L’algoritmo FIFO (First In First Out), rimpiazza la cella inserita in cache da più tempo. Si noti che l’algoritmo LRU e
FIFO non operano in maniera analoga, in quanto LRU rimpiazza le celle utilizzate meno recentemente
(indipendentemente da quando esse siano state inserite in cache), mentre il FIFO rimpiazza le celle che sono da più
tempo in cache (indipendentemente da quanto esse siano state utilizzate).
Ing. Marius Spinu AA 2008/2009 – Sistemi Operativi
6