Salta al contenuto
Note per Studenti Memoria cache

Memoria cache

In questa pagina 11
In questa pagina 4

La cache è una memoria piccola e veloce (SRAM) tra CPU e memoria principale. Contiene copie dei blocchi usati di recente e sfrutta la località (vedi Gerarchia di memoria e principio di localitàCaratteristiche delle memorie (posizione, capacità, unità di trasferimento, metodo di accesso, prestazioni, volatilità); compromesso costo-capacità-velocità e gerarchia a livelli; località temporale e spaziale con esempi; hit, miss e tempo medio di accesso con calcolo svolto.Gerarchia di memoria e principio di località →). È gestita interamente dall'hardware: il programma non la vede.

Blocchi, linee, etichette

  • La memoria principale è divisa in blocchi di KK parole contigue; il blocco è l'unità di trasferimento tra memoria e cache.
  • La cache ha mm linee; ogni linea contiene un blocco, più un'etichetta (tag) che dice quale blocco è, un bit di validità e, con write-back, un bit sporco.
  • Il numero di linee è molto minore del numero di blocchi: più blocchi competono per le stesse linee.

Se K=2wK = 2^w, gli ultimi ww bit dell'indirizzo indicano la parola dentro il blocco (campo parola), gli altri bit sono l'indirizzo del blocco. Il primo indirizzo di un blocco ha il campo parola a zero.

Nei conti, "parola" è l'unità indirizzabile: se la memoria è indirizzata al byte e la parola è un byte, il campo parola conta i byte nel blocco.

Associazione diretta

Ogni blocco può andare in una sola linea:

linea=(indirizzo del blocco) mod m\text{linea} = (\text{indirizzo del blocco}) \bmod m

Indirizzo: | tag | linea (log⁡2m\log_2 m bit) | parola (ww bit) |

Funzionamento: il campo linea seleziona la linea; se è vuota → miss; se è piena si confronta il tag della linea con quello dell'indirizzo: uguali → hit, diversi → miss e il blocco presente viene sostituito. Il campo parola non serve a decidere hit o miss: serve solo a scegliere la parola nel blocco da mandare alla CPU.

Esempio: memoria di 16 MB indirizzata al byte → indirizzi di 24 bit; cache di 16 K linee (2142^{14}); blocchi di 4 byte (w=2w = 2). Campi: parola 2, linea 14, tag 24−14−2=824 - 14 - 2 = 8. Svolto in Esercizio 7 · campi dell'indirizzo in una cache ad associazione diretta.

Pro: semplicissima, un solo confronto. Contro: due blocchi usati alternativamente che vanno nella stessa linea si scacciano a vicenda (thrashing) anche se il resto della cache è vuoto.

Associazione completa

Un blocco può andare in qualsiasi linea. Indirizzo: | tag | parola |. Si confronta il tag con tutte le linee in parallelo (memoria associativa): costosa, usata solo per cache piccolissime (es. il TLB, vedi Memoria virtualeIndirizzi virtuali e fisici, pagine e frame; traduzione con la tabella delle pagine e calcolo dei campi; page fault e sostituzione delle pagine; TLB e tempo di accesso effettivo; protezione e condivisione; confronto con la cache.Memoria virtuale →).

Associazione a insiemi (nn vie)

Le mm linee sono divise in v=m/nv = m/n insiemi (set) di nn linee. Un blocco va in un insieme fisso, in una linea qualsiasi dell'insieme:

insieme=(indirizzo del blocco) mod v\text{insieme} = (\text{indirizzo del blocco}) \bmod v

Indirizzo: | tag | insieme (log⁡2v\log_2 v bit) | parola |

"A due vie" significa due linee per insieme, non due insiemi. Con n=1n = 1 è l'associazione diretta, con n=mn = m quella completa.

Esempio: indirizzi di 12 bit, parola di 1 byte, cache di 16 byte, blocchi di 2 byte, 2 vie → linee 16/2=816/2 = 8, insiemi 8/2=48/2 = 4 → parola 1 bit, insieme 2 bit, tag 12−2−1=912 - 2 - 1 = 9 bit. Altri casi in Esercizio 12 · campi dell'indirizzo per cache a due vie.

Rimpiazzo

Con associazione a insiemi o completa, quando l'insieme è pieno si sceglie la linea da liberare:

  • LRU (least recently used): quella usata meno di recente (con 2 vie basta un bit per insieme);
  • FIFO: quella caricata per prima, indipendentemente dagli accessi successivi;
  • LFU: quella usata meno spesso;
  • casuale: sorprendentemente poco peggiore di LRU.

Se ci sono linee libere nell'insieme se ne usa una (negli esercizi si dichiara la convenzione, per esempio "la linea libera di indice minore").

Scrittura

Politica Su hit in scrittura Pro / contro
write-through scrive in cache e in memoria memoria sempre aggiornata; molto traffico (si usa un buffer di scrittura)
write-back scrive solo in cache e mette a 1 il bit sporco poco traffico; quando una linea sporca viene rimpiazzata, l'intero blocco va riscritto in memoria prima di caricare il nuovo

Su miss in scrittura:

  • write-allocate: si porta prima il blocco in cache, poi si scrive (tipico con write-back);
  • no-write-allocate: si scrive solo in memoria (tipico con write-through).

Negli esercizi completi si traccia per ogni accesso: indirizzo, campi, hit/miss, linea e insieme coinvolti, contenuto della linea (tag, dati, bit sporco) e modifiche alla memoria.

