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