CPU cache: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Corretto il collegamento Ecc con Error-correcting code (DisamAssist) |
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti. |
||
(3 versioni intermedie di 2 utenti non mostrate) | |||
Riga 45:
In un sistema [[multiprocessore]], è possibile che i dati contenuti nella memoria principale, di cui esiste una copia nella cache, vengano modificati da altri processori. In questi casi, le copie locali nella cache possono diventare obsolete o incoerenti. Per evitare errori di calcolo, i sistemi devono garantire che tutte le cache coinvolte lavorino con dati aggiornati. A tal fine vengono utilizzati appositi protocolli di coerenza, che regolano la comunicazione tra le cache per mantenere l’allineamento corretto dei dati. <ref>{{Cita libro|titolo=ijay Nagarajan, Daniel J. Sorin, Mark D. Hill & David A. Wood – A Primer on Memory Consistency and Cache Coherence, Second Edition (Morgan & Claypool Publishers, 2020)}}</ref>
Un altro aspetto critico è il tempo necessario per leggere un dato dalla memoria, noto come latenza di lettura. Questo tempo influisce direttamente sulle prestazioni del processore: se la CPU deve attendere troppo a lungo l’arrivo di un dato, rischia di fermarsi temporaneamente, entrando in uno stato chiamato stallo della CPU. Tale situazione è particolarmente dannosa nelle CPU moderne, capaci di eseguire centinaia di istruzioni nel tempo impiegato per caricare un singolo dato da una memoria lenta. Per ridurre l’impatto degli stalli, sono state sviluppate tecniche di ottimizzazione che permettono alla CPU di sfruttare il tempo d’attesa. Ad esempio, alcuni microprocessori adottano l’[[
== Associatività ==
Riga 54:
Se ogni posizione della memoria principale può essere memorizzata in due linee diverse della cache (come nel caso di una cache 2-way set associative), è naturale chiedersi quali siano queste due posizioni. Il metodo più comune per stabilirlo è quello illustrato nel diagramma a lato: i bit meno significativi dell’indirizzo di memoria vengono usati per determinare a quale set appartiene il dato. A ciascun set corrispondono due linee di cache disponibili. Un vantaggio di questo schema è che, conoscendo già parte dell’indirizzo (quella usata per selezionare il set), le etichette (tag) salvate in cache possono essere più brevi, poiché non devono ripetere l’informazione già codificata. Questo comporta un uso più efficiente della memoria cache e una riduzione del tempo necessario per confrontare i tag durante l’accesso. <ref name=":0" />
Sono stati proposti schemi alternativi di organizzazione della cache per ridurre le collisioni, cioè i casi in cui più dati competono per la stessa posizione. Un esempio è la skewed cache, in cui il metodo di selezione del set varia tra le diverse vie (ways). Nella way 0, l’indice è calcolato con il metodo tradizionale (ad esempio usando i bit meno significativi dell’indirizzo), mentre nella way 1 l’indice è ottenuto tramite una [[funzione di hash]]. Una buona funzione di hash distribuisce in modo più uniforme gli indirizzi, riducendo il rischio che dati frequentemente usati entrino in conflitto tra loro, come può accadere con la mappatura diretta.Lo svantaggio di questo approccio è il ritardo aggiuntivo dovuto al calcolo della funzione di hash. Inoltre, può diventare più complesso gestire l’eliminazione delle linee obsolete, perché le diverse vie possono usare criteri di assegnazione diversi, rendendo meno efficiente il tracciamento dell’utilizzo recente (ad esempio nel caso di strategie come la Least Recently Used, o LRU). <ref>{{Cita libro|titolo=Norman P. Jouppi
Improving direct-mapped cache performance by the addition of a small fully-associative cache and skewed-associative caches, Proceedings of the 17th Annual International Symposium on Computer Architecture (ISCA), 1990.}}</ref>
Riga 79:
[[File:Cache,missrate.png|thumb|Frequenza di fallimento (''miss rate'') a confronto con la dimensione della cache (Cache size) sulla porzione degli interi di SPEC CPU2000]]
Il grafico a destra riassume la performance della cache vista dai benchmarks della porzione degli interi di un SPEC CPU2000, ripresa da Hill e Cantin [http://www.cs.wisc.edu/multifacet/misc/spec2000cache-data/ Cache performance of SPEC CPU2000]. Questi benchmark servono a rappresentare il tipo di carico di lavoro che una postazione di lavoro potrebbe subire un giorno qualsiasi. In questo grafico possiamo vedere i differenti effetti delle ''tre C''.
All'estrema destra, quando la cache size assume un valore "Inf" (che, in altre parole, tende all'infinito), abbiamo i ''compulsory misses''. Se volessimo migliorare le caratteristiche dello SpecInt2000, aumentare la dimensione della cache oltre 1MB sarebbe praticamente inutile.
Riga 172:
Il primo motivo che ha portato allo sviluppo di una gerarchia di [[cache]] nei processori moderni è legato al funzionamento delle [[CPU]] con [[pipeline]]. In queste architetture, la memoria viene interrogata in più fasi della pipeline, durante il recupero delle istruzioni, nella traduzione degli indirizzi da virtuali a fisici e nel recupero dei dati. Per evitare conflitti e colli di bottiglia, la soluzione più efficiente consiste nell'utilizzare cache fisiche separate per ciascuno di questi punti, così che nessuna risorsa debba servire più operazioni contemporaneamente. Questo approccio consente un'elevata parallelizzazione delle fasi di esecuzione, migliorando le prestazioni complessive del processore.
Di conseguenza, la pipeline di una CPU moderna tende a includere almeno tre cache distinte: una cache per le istruzioni (instruction cache), una per i [[dati]] (data cache) e una per la [[Translation Lookaside Buffer]] (
=== Victim cache ===
Riga 202:
== Cache multilivello ==
Le [[cache]] multilivello introducono un nuovo modello nella gestione dei dati. In molti processori moderni, come quelli della famiglia [[Intel Core]] (dalla generazione [[Sandy Bridge]] in poi) e alcuni [[Architettura ARM|ARM]] avanzati, i dati presenti nella cache [[L1]] sono sempre contenuti anche nella cache [[L2]]. Questo tipo di organizzazione è detta inclusive.Al contrario, altri processori, come quelli della serie AMD Ryzen, adottano cache exclusive, dove ogni dato risiede al massimo in una sola delle due cache, o nella [[L1]] o nella [[L2]], ma mai in entrambe contemporaneamente.
Il vantaggio delle cache exclusive è che possono immagazzinare una quantità maggiore di dati totali, un beneficio che diventa più evidente all’aumentare delle dimensioni delle cache. Tuttavia, questa caratteristica non è comune nelle implementazioni [[x86]] di [[Intel]]. D’altra parte, il vantaggio principale delle cache inclusive è che, in un sistema [[multiprocessore]], quando un dispositivo esterno o un altro processore deve invalidare una linea di cache, può controllare soltanto la cache L2 per decidere se eliminarla, senza dover verificare anche la L1. In sistemi senza inclusione, invece, è necessario controllare entrambe le cache L1 e L2, rendendo il processo più complesso.
|