Organizzazione cache

Il processore per molti è un pezzo silicio che fa andare il computer, ma all'interno nasconde tante cose. In questo primo articolo affrontiamo il tema della frequenza e delle cache.

Avatar di Tom's Hardware

a cura di Tom's Hardware

Organizzazione cache

Sappiamo che la cache immagazzina copie di dati da vari indirizzi nella memoria principale. Dato che la cache non può mantenere copie del dato da tutti gli indirizzi nella memoria principale simultaneamente, dovrebbe esserci un modo per sapere quali indirizzi sono attualmente copiati nella cache così che, se c'è bisogno del dato da quegli indirizzi, può leggere dalla cache piuttosto che dalla memoria principale.

Questa funzione è realizzata attraverso la Tag RAM, una memoria aggiuntiva nella cache che mantiene un indice degli indirizzi che sono stati copiati nella cache. Ogni linea di memoria cache ha un corrispondente address tag che immagazzina il main memory address del dato attualmente copiato all'interno della particolare linea cache. Se il dato di un particolare main memory address è necessario, il controller della cache può velocemente ricercare gli address tag per vedere se l'indirizzo richiesto è stato attualmente immagazzinato nella cache (hit) o no (miss). Se il dato è lì, può leggerlo dalla cache più veloce; se non c'è, deve leggerlo dalla più lenta memoria principale.

Le varie strade per organizzare o mappare i tag influenzano il funzionamento della cache, che si può mappare come completamente associativa, direct mapped (o anche a mappatura diretta) o set associative (o anche parzialmente associativa).

In una cache mappata completamente associativa, quando si fa una richieta per un dato da uno specifico main memory address, l'indirizzo è confrontato tra tutti gli entries address tag nella cache tag RAM. Se il main memory address richiesto si trova nel tag (hit) la corrispondente locazione nella cache viene restituita. Se l'indirizzo richiesto non si trova nelle entries dell'address tag, c'è un miss, e il dato deve essere recuperato nel memory address principale anziché nella cache.

In una cache a mappatura diretta specifici indirizzi nella memoria principale sono stati preassegnati verso linee localizzate nella cache dove saranno immagazzinati. Perciò la tag RAM può usare meno bit dato che solo un address tag va controllato, e ogni tag ha bisogno di archiviare solo i possibili indirizzi che una certa linea può contenere. Questo risulta anche anche in un'operatività superiore dato che solo un tag address deve essere controllato per un dato memory address.

Una cache parzialmente associativa è una cache a mappatura diretta modificata. Una cache a mappatura diretta ha solo un set di associazioni di memoria, il che significa che un dato memory address si può mappare all'interno o associare a una specifica locazione cache line determinata.

Una cache parzialmente associativa two-way ha due set, così che una data locazione di memoria si può in una delle due posizioni. Una four-way può immagazzinare un determinato memory address in quattro differenti locazioni cache line (o set).

Aumentanto questa capacità cresce la possibilità di trovare un valore, ma i tag adress vanno tag address controllati quando si cerca una specifica locazione nella cache. In sostanza, ogni set in una cache parzialmente associativa n-way è una sottocache che ha associazioni con ogni main memory address. Aumentando il numero di sottocache o set, la cache diventa completamente associativa – una situazione nella quale ogni memory address si può immagazzinare in ogni cache line location. In quel caso una cache parzialmente associativa n-way è un compromesso tra una cache completamente associativa e una cache a mappatura diretta.

In generale la cache a mappatura diretta è la più veloce nel localizzare e recuperare un dato perché deve guardare a solo uno specifico tag address per un certp memory address. Tuttavia risulta anche in più errori (miss) generali rispetto ad altri approcci. Una cache totalmente associativa offre l'hit radio più alto ma è più lenta nel localizzare e recuperare il dato che ha molti più address tag da controllare. Una cache parzialmente associativa n-way è infine un compromesso tra l'ottimizzare la velocità e l'hit ratio, ma più associatività c'è e più hardware (tag bit, circuiti di comparazione, e così via) è necessario, rendendo la cache molto più costosa.

Ovviamente il progetto della cache è una serie di compromessi e ciò che funziona meglio in un caso potrebbe non essere il meglio in un altro: sistemi multitasking come Windows sono buoni esempi di ambienti nei quali il processore deve operare su differenti aree di memoria simultaneamente e nelle quali una cache n-way può migliorare le prestazioni.

I contenuti della cache infatti devono essere sempre in sincronia con quelli della memoria principale per assicurare che il processore funzioni con dati reali. Per questa ragione la cache interna nella famiglia 486 era una cache write-through: significa che quando il processore scrive un'informazione nella cache, è automaticamente scritta anche nella memoria principale.

Per confronto, i Pentium e i chip successivi hanno una cache write-back: letture e scritture sono entrambe in cache, così migliorano le prestazioni.

Un'altra caratteristica dei migliori progetti di cache è che sono "nonblocking": è una tecnica per ridurre o nascondere i ritardi della memoria sfruttando la sovrapposizione delle operazioni del processore con gli accessi dati. Una cache nonblocking permette all'esecuzione di un programma di procedere allo stesso tempo con gli errori (miss) purché siano rispettati determinati vincoli di dipendenza. In altre parole, si può gestire un cache miss molto meglio e consentire al processore di continuare a lavorare su attività slegate dai dati mancanti.

Il controller integrato nel processore è inoltre responsabile per il controllo del bus di memoria quando processi alternativi, noti come bus master, sono attivi nel sistema. Questo processo di osservazione del bus è noto come bus snooping: se un bus master device scrive in un'area della memoria che è archiviata nella cache del processore, i contenuti della cache e della memoria non concordano più. Il controller marca questo dato come invalido e ricarica la cache durante i successivi accessi di memoria, preservando l'integrità del sistema.

Tutti i design dei processori con cache memory includono una funzione nota come translation lookaside buffer (TLB) per migliorare il recupero dai cache miss. Il TLB è una tabella all'interno del processore che archivia l'informazione circa la posizione di memory address usati di recente. Il TLB velocizza la translazione di indirizzi virtuali in indirizzi di memoria fisica.

Aumentando la frequenza di clock il tempo dei cicli decresce. I sistemi più recenti non hanno più la cache sulla motherboard perché la memoria di sistema più veloce usata può tenere il passo della velocità della motherboard. I processori moderni integrano la cache L2 nel die del processore come la L1 e ci sono CPU anche con cache L3. Questo permette alla L2/L2 di lavorare alla massima velocità perché è ora parte del core.