Cache e gerarchia di memoria Cache e gerarchia di memoria Gerarchia di Memoria: motivazioni tecnologiche per caching. Località: perché il caching funziona Processor Input Control Memory Datapath Output Tecnologie I vari tipi di memoria sono realizzati con tecnologie diverse e si differenziano per • Costo per bit immagazzinato • Tempo di accesso (o latenza): ritardo fra l'istante in cui avviene la richiesta e l'istante in cui il dato è disponibile • Modo di accesso (seriale o casuale). Tecnologie • Memorie a semiconduttore con tecnologia VLSI (memoria cache e DRAM) • Memorie magnetiche (memoria secondaria). • Memorie ottiche (memoria secondaria). Memoria interna, principale e secondaria Registri interni alla CPU ° Visibili o no al programmatore ° Memorizzano temporaneamente dati e istruzioni ° Dimensioni: centinaia di bytes ° Tempo di accesso: tempo CPU Memoria principale (DRAM) ° Memorizza dati e istruzioni dei programmi ° La CPU vi accede direttamente Memoria secondaria (dischi, DVD, ..) ° dimensioni: Gbytes, Tbytes ° velocità: decine di millisecondi (milioni di nanosecondi) 1980-2003, CPU più veloce delle DRAM ... D.: come risolvere questa differenza? Prestazioni (1/ latenza) 1000 R.: utilizzare memorie “cache” tra CPU e DRAM. Create a “memory hierarchy”. 0 CPU 60% per yr 2X in 1.5 yrs 1000 CPU Gap grew 50% per year 100 DRAM 9% per yr 2X in 10 yrs 10 1977: Apple II DRAM CPU 1000 ns 19 80 19 90 Anno 20 00 20 05 DRAM: 400 ns Le memorie RAM statiche La cella elementare è costituita da 6 transistori mos che formano un FLIPFLOP. L’informazione permane stabile in presenza della tensione di alimentazione • Tempi di accesso rapidi. • Costi elevati. Le memorie RAM dinamiche ° La cella elementare è costituira da un condensatore che viene caricato (1) o scaricato (0). ° La tensione sul condensatore tende a diminuire (millisecondi) e quindi deve essere ripristinata o rinfrescata ° Tempi di accesso alti La semplicità della cella consente capacità molto elevate in spazi (e costi) contenuti Velocità CPU e DRAM Nell’architettura VonNeuman il canale di comunicazione tra la CPU e la memoria è il punto critico (collo di bottiglia) del sistema. La tecnologia consente di realizzare CPU sempre più veloci e memorie sempre più grandi MA la velocità di accesso delle memorie non cresce così rapidamente come la velocità della CPU Gerarchia di memoria La soluzione ottimale per un sistema di memoria è: ° Costo minimo ° Capacità massima ° Tempi di accesso minimi Soluzione approssimata: GERARCHIA ° Tecnologie diverse possono soddisfare al meglio ciascuno dei requisiti. ° Una gerarchia cerca di ottimizzare globalmente i parametri. Gerarchia di memoria Più livelli di memoria Al crescere della distanza dalla CPU cresce il costo e la capacità di memorizzazione. In ogni istante di tempo i dati sono copiati solamente tra ciascuna coppia di livelli adiacenti, per cui ci si può concentrare su due soli livelli. Caches: latenza Data in upper memory returned with lower latency. Data in lower level returned with higher latency. Da CPU Alla CPU Dati Small, fast Indiirizzi Large, slow 2005 Gerarchia di Memoria: Apple iMac G5 gestiti dal compilatore Reg gestiti da hardware L1 Inst L1 Data L2 Size 1K 64K 32K 512K Latency (cycles) 1 3 3 11 gestiti dal Sistema Oper., da hardware, applicazione DRAM Disk 256M 80G 160 10e7 Obiettivo: creare l’illusione di una grande economica e veloce memoria: cioè che i programmi possano indirizzare uno spazio di memoria grande come un disco alla velocità con cui accedono ai registri interni iMac G5 1.6 GHz ¤1299.00 90 nm, 58 M transistors L1 (64K Instruction) 512K L2 R e gi st er s (1K) CS 152 L14: Cache I L1 (32K Data) PowerPC 970 FX UC Regents Spring 2005 © UCB Latenza: tempi accesso lettura Reg L1 Inst L1 Data L2 DRAM Disk Size 1K 64K 32K 512K 256M 80G Latency (cycles) 1 3 3 11 160 1e7 Latency (sec) 0.6n 1.9n 1.9n 6.9n 100n 12.5m 1.6G 533M 533M 145M 10M 80 Hz Nota: tempi di accesso per accedere un dato in modo casuale per accedere ad un blocco di dati in locazioni adiacenti i tempi di accesso per il secondo, il terzo, .. dato sono inferiori Ad esempio con N banchi di memoria separati posso accedere a N dati con soli N cicli in più del primo (accesso interleaving) Principio di località Un sistema di memoria gerarchico è efficiente se la modalità di accesso ai dati sono prevedibili Il principio di località : in un dato istante i programmi fanno accesso ad una porzione relativamente piccola del loro spazio di indirizzamento (sia dati che istruzioni) ° Località temporale: è probabile che un oggetto a cui si è fatto riferimento venga nuovamente richiesto in tempi brevi (Es: cicli in un programma: le istruzioni sono richieste ripetutamente) ° Località spaziale: è probabile che gli oggetti che si trovano vicini ad un oggetto a cui si è fatto riferimento vengano richiesti in tempi brevi (Es: esecuzione sequenziale in un programma; accesso agli elementi di un vettore) Località dei Programmi Indirizzi di Memoria: un punto per accesso No localita Località Temporale Località Spaziale Time Donald J. Hatfield, Jeanette Gerald: Program Restructuring for Virtual Memory. IBM Systems Journal 10(3): 168-192 (1971) L’algoritmo di caching Località Temporale: mantieni i dati richiesti recentemente vicino alla CPU Località Spaziale: Muovi blocchi contigui di dati nei livelli di memoria più vicini alla CPU Terminologia del Caching Hit: Dati sono nel livello richiesto Miss: dati devono essere reperiti nel livello inferiore Hit Rate: la frazione di dati trovata nel livello richiesto Miss Rate: 1 - Hit Rate Tempo di Hit << Miss Penalty Tempo Hit: tempo di accesso ai datiinclude il costo di non trovare il dato penalità di Miss: tempo di rimpiazzare il blocco mancante + tempo di consegna alla CPU del dato Hit & Miss Si ha hit (successo nell’accesso) quando i dati richiesti dal livello superiore (ad es. il processore) compaiono in qualche blocco nel livello inferiore. Si ha un miss (fallimento nell’accesso) se il dato non è presente nel livello immediatamente inferiore ed occorre accedere al livello più distante. Uno dei parametri principali per la valutazione delle prestazioni di una gerarchia di memoria è l’hit ratio (tasso di hit), ovvero la frazione degli accessi in ram che si sono risolti al livello più vicino. Il miss ratio è definito come 1-hit ratio ed indica la percentuale degli accessi che non sono stati soddisfatti dal livello più vicino nella gerarchia. Tempo di hit: tempo necessario a prelevare il dato dal livello più vicino, comprendendo il tempo necessario a determinare se l’accesso è un hit o un miss. Tempo di miss: tempo necessario a sostituire un dato nel livello più vicino con il blocco corrispondente nel livello inferiore, più il tempo necessario per consegnare il dato al livello richiedente (ad es. il processore). La cache Il termine cache è stato usato per la prima volta per indicare il livello della gerarchia tra la CPU e la memoria principale, ma è oggi utilizzato per indicare qualsiasi tipo di gestione della memoria che tragga vantaggio dalla località degli accessi. Il meccanismo è semplice: Il processore interagisce direttamente SOLO con la cache. Quando il processore richiede una parola non presente nella cache (miss) la parola viene trasferita dalla memoria nella cache Occorre definire dei meccanismi per: 1. Conoscere se un dato è nella cache 2. Nel caso in cui il dato sia presente, conoscere la sua posizione ed accedervi. Queste operazioni devono essere eseguite nel minor tempo possibile, poiché la velocità con cui si riesce ad accedere ai dati nella cache influisce molto sulle prestazioni dell’intero sistema di memoria. Corrispondenza tra indirizzi cache Problema: ad una posizione in cache sono associate più parole di memoria. Come è possibile sapere se il dato presente nella cache corrisponde effetivamente alla parola richiesta? Memoria I tag Oltre ai dati richiesti, la cache deve permettere la memorizzazione di informazioni aggiuntive (tags) che permettano la corretta gestione della gerarchia di memorie. Per associare univocamente una parola di memoria ad una posizione in una cache direct mapped è sufficiente memorizzare, assieme al dato, anche la parte più significativa dell’indirizzo, quella che non corrisponde ai bit utilizzati come indice nella cache. Per distinguere le posizioni della cache contenenti dati validi (es.all’avvio del processore la cache è vuota ed il suo contenuto non è significativo), il metodo più comune è aggiungere un bit di validità. Sfruttare la località spaziale Per trarre vantaggio del principio di località spaziale, è opportuno prevedere che i blocchi della cache siano più ampi di una sola parola. In caso di miss saranno così caricate diverse parole adiacenti che hanno un’elevata probabilità di essere richieste nel prossimo futuro. Ogni linea di cache memorizza più parole e si usa il campo “Offset del blocco” per selezionare la parola richiesta tra quelle presenti nella linea Nota: una linea della cache contiene più dati ma i bit di indirizzo e i tag non sono replicati. Perché? CPU spazio indirizzi: vettore di “blocchi” Block # Nel seguito assumiamo indirizzo di memoria 32-bit blocco di memoria: 32 byte Numero del blocco 0 1 0 2 Byte # 3 memoria 31 32-byte blocks 4 27 bits 5 bits 5 6 Il compito di una cache è di memorizzare le pagine “più popolari” 7 27 2 -1 . . . Cache a corrispondenza diretta-direct mapped A ciascuna parola di memoria corrisponde esattamente una locazione della cache. posizione nella cache= (indir. parola) mod (numero di posizioni in cache) Se il numero di blocchi nella cache e’ 2N allora la posizione corrispondente della parola in cache è data dai N bits meno significativi dell’indirizzo Esempio: Numero di elementi nella cache: 4 Bit per indirizzare una locazione della cache:log2(8)=2 Indirizzo della parola di memoria= 0111 01010 0010 0100 Posizione in cache: 00 (posizione 0) Cache direct mapped Block # Blocchi di un dato colore possono comparire SOLO nella stessa linea di cache 0 1 2 32-bit Memory Address 31 7 6 5 4 0 Numero del blcoo Colore Byte # 25 bits 2 bits 5 bits 3 4 5 6 7 Indica la riga della cache: sono sufficiente 2 bit per specificare un colore fra quattro 32-byte blocks 27 2 -1 . . . Cache Direct Mapped: esempio 31 indirizzo memoria (32 bit) 7 Cache Tag (25 bit) 6 5 Indice Ex: 0x01 24 Cache Tag 0 No. Byte Ex: 0x00 DATI Cache 0 = Hit: si verifica se i 25 bit significativi dell’indirizzo sono uguali a tag memorizzato in cache 4 Bit Validità Byte 31 ... Byte 1 Byte 0 Byte 31 ... Byte 1 Byte 0 Se si verifica Hit il dato viene fornito alla CPU Dimensione di una cache direct mapped Calcolo della dimensione totale di una cache a corrispondenza diretta Il numero totale di bit in una cache a corrispondenza diretta con 2n blocchi è maggiore di: 2n x dim.blocco= 2n x 32 bits Infatti Assumendo che la cache abbia una capacità di 2n parole, e blocchi di 32 bit (4 bytes) il campo tag ha dimensione: 32 – (n+2) bit, (2 bit sono usati per l’offset del byte, indir. su byte), la dimensione è pari a 2n x (dim.blocco+dim.tag+dim.bit validità)= 2n x (32+32-(n+2)+1)= 2n x (63-n) bits Indirizzo i di memoria : un punto per accesso ) I limiti di cache direct-mapped... Cosa succede se i blocchi hanno lo stesso colore? Time Donald J. Hatfield, Jeanette Gerald: Program Restructuring for Virtual Memory. IBM Systems Journal 10(3): 168-192 (1971) Cache Fully associative Nelle cache direct mapped a ciascun blocco della memoria corrisponde una specifica locazione nella cache Cache fully associative (completamente associativa): ogni blocco può essere collocato in qualsiasi locazione della cache Vantaggio: massima utilizzazione della cache Contro: per ricercare un blocco nella cache è necessario cercarlo in tutte le linee della cache. ° La ricerca sequenziale è troppo lenta ° Per velocizzare la ricerca è necessario effettuarla in parallelo, associando un comparatore a ciascuna posizione della cache. COSTO MOLTO ELEVATO Cache Fully Associative Ideali ma costose... 31 5 4 Cache Tag (27 bit) Block # (”Tags”) 26 0 0 No. Byte Cache Data Holds 4 blocks Ex: 0x04 = Byte 31 ... Byte 1 Byte 0 = Byte 31 ... Byte 1 Byte 0 = = Hit: esiste una linea della cache in cui tag indirizzo= tag in cache Bit Validità Se si verifica Hit il dato viene fornito alla CPU Cache set associative Nelle cache direct mapped a ciascun blocco della memoria corrisponde una specifica locazione nella cache. In una cache fully associative ogni blocco può essere collocato in qualsiasi locazione della cache. Un buon compromesso è costituito dalle cache setassociative (anche n-way set associative) : ciascun blocco di memoria ha a disposizione un numero fisso n (>=2) di locazioni in cache. In questo caso la ricerca di un blocco richiede di confrontare il tag in n posizioni In questo modo si trae vantaggio della possibilità senza aumentare il costo di ricerca in modo inaccettabile Cache 2-Set Associative “N-way” set associative -- N è il numero di blocchi di ciascun colore (in fig. 2) Byte Select (4 bits) Index Cache Tag (26 bits) (2 bits) Ex: 0x01 Cache Data Valid Cache Tags Cache Tags Cache Block Cache Block 16 bytes Cache Data Cache Block = Hit Left = Hit Right Hit: il dato è trovato nel blocco a destra o in quello a NOTA: in esempio la dim. blocco è la sinistra metà per mantenere costante il numero di bit dati in cache Valid Cache Block 16 bytes PowerPC 970: 32K 2-way set associative L1 D-cache Cache 4-set associative Politiche di rimpiazzamento in cache Dopo un miss in cache se non ci sono blocchi disponibili, quale blocco bisogna rimuovere dalla cahce (per fare posto al blocco chiesto)? L’ultimo blocco richiesto (LRU)? Blocco scelto a caso (random)? Auspicabile MA difficile da Facile da realizzare; implementare in cache complet. MA è efficiente? associat. Miss Rate per cache 2-way Set Associative Dimens. Random LRU 16 KB 5.7% 2.0% 1.17% 5.2% 1.9% 1.15% 64 KB 256 KB Nota: nel caso 2-way è faciel realizzare LRU Gestione delle operazioni di scrittura Le operazioni di scrittura devono essere gestite in maniera più complessa rispetto alle letture. Se le scritture alterassero solo lo stato della cache e non venissero propagate fino alla memoria principale si creerebbero situazioni di incoerenza Due modalità: write-through: assicurare la coerenza di cache e memoria scrivendo sempre i dati sia nella memoria che nella cache. write back: scrivere solo quando necessario Write through 1. Accedere alla cache usando come indice i bit meno significativi dell’indirizzo 2. Scrivere i rimanenti bit dell’indirizzo nel campo tag, scrivere la parola di dato e settare il bit di validità 3. Scrivere la parola nella memoria principale utilizzando l’indirizzo completo Svantaggi: tutte le operazioni di scrittura implicano scrittura nella memoria principale, durante le quali il processore rimane in fase di stallo. Possibile soluzione: buffer delle scritture. Limiti: processore può generare richieste di scritture ad un tasso maggiore di quello con cui la memoria porta a termine le scritture Nota: per scrivere non è necessario effettuare accessi in lettura alla memoria principale. Write back Una tecnica alternativa che offre prestazioni in genere superiori è il write-back. I blocchi sono effettivamente scritti in memoria principale solo quando è necessario rimpiazzarli nella cache Svantaggio: maggiore complessità implementativa rispetto al write-through Vantaggio: minore numero di accessi alla memoria principale e quindi maggiore efficienza. Infatti, se una variabile viene modificata più volte mentre è in cache si accede alla memoria una sola volta (quando esce dalla cache) Gestione delle scritture Quando si scrive è necessario verificare sempre offset. All’atto della scrittura si confronta il tag in cache con quello associato all’indirizzo in cui scrivere. Se sono uguali è sufficiente aggiornare la parola in cache. Altrimenti è necessario caricare l’intero blocco in cache e quindi riscrivere la parola che ha causato il miss. Politiche di scrittura Write-Through Politica Write-Back I dati sono scritti solo in I dati scritti in cache cache sono anche Si aggiorna la scritti nella memoria di memoria di livello livello infer. inferiore solo quando si ha miss I miss in scrittura producono operazioni di lettura? No Sì Scritture ripetute sullo stesso dato provocano più scritture in memoria di livello inferiore? Sì No Altra questione: le scritture di blocchi NON in cache implicano l’aggiorname nto della cache o solo la scrittura dei dati in memoria di livello inferiore? Prestazioni di cache Tempo esecuz. Numero programma = istruz. progr.* (sec.) Cause di miss • miss obbligatori • miss di conlfitto • miss di capacità Tipicamente miss rate varia da 1% a 15% Cicli clock per istr. * Secondi per ciclo NOTA: il numero di cicli di clock per istr. dipende dal Tempo Medio di Accesso in Memoria per istr. e dati (TMAM) TMAM = Hit Time + (Miss Rate x Miss Penalty) Obiettivo: Ridurre TMAM NOTA: migliorare un fattore può imlicare l’aumento di altri fattori! Cause di miss in cache: Miss di conflitto cache M-way assoc.: N blocchi sono usati che sono in conflitto ma M < N Soluzione: aumentare M (Associatività) Miss Rate Miss rate improvement equivalent to doubling cache size. cache associative . Altre soluzioni Aumenta la dimensione blocco. (perché funziona?) NOTA: aumentare associatività può aumentare hit time aumentare dimensione del blocco (a parità di dimensione della cache può aumentare altri tipi di conflitto Dimens. Cache (KB) Se aumenta Hit time aumenta TMAM TMAM = Hit Time + (Miss Rate x Miss Penalty) Altre cause di miss in cache Miss di capacità Miss obbligatori La Cache non può contenere tutti i blocchi richiesti dal programma La prima volta che si richiede un blocco il Miss è inevitabile Soluzione: aumentare le dimensioni della cache Soluzione: indovinare e caricare PRIMA i blocchi che saranno chiesti nel futuro Miss rates (relativo fra i diversi tipi di conflitto) Obbligatori Dimensione Cache (KB) Miss rate e dimensione dei blocchi D: Perché al crescere della dim. del blocco il miss rate prima diminuisce e poi cresce? Altre domande su cache Quali tipi di miss si verificano in cache associative di dimensioni infinite? R. miss obbligatori: bisogna portare un blcoo in memoria . In una cache associtaiva di dimensione finita, quali tipi di miss si verificano (oltre agli obbligatori)? R. miss di capacità. I programmi possonoi usare più blocchi di quanto entrino in cache. Inoltre quali tipi di miss asi verificano in una cache set-associative o direct-mapped? R. miss di conflitto. Calcola il numero di bit richiesto da cache kset associative. Esempio di accesso ad una cache a corrispondenza diretta La sequenza di accessi considerata Stato Iniziale Primo accesso: 22=MISS Secondo Accesso: 26=MISS Terzo Accesso: 22 = HIT! Quarto Accesso: 26 = HIT! Quinto Accesso: 16 = MISS Sesto Accesso: 3 = MISS Settimo Accesso: 16 = HIT Ottavo Accesso: 18 = Miss + Sovrascrittura Cache multi livello Aggiunta di un secondo livelo di cache: spesso la cache primaria è nello stesso chip del processore si introduce un altro cache basato su tecnologia SRAM tra la cache primaria e la memoria principale (DRAM) La penalità di miss è ridotta sensibilmente se il dato è trovato sulla cache di secondo livello Esempio: CPI di 1.0 con elaboratore a 500Mhz con 5% miss rate, 200ns DRAM accesso Aggiungendo 2nd level cache con tempo di accesso di 20ns time ilmiss rate si abbassa a 2% Utilizzo di multilevel caches: Si tenta di ottimizzare il tempo di hit sulla cache di primo livello Si tenta di ottimizzare il tasso di miss sulla cache di secondo livello. Prestazioni delle cache a più livelli Dato un Processore a 2 GHZ (tempo di clock 0.5 ns) con CPIideale=1,0 (se tutti gli accessi sono risolti nella L1 cache). Tempo di accesso a RAM=50ns; Miss-rate L1 cache=5% Miss penalty = 50 ns/ 0,5 ns/cicli di clock = 100 cicli di clock CPIeffettivo=CPIideale+cicli di stallo per istruzione dovuti ad accesso a RAM CPIeffettivo=1+5%*100=6 Supponiamo di introdurre una cache di secondo livello con : ° Tempo di accesso= 5 ns ed ° grande abbastanza da avere: Miss-rate L2 cache=2% Miss penalty L2 cache= 5 ns/0,5 ns/cicli di clock = 10 cicli di clock CPIeffettivo=CPIideale+cicli di stallo per istruzione dovuti ad accesso a RAM+cicli di stallo per istruzione dovuti ad accesso a L2 cache CPIeffettivo=1+5%*10+2%*100=3,5