La cache è una memoria intermedia tra la CPU e la memoria (RAM). È molto più veloce della RAM e serve per rendere disponibili i dati e le istruzioni utili alla CPU in modo più veloce.

In questo corso ci siamo concentrati sulla cache dati piuttosto che sulla cache istruzioni.

Princìpi della cache

La cache copia i dati della RAM in base a due principi:

  • il principio di località temporale: è più probabile che i dati acceduti recentemente dalla CPU saranno di nuovo acceduti in futuro, quindi la cache li memorizza.
  • il principio di località spaziale: è più probabile che i dati fisicamente adiacenti alla posizione di un dato già acceduto saranno anch’essi accessi (si pensi agli indici di una lista), quindi la cache li memorizza.

Se la CPU chiede alla memoria un dato in base al suo indirizzo e la cache lo ha già memorizzato, allora si parla di cache hit, se invece il dato non è presente nella cache ma sta solo nella memoria RAM, allora si parla di cache miss.

Struttura della memoria cache

La cache divide l’informazione in blocchi, che sono le unità più piccole di memoria che può trasferire. Hanno una lunghezza fissa di 32, 64 o 138 byte, ma la maggior parte delle cache usa blocchi da 64 byte perché sono i più veloci.

Campi del blocco

CampoDescrizioneLunghezza
Valid bitIndica se il blocco contiene dati validi1 bit
TagRappresenta i bit più significativi dell’indirizzo che identificano univocamente il blocco nella cachelunghezza indirizzo (32 o 64 bit) - lun. set index - lun. block offset
DatiÈ il contenuto vero e proprio di dati.Dipende dalla dimensione del blocco (es. 32, 64 byte)
(Facoltativo: Used bit)Indica se il dato in un blocco è stato già usato1 bit

La somma delle dimensioni di tutti questi campi da la lunghezza totale di un blocco.

DescrizioneLunghezza
Set IndexSeleziona un set bit
Block OffsetSeleziona un byte nel blocco bit

Tipi di cache miss

  • Cold Start: si verifica quando un blocco viene richiesto per la prima volta e non è mai stato caricato nella cache.
  • Capacity miss: si verifica quando la cache non è abbastanza grande per contenere tutti i dati necessari, quindi un dato che era presente in precedenza è stato cancellato.
  • Conflict miss: si verifica quando più blocchi di memoria competono nella stessa posizione nella cache, causando la rimozione prematura di dati ancora utili.

N.B.: Anche se i set index e il block offset di due blocchi combaciano, bisogna controllare se tutti i tag visti finora sul set index siano gli stessi, in caso contrario non è una hit ma una conflict miss.

Esempio:

block number01600
index0000
tag0200
hit/missmissmissmiss (non hit, perché
gli indici sono 0, 2, 0
e non 0, 0, 0)
hit
miss typecold startcold startconflict

Inserimento di un dato nella cache in base all’indirizzo RAM

Sia la grandezza del blocco in byte.

  • Numero di blocco (Block#) = è il blocco a cui appartiene l’indirizzo.
  • Set index =
  • Tag del blocco =
  • Word offset = indica quale word (tra le word del blocco) è quella desiderata.

Altre formule utili:

  • Istruzioni svolte nel tempo medio =
  • per memoria virtuale:
    • Numero di pagina virtuale =
    • Page offset =
    • Indirizzo fisico =

Tipi di cache

Direct mapped

Ogni blocco della cache è contenuto in un set a sé stante, ha una struttura a “elenco”.

N-ways set associative cache

Per ridurre il numero di conflitti di memoria, lo spazio di memoria è diviso in set. Ogni set è diviso in varie linee (o ways) che contengono ognuna un blocco della cache. Ha una struttura a “matrice”.

N.B.: Aumentare l’associatività vuol dire aumentare il numero di ways per set.

Più associatività (es. 8-way)Meno associatività (es. 1-way)
✅ Meno conflitti (cache conflict misses)❌ Più conflitti
Numero di ways confronti di tag per set✅ 1 confronto di tag per set
❌ Più consumo di energia e area✅ Più efficiente in hardware

N.B.: Non esiste il campo “way index” del blocco perché un blocco di memoria può essere solo in un set specifico, ma può trovarsi in una qualunque delle N vie di quel set. Quindi non basta l’indirizzo per trovare esattamente il blocco: bisogna cercarlo (confrontare i tag) in tutte le N vie del set.

Fully associative cache

È una cache con un solo set e N vie, è l’estremo della cache associativa. In questa cache i blocchi possono essere messi ovunque, come se fosse un insieme.