Cicli Macchina: Definizione, Variabilità e Come Trovarli
Cos'è un Ciclo Macchina?
Un ciclo macchina (o ciclo di istruzione) è la sequenza di passaggi che una CPU esegue per recuperare, decodificare, eseguire e scrivere indietro una singola istruzione. La sua durata in cicli di orologio varia enormemente per architettura, complessità dell'istruzione, microarchitettura (pipeline, superscalar, OoO) e gerarchia di memoria.
Ciclo Classico a 4 Fasi (von Neumann)
- Recupero (Fetch): PC → Bus Indirizzo → Memoria → Registro Istruzione. PC++.
- Decodifica (Decode): Opcode → Unità di Controllo → Segnali di controllo (operazione ALU, selezione registri, R/W memoria).
- Esecuzione (Execute): ALU calcola / Calcolo indirizzo / Decisione di salto.
- Scrittura Indietro (Writeback): Risultato → File Registro / Memoria.
Perché i "Cicli per Istruzione" (CPI) Non Sono Fissi
| Fattore | Effetto sul CPI |
|---|---|
| Pipeline | CPI ideale = 1 (un'istruzione completa per orologio). Pericoli (dati, controllo, strutturale) aggiungono stalli. |
| Superscalar / OoO | Più istruzioni/orologio → CPI < 1 (IPC > 1). |
| Cache Miss | Miss L1: +4–12 cicli. Miss L2: +30–50. DRAM: +150–300 cicli. |
| Predizione Ramo Errata | Flush pipeline: 10–20+ cicli di penalità. |
| Istruzioni Complesse | DIV, SQRT, trascendenti: 10–100+ cicli (microcodificate). |
| Interrutt/Eccezione | Salvataggio/ripristino contesto: centinaia di cicli. |
Come Trovare il CPI per il *Tuo* Caso
- Manuale ISA: ARM Cortex-M4: "ADD r0,r1,r2 = 1 ciclo". Cortex-A78: "FP MLA = 4 cicli latenza, 0,5 throughput".
- Guide di Ottimizzazione del Fornitore: Intel 64/IA-32 Optimization Manual, guide uArch AMD.
- Strumenti di Analisi Statici: LLVM-MCA, IACA (ritirato), uArchBench.
- Contatori di Prestazioni Hardware (PMCs): `perf stat` (Linux), VTune, contatori PMU (CYCLES, INST_RETIRED, STALL_CYCLES). CPI Effettivo = CYCLES / INST_RETIRED.
- Simulatori Ciclo-Accurati: gem5, Simics, QEMU (modalità TCG).
Esempio Pratico
ARM Cortex-M3 (STM32F1): Nessuna cache, pipeline a 3 stadi.
- ADD (reg): 1 ciclo.
- LDR (pool letterale, flash attesa 0): 2 cicli.
- MUL: 1 ciclo (moltiplicatore a ciclo singolo).
- SDIV: 2–12 cicli (dipendente dai dati).
- Ingresso Interrupt: 12 cicli (push stack).
Punto Chiave
Non esiste un "numero di ciclo macchina" universale. Misura sull'hardware target con carico di lavoro rappresentativo usando PMCs. I conteggi di ciclo del datasheet sono ideali best-case, singola istruzione, zero-stati di attesa.