Pipelining cache e prestazioni

// obiettivi di apprendimento
Comprendere il pipelining e i suoi hazard
Analizzare le soluzioni ai problemi di pipeline: forwarding, branch prediction, architettura superscalare
Spiegare il ruolo e l’organizzazione gerarchica della memoria cache
Valutare le prestazioni di un sistema mediante clock, MIPS, FLOPS e numero di core
📄
Slides
Pipelining e cache
📚
Risorse
Esercizi sulle pipeline
Vedi →
📚
Risorse
Esercizi sulle memorie cache
Vedi →

Pipelining — esecuzione parallela delle istruzioni

Il pipelining consente di sovrapporre temporalmente le diverse fasi di esecuzione delle istruzioni, aumentando il numero di operazioni completate nell’unità di tempo. Invece di attendere che un’istruzione completi tutte le fasi prima di iniziare la successiva, la CPU avvia ogni nuova istruzione non appena la fase precedente si libera.

// analogia — catena di montaggio
Come in una catena di montaggio industriale, ogni stazione lavora su un pezzo diverso contemporaneamente. Quando la stazione 1 finisce con il pezzo A e passa al pezzo B, la stazione 2 inizia a lavorare sul pezzo A. Il risultato è un throughput enormemente superiore rispetto all’esecuzione sequenziale.

In un modello a cinque stadi la pipeline processa istruzioni diverse in parallelo:

IF
Instruction Fetch
ID
Instruction Decode
EX
Execute
MEM
Memory Access
WB
Write Back

Hazard — i problemi della pipeline

L’esecuzione parallela delle fasi può essere ostacolata da condizioni che interrompono il flusso regolare della pipeline. Si chiamano hazard e ne esistono di due tipi principali.

DATA HAZARD
Dipendenze tra istruzioni
Un’istruzione necessita del risultato prodotto da quella precedente, ma il dato non è ancora disponibile — il WB non è stato completato. La pipeline deve attendere: si introduce uno stall (bolla).
CONTROL HAZARD
Salti condizionati
In presenza di un salto condizionato la CPU non sa quale sarà la prossima istruzione. Se le istruzioni già caricate risultano errate, la pipeline viene svuotata (flush) — con perdita di cicli di clock.

Soluzioni ai problemi di pipeline

L’evoluzione architetturale ha introdotto quattro soluzioni tecniche per mitigare gli hazard e massimizzare l’efficienza della pipeline.

1 — Forwarding (Bypassing)

Il forwarding rende disponibile il risultato di un’operazione già al termine della fase EX, senza attendere le fasi MEM e WB. Grazie a registri e percorsi dati a doppia porta, il dato viene “cortocircuitato” direttamente all’istruzione successiva che lo richiede, eliminando o riducendo gli stall da data hazard.

2 — Architettura Superscalare

In un’architettura superscalare sono presenti più pipeline indipendenti capaci di elaborare istruzioni diverse contemporaneamente. Questo aumenta il parallelismo a livello di istruzioni (ILP — Instruction Level Parallelism), consentendo di completare più di un’istruzione per ciclo di clock.

3 — Branch Prediction

Un’unità dedicata analizza il comportamento storico dei salti e tenta di prevederne l’esito prima che venga calcolato. Quando la previsione è corretta, la pipeline prosegue senza interruzioni. In caso di errore si verifica un flush, ma statisticamente il numero di interruzioni si riduce sensibilmente.

// previsione corretta
Pipeline continua senza interruzioni — nessuna perdita di cicli
// previsione errata
Flush della pipeline — perdita di cicli, ma statisticamente rara

4 — Pipeline Profonde

Suddividere la pipeline in un numero maggiore di stadi elementari (anche 20–30 stadi) riduce la complessità di ogni micro-operazione e permette frequenze di clock più elevate. Il throughput complessivo aumenta, ma il sistema diventa più sensibile agli effetti degli hazard.

// sintesi soluzioni
Grazie all’integrazione di forwarding, architettura superscalare, branch prediction e pipeline profonde, i processori moderni riescono a eseguire più istruzioni per ciclo di clock, riducendo il tempo medio di elaborazione dei programmi.

Memoria Cache

La memoria cache è una memoria ad altissima velocità integrata nel microprocessore, progettata per ridurre i tempi di accesso ai dati. Agisce da intermediario tra CPU e RAM — conserva temporaneamente le informazioni più frequentemente utilizzate per evitare i lunghi tempi di accesso alla memoria principale.

// perché si chiama “nascosta”
La cache non è gestita dal software applicativo né dal sistema operativo — opera in modo automatico e trasparente tramite un circuito hardware dedicato: il cache controller. L’utente non la vede né la controlla direttamente.

Gerarchia dei livelli

L1
Livello 1 — nel core
La più veloce e la più piccola. Integrata direttamente nel core, dedicata esclusivamente ad esso. Latenza: ~1–4 cicli.
L2
Livello 2 — privata per core
Capacità maggiore di L1, latenza leggermente superiore. In genere ancora privata per ciascun core. Latenza: ~10–20 cicli.
L3
Livello 3 — condivisa
La più grande ma meno veloce. Condivisa tra tutti i core nella CPU. Latenza: ~30–50 cicli.
// regola generale
All’aumentare del livello cresce la capacità ma diminuisce la velocità. Questa struttura gerarchica bilancia dimensione e prestazioni in modo ottimale.

