Iniziamo con questo:
Penso che gli ultimi processori SMP utilizzino cache a 3 livelli, quindi voglio capire la gerarchia a livello di cache e la loro architettura.
Per capire le cache devi sapere alcune cose:
Una CPU ha registri. I valori possono essere utilizzati direttamente. Niente è più veloce.
Tuttavia non è possibile aggiungere registri infiniti a un chip. Queste cose occupano spazio. Se ingrandiamo il chip diventa più costoso. Parte di ciò è perché abbiamo bisogno di un chip più grande (più silicio), ma anche perché aumenta il numero di chip con problemi.
(Immagina un wafer immaginario con 500 cm 2. Ne ho tagliato 10, ogni chip di 50 cm 2 di dimensioni. Uno di questi è rotto. Lo scarto e ne rimango 9 gettoni funzionanti. Ora prendo lo stesso wafer e taglio un centinaio di chip, ciascuno dieci volte più piccolo. Uno di questi se rotto. Scarto il chip rotto e rimango con 99 chip funzionanti. Questa è una frazione della perdita che altrimenti avrei avuto. Per compensare il più grande chip avrei bisogno di chiedere prezzi più alti. Più che il prezzo del silicio extra)
Questo è uno dei motivi per cui vogliamo chip piccoli e convenienti.
Tuttavia, più la cache è vicina alla CPU, più velocemente è possibile accedervi.
Questo è anche facile da spiegare; I segnali elettrici viaggiano vicino alla velocità della luce. È veloce ma comunque una velocità finita. CPU moderna funziona con clock GHz. Anche questo è veloce. Se prendo una CPU da 4 GHz, un segnale elettrico può viaggiare di circa 7,5 cm per tick di clock. Sono 7,5 cm in linea retta. (I chip sono tutt'altro che connessioni diritte). In pratica avrai bisogno di molto meno di quei 7,5 cm poiché ciò non consente in alcun tempo ai chip di presentare i dati richiesti e al ritorno del segnale.
In conclusione, vogliamo che la cache sia fisicamente il più vicino possibile. Ciò significa grandi chip.
Questi due devono essere bilanciati (prestazioni vs. costo).
Dove si trovano esattamente le cache L1, L2 e L3 in un computer?
Supponendo che l'hardware sia solo in stile PC (i mainframe sono piuttosto diversi, incluso il rapporto prestazioni / costi);
IBM XT
Quello originale da 4,77 MHz: nessuna cache. La CPU accede direttamente alla memoria. Una lettura dalla memoria seguirà questo schema:
- La CPU inserisce l'indirizzo che desidera leggere sul bus di memoria e afferma il flag di lettura
- La memoria inserisce i dati sul bus dati.
- La CPU copia i dati dal bus dati nei suoi registri interni.
80286 (1982)
Ancora nessuna cache. L'accesso alla memoria non era un grosso problema per le versioni a bassa velocità (6Mhz), ma il modello più veloce funzionava fino a 20Mhz e spesso doveva ritardare quando si accedeva alla memoria.
Quindi ottieni uno scenario come questo:
- La CPU inserisce l'indirizzo che desidera leggere sul bus di memoria e afferma il flag di lettura
- La memoria inizia a mettere i dati sul bus dati. La CPU attende.
- La memoria ha terminato di ottenere i dati ed è ora stabile sul bus dati.
- La CPU copia i dati dal bus dati nei suoi registri interni.
Questo è un ulteriore passo speso aspettando la memoria. Su un sistema moderno che può essere facilmente 12 passaggi, motivo per cui abbiamo cache .
80386 : (1985)
Le CPU diventano più veloci. Sia per orologio, sia funzionando a velocità di clock più elevate.
La RAM diventa più veloce, ma non tanto più veloce delle CPU.
Di conseguenza sono necessari più stati di attesa. Alcune schede madri aggirare questo con l'aggiunta di cache (che sarebbe 1 ° cache di livello) sulla scheda madre.
Una lettura dalla memoria ora inizia con un controllo se i dati sono già nella cache. Se lo è, viene letto dalla cache molto più veloce. In caso contrario, la stessa procedura descritta con l'80286
80486 : (1989)
Questa è la prima CPU di questa generazione che ha un po 'di cache sulla CPU.
È una cache unificata da 8 KB, il che significa che viene utilizzata per dati e istruzioni.
In questo periodo si arriva comune per mettere 256KB di memoria statica veloce sulla scheda madre, come 2 ° cache di livello. Così 1 ° cache di livello sulla CPU, 2 ° cache di livello sulla scheda madre.
80586 (1993)
Il 586 o Pentium-1 utilizza una cache di livello diviso 1. 8 KB ciascuno per dati e istruzioni. La cache è stata suddivisa in modo tale che le cache di dati e istruzioni possano essere ottimizzate individualmente per il loro uso specifico. Hai ancora una 1a cache piccola ma molto veloce vicino alla CPU e una 2a cache più grande ma più lenta sulla scheda madre. (A una distanza fisica maggiore).
Nella stessa area Pentium 1 Intel ha prodotto il Pentium Pro ('80686'). A seconda del modello, questo chip aveva una cache a bordo da 256 KB, 512 KB o 1 MB. Era anche molto più costoso, il che è facile da spiegare con la seguente immagine.
Si noti che metà dello spazio nel chip viene utilizzato dalla cache. E questo è per il modello da 256 KB. Tecnicamente era possibile più cache e alcuni modelli venivano prodotti con cache da 512 KB e 1 MB. Il prezzo di mercato per questi era alto.
Si noti inoltre che questo chip contiene due matrici. Uno con la CPU reale e 1 ° cache e una seconda matrice con 256KB 2 nd cache.
Pentium 2
Il pentium 2 è un pentium pro core. Per ragioni di economia no 2 ° cache è nella CPU. Invece ciò che viene venduto aa CPU noi una PCB con chip separati per la CPU (e 1 ° cache) e 2 ° cache.
Man mano che la tecnologia avanza e iniziamo a creare chip con componenti più piccoli, diventa finanziariamente possibile rimettere la seconda cache nella matrice effettiva della CPU. Tuttavia c'è ancora una divisione. Molto veloce 1 ° di cache si stringeva alla CPU. Con una 1a cache per core della CPU e una 2a cache più grande ma meno veloce accanto al core.
Pentium-3
Pentium-4
Questo non cambia per il pentium-3 o il pentium-4.
In questo periodo abbiamo raggiunto un limite pratico sulla velocità con cui possiamo sincronizzare le CPU. Un 8086 o un 80286 non necessitavano di raffreddamento. Un pentium-4 funzionante a 3.0GHz produce così tanto calore e utilizza così tanta potenza che diventa più pratico mettere due CPU separate sulla scheda madre anziché una veloce.
(Due CPU da 2,0 GHz consumerebbero meno energia di una singola CPU da 3,0 GHz identica, ma potrebbero fare più lavoro).
Questo potrebbe essere risolto in tre modi:
- Rendi le CPU più efficienti, in modo che facciano più lavoro alla stessa velocità.
- Usa più CPU
- Utilizzare più CPU nello stesso "chip".
1) È un processo in corso. Non è nuovo e non si fermerà.
2) È stato fatto all'inizio (ad es. Con doppie schede madri Pentium-1 e chipset NX). Fino ad ora quella era l'unica opzione per costruire un PC più veloce.
3) Richiede CPU in cui più "CPU" sono integrati in un singolo chip. (Abbiamo quindi chiamato quella CPU una CPU dual core per aumentare la confusione. Grazie marketing :))
In questi giorni ci limitiamo a fare riferimento alla CPU come 'core' per evitare confusione.
Ora ottieni chip come il pentium-D (duo), che è fondamentalmente due core pentium-4 sullo stesso chip.
Ricordi l'immagine del vecchio pentium-Pro? Con l'enorme dimensione della cache?
Vedi le due grandi aree in questa immagine?
Si scopre che possiamo condividere quella seconda cache tra entrambi i core della CPU. Velocità scenderebbe leggermente, ma un 512KiB condiviso 2 ° cache è spesso più veloce l'aggiunta di due indipendenti 2 ° livello cache di metà delle dimensioni.
Questo è importante per la tua domanda.
Significa che se leggi qualcosa da un core della CPU e successivamente provi a leggerlo da un altro core che condivide la stessa cache che otterrai un hit nella cache. Non sarà necessario accedere alla memoria.
Poiché i programmi migrano tra le CPU, a seconda del carico, del numero di core e dello scheduler, è possibile ottenere prestazioni aggiuntive bloccando i programmi che utilizzano gli stessi dati sulla stessa CPU (hit della cache su L1 e inferiori) o sulle stesse CPU che condividere la cache L2 (e quindi ottenere mancati su L1, ma i risultati sulla cache L2 vengono letti).
Quindi nei modelli successivi vedrai cache di livello 2 condivise.
Se stai programmando per CPU moderne, hai due opzioni:
- Non si disturbi. Il sistema operativo dovrebbe essere in grado di pianificare le cose. Lo scheduler ha un grande impatto sulle prestazioni del computer e le persone hanno speso molto per ottimizzarlo. A meno che tu non faccia qualcosa di strano o non stia ottimizzando per un modello specifico di PC, stai meglio con lo scheduler predefinito.
- Se hai bisogno delle ultime prestazioni e un hardware più veloce non è un'opzione, prova a lasciare i gradini che accedono agli stessi dati sullo stesso core o su un core con accesso a una cache condivisa.
Mi rendo conto di non aver ancora menzionato la cache L3, ma non sono diversi. Una cache L3 funziona allo stesso modo. Più grande di L2, più lento di L2. Ed è spesso condiviso tra i core. Se è presente, è molto più grande della cache L2 (altrimenti non avrebbe senso) ed è spesso condiviso con tutti i core.