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.
In un modello a cinque stadi la pipeline processa istruzioni diverse in parallelo:
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.
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.
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.
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.
Gerarchia dei livelli
Cache Hit e Cache Miss
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
| Strategia | Tipo | Caratteristica |
|---|---|---|
| LRU | Sostituzione | Least Recently Used — elimina i dati meno recentemente usati quando la cache è piena |
| Mappatura diretta | Posizionamento | Ogni blocco RAM → posizione fissa in cache. Semplice ma può generare conflitti |
| Completamente associativa | Posizionamento | Ogni blocco → qualsiasi posizione libera. Flessibile ma gestione complessa |
| Set-associativa | Posizionamento | Compromesso tra le due precedenti — usata nella maggior parte dei processori moderni |
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.
Parametri di misurazione
| Parametro | Definizione | Ambito di utilizzo | Limite |
|---|---|---|---|
| MIPS | Milioni di istruzioni/secondo | Benchmark generali | Non considera la complessità delle istruzioni |
| FLOPS | Operazioni virgola mobile/secondo | Calcolo scientifico, grafica, AI | Rilevante solo per carichi numerici intensi |
| GHz | Miliardi di cicli/secondo | Confronto tra CPU della stessa famiglia | Non 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:
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.
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.
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