Cache Hit e Cache Miss

✓ CACHE HIT
Il dato richiesto è già presente in cache — viene trasferito immediatamente alla CPU con latenza minima.
✗ CACHE MISS
Il dato non è in cache — deve essere recuperato dalla RAM con un ritardo significativo.

L’efficienza della cache si misura tramite l’hit rate: il rapporto tra accessi soddisfatti dalla cache e accessi totali. Un hit rate elevato indica prestazioni ottimali.

Politiche di sostituzione e mappatura

StrategiaTipoCaratteristica
LRUSostituzioneLeast Recently Used — elimina i dati meno recentemente usati quando la cache è piena
Mappatura direttaPosizionamentoOgni blocco RAM → posizione fissa in cache. Semplice ma può generare conflitti
Completamente associativaPosizionamentoOgni blocco → qualsiasi posizione libera. Flessibile ma gestione complessa
Set-associativaPosizionamentoCompromesso tra le due precedenti — usata nella maggior parte dei processori moderni
// coerenza della cache nei sistemi multi-core
Nei processori multi-core più cache possono contenere copie diverse dello stesso dato. Se una cache modifica il dato, le altre devono essere aggiornate. I protocolli di coerenza garantiscono la sincronizzazione tra cache e RAM, evitando incongruenze nei dati.

Valutazione delle prestazioni

Nessun singolo parametro è sufficiente a descrivere le prestazioni di un processore — è necessario considerare un insieme di fattori tecnici complementari.

Frequenza di clock

Indica il numero di cicli al secondo, espressa in GHz. Una frequenza più alta non garantisce automaticamente prestazioni superiori: dipende anche dal numero di cicli per istruzione e dall’organizzazione interna del processore.

// overclocking
Aumentare la frequenza oltre i valori nominali (overclocking) comporta maggior consumo energetico, temperature più elevate e riduzione dell’affidabilità — senza necessariamente produrre un proporzionale aumento delle prestazioni reali.

Parametri di misurazione

ParametroDefinizioneAmbito di utilizzoLimite
MIPSMilioni di istruzioni/secondoBenchmark generaliNon considera la complessità delle istruzioni
FLOPSOperazioni virgola mobile/secondoCalcolo scientifico, grafica, AIRilevante solo per carichi numerici intensi
GHzMiliardi di cicli/secondoConfronto tra CPU della stessa famigliaNon confrontabile tra architetture diverse

Architettura 32 vs 64 bit

La larghezza dei registri determina la quantità di dati elaborabili in una singola operazione. Un’architettura a 64 bit non è solo “più veloce” — offre una capacità superiore di gestione della memoria e dei dati:

32 bit
Max ~4 GB RAM indirizzabile
Numeri interi max: ~2 miliardi
64 bit
Memoria teorica: ~18 exabyte
Standard in tutti i sistemi moderni

Numero di core

Dalla metà degli anni 2000, le prestazioni non vengono più migliorate principalmente alzando la frequenza, ma integrando più core nello stesso chip. Ogni core è una CPU indipendente — un processore multi-core può eseguire più thread o processi simultaneamente.

Dual-Core
2 core
Quad-Core
4 core
8–16 Core
Consumer high-end
64–128 Core
Server / HPC

La Legge di Moore

Nel 1965 Gordon Moore, cofondatore di Intel, osservò che il numero di transistor integrati in un chip tendeva a raddoppiare ogni 18–24 mesi. Questa previsione empirica ha descritto per decenni l’evoluzione dell’industria dei semiconduttori.

1971
2.300
transistor — Intel 4004
2000
42 MLN
transistor — Intel Pentium 4
oggi
100+ MLD
transistor — Apple M3 Ultra
// stato attuale
Il ritmo di crescita si è progressivamente ridotto a causa di limiti fisici (dimensioni atomiche dei transistor) e limiti energetici (dissipazione del calore). La Legge di Moore rimane tuttavia il punto di riferimento storico fondamentale nell’evoluzione dell’informatica moderna.

Riepilogo

  • Il pipelining sovrappone le fasi di esecuzione di istruzioni diverse, aumentando il throughput della CPU
  • I data hazard causano stall quando un’istruzione dipende dal risultato di quella precedente
  • I control hazard causano flush della pipeline in presenza di salti condizionati
  • Il forwarding riduce gli stall rendendo disponibile il risultato già dopo la fase EX
  • La branch prediction prevede l’esito dei salti per mantenere la pipeline attiva
  • L’architettura superscalare usa più pipeline in parallelo per eseguire più istruzioni per ciclo
  • La cache è memoria ad alta velocità che riduce i tempi di accesso alla RAM, organizzata in livelli L1, L2, L3
  • L’hit rate misura l’efficienza della cache — più è alto, migliori le prestazioni
  • Le prestazioni si misurano con clock, MIPS, FLOPS — nessun parametro è sufficiente da solo
  • La Legge di Moore (raddoppio dei transistor ogni 18–24 mesi) ha guidato l’evoluzione hardware per decenni

Lascia un commento