Dimensione del blocco

Blocchi più grandi sfruttano meglio la località spaziale, ma a parità di capacità riducono il numero di linee e aumentano i conflitti; ogni miss costa anche più tempo di trasferimento. Esiste un valore ottimo intermedio: vedi Esercizio 10 · dimensione del blocco più conveniente, dove con una cache di 8 parole il blocco di 2 parole dà meno miss di quelli da 1 e da 4.

Cache multilivello e separate

Esercizi: Esercizio 8 · hit e miss in cache ad associazione diretta, Esercizio 9 · cache con blocchi di due parole, Esercizio 11 · cache a due vie con rimpiazzo FIFO.

Ridurre i miss

Tipo di miss Rimedio Costo del rimedio
obbligatori blocchi più grandi (sfruttano la località spaziale), prelievo anticipato (prefetch) blocchi troppo grandi aumentano i conflitti e il tempo di trasferimento
di capacità cache più grande più area, più costo, accesso più lento
di conflitto più vie (associatività maggiore), cache vittima confronti in parallelo di più etichette, ciclo di accesso più lungo

Nessun rimedio è gratis: ognuno sposta il problema (blocchi più grandi riducono i miss obbligatori ma, a parità di capacità, riducono il numero di linee).

Quesiti tipici sui campi dell'indirizzo

Con capacità CC, linea (= blocco) di KK byte, nn vie e memoria indirizzata al byte:

linee=CK,insiemi=lineen,parola=log⁡2K,set=log⁡2(insiemi),etichetta=bit dell’indirizzo−set−parola.\text{linee} = \frac{C}{K}, \quad \text{insiemi} = \frac{\text{linee}}{n}, \quad \text{parola} = \log_2 K, \quad \text{set} = \log_2(\text{insiemi}), \quad \text{etichetta} = \text{bit dell'indirizzo} - \text{set} - \text{parola}.

Svolti: Esercizio 20 · campi dell'indirizzo e capacità di una cache, Esercizio 21 · cache a due vie FIFO con write-through, Esercizio 22 · cache a due vie LRU con write-back, Esercizio 23 · cache con rimpiazzo di una linea sporca.

Errori tipici

  • Confondere la dimensione della parola con l'ampiezza del campo parola: il campo parola dipende dal numero di parole nel blocco.
  • Confondere il numero di vie con il numero di insiemi.
  • Usare il campo parola per decidere hit o miss.
  • Con write-back, dimenticare di riscrivere in memoria il blocco sporco rimpiazzato (e scriverlo tutto, non solo la parola modificata).

Versione ripasso

Memoria piccola e veloce (SRAM) tra CPU e memoria principale, gestita dall'hardware (Gerarchia di memoria e principio di localitàCaratteristiche delle memorie (posizione, capacità, unità di trasferimento, metodo di accesso, prestazioni, volatilità); compromesso costo-capacità-velocità e gerarchia a livelli; località temporale e spaziale con esempi; hit, miss e tempo medio di accesso con calcolo svolto.Gerarchia di memoria e principio di località →).

Linee e associazione

Rimpiazzo e scrittura

  • LRU, FIFO, LFU, casuale.
  • Write-through: scrive in cache e in memoria. Write-back: bit sporco, rimpiazzando una linea sporca si riscrive l'intero blocco. Miss in scrittura: write-allocate o no-write-allocate.

Blocco e miss

Blocchi più grandi sfruttano la località spaziale ma riducono le linee (Esercizio 10 · dimensione del blocco più conveniente: con 8 parole il blocco da 2 batte 1 e 4). Miss obbligatori (blocchi più grandi, prefetch), di capacità (cache più grande), di conflitto (più vie). L1 spesso separata istruzioni/dati (PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →).

Quesiti sui campi

linee=CK,insiemi=lineen,parola=log⁡2K,set=log⁡2(insiemi),etichetta=bit−set−parola\text{linee} = \frac{C}{K}, \quad \text{insiemi} = \frac{\text{linee}}{n}, \quad \text{parola} = \log_2 K, \quad \text{set} = \log_2(\text{insiemi}), \quad \text{etichetta} = \text{bit} - \text{set} - \text{parola} Bit dell'indirizzo =log⁡2= \log_2 memoria; memoria massima =2etichetta+set+parola= 2^{\text{etichetta} + \text{set} + \text{parola}}. Due indirizzi nella stessa linea: stesso campo linea, etichetta diversa. Con più scrittori e write-back serve la coerenza (Processori superscalari e multicoreParallelismo a livello di istruzione: processori superscalari, esecuzione fuori ordine, ridenominazione dei registri contro WAR e WAW, speculazione; limiti dell'ILP e della frequenza (consumo); multithreading, multicore e coerenza delle cache; acceleratori.Processori superscalari e multicore →).

Esercizi: Esercizio 8 · hit e miss in cache ad associazione diretta, Esercizio 9 · cache con blocchi di due parole, Esercizio 11 · cache a due vie con rimpiazzo FIFO, Esercizio 20 · campi dell'indirizzo e capacità di una cache, Esercizio 21 · cache a due vie FIFO con write-through, Esercizio 22 · cache a due vie LRU con write-back, Esercizio 23 · cache con rimpiazzo di una linea sporca.

Errori tipici: confondere vie e insiemi; usare il campo parola per hit/miss; con write-back non riscrivere tutto il blocco sporco.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata