Performance ● Come si definisce il concetto di “performance”? – Tempo di esecuzione di un programma ● Wall-clock time – ● CPU time – – – tiene conto solo del tempo in cui il programma usa la CPU user time + system time throughput ● – tiene conto anche di I/O e delle attese dovute alla condivisione delle risorse con altri programmi numero di task/transazioni eseguiti per unità di tempo … performance = 1 / CPU time 194 CPU time CPU time = #istruzioni CPI Clock cycle ● #istruzioni: numero di istruzioni nel programma ● CPI: numero medio di cicli di clock per istruzione ● Clock cycle: durata di un ciclo di clock ● Per ridurre il tempo di CPU si può intervenire su ognuno dei fattori – I fattori non sono indipendenti! 195 Cosa influenza il CPU time ● Algoritmo e qualità di implementazione ● Linguaggio di programmazione ● Compilatore ● Instruction Set Architecture ● Processore ● Memoria 196 Benchmark ● Insieme di programmi scelti per la valutazione della performance SPECINT2006 for Intel Core i7 920 197 Pipeline 198 Pipelining ● L'implementazione di un datapath basata su un singolo ciclo di clock è inefficiente – il ciclo di clock deve essere sufficiente ad eseguire l'intera istruzione più lenta ● lw Instruction memory → register file → ALU → data memory → register file ● – CPI = 1, ma ciclo di clock molto alto – può andare bene solo per instruction set molto semplici Il pipelining è una tecnica implementativa in cui le esecuzioni di più istruzioni sono sovrapposte nel tempo 199 Esempio ● Basato su una lavanderia – lava, asciuga, piega, metti via – in un dato momento ogni carico usa una risorsa diversa ● Speed-up – 4 carichi 8 / 3.5 = 2.3 – N carichi 2N / (0,5N + 1,5) → 4 = numero di passi (stadi) ● Aumenta il numero di carichi eseguiti per unità di tempo (throughput), non la durata di un singolo carico (latenza) 200 MIPS pipeline ● Cinque stadi (stage): – IF: fetch dell'istruzione dalla memoria – ID: decodifica dell'istruzione e lettura dei registri – EX: esecuzione dell'operazione or calcolo dell'indirizzo – MEM: accesso alla memoria dati – WB: scrittura del risultato in un registro Rappresentazione semplificata del datapath Lettura dell'istruzione Lettura di $t0 e $t1 Scrittura di $s0 201 Pipelined datapath ● Il flusso è da sinistra a destra, con due eccezioni: – scrittura del prossimo PC – scrittura del risultato dell'istruzione in un registro 202 Rappresentazioni grafiche 203 Pipeline performance ● ● ● Assumiamo i tempi seguenti per i diversi stadi: – 100ps per la lettura o scrittura dei registri – 200ps per gli altri stadi Ciclo di clock = 200ps, corrispondente allo stadio più lungo Confronto tra implementazioni single-cycle e pipeline di alcune istruzioni rappresentative Instr Instr fetch Register read ALU op Memory access Register Single-cycle write time lw 200ps 100 ps 200ps 200ps 100ps sw 200ps 100 ps 200ps 200ps R-format 200ps 100 ps 200ps beq 100 ps 200ps 200ps 800ps 700ps 100ps 600ps 500ps 204 Pipeline performance (lw) ● Lo speed-up (massimo) è 4 e non 5 – ● I passi non sono perfettamente bilanciati Notare che la latenza di una singola istruzione aumenta – e per alcune istruzioni alcuni stadi sono sprecati 205 Pipelining e ISA ● L'ISA MIPS favorisce il pipelining – Tutte le istruzioni sono a 32 bit ● – Pochi formati per le istruzioni e regolari ● – L'indirizzo può essere calcolato nel terzo passo e l'accesso alla memoria effettuato nel quarto Allineamento degli accessi in memoria ● – Decode e lettura registri in un ciclo Accesso alla memoria solo con istruzioni di load e store ● – Più facile implementare sia fetch che decode in un ciclo L'accesso alla memoria avviene in un ciclo Ogni istruzione MIPS scrive al più un risultato e lo fa nell’ultimo stadio della pipeline 206 Criticità (hazard) ● ● ● ● Situazioni che impediscono la partenza dell'istruzione successiva nel ciclo successivo Criticità strutturali: una risorsa necessaria all'esecuzione di una istruzione è occupata Criticità sui dati: un'istruzione dipende da un valore non ancora disponibile Criticità sul controllo: una decisione di controllo dipende dal risultato di un'istruzione non ancora conclusa 207 Criticità strutturale ● ● Dovuta a conflitti nell'uso di una risorsa Esempio: la memoria contiene sia dati sia istruzioni, ma può essere acceduta una sola volta per ciclo di clock – lw o sw in MEM confligge con una istruzione successiva in IF – in tal caso l'istruzione in IF dovrebbe essere bloccata (stall) per un ciclo ● – ● inserimento di una “bolla” (bubble) nella pipeline notare che non ci possono essere una lw e una sw contemporaneamente in MEM La criticità è risolvibile usando due memorie – o due cache – una per le istruzioni, una per i dati 208 Criticità sui dati ● Una istruzione dipende dal risultato prodotto da una istruzione precedente 209 Criticità sui dati ● Si risolve inserendo bolle nella pipeline in attesa che il risultato sia disponibile nel register file – ● l'inserimento può avvenire sia ad opera del processore stesso che del compilatore (istruzione nulla nop) Oppure... 210 Criticità sui dati ● Oppure si usa il forwarding (o bypassing) – si creano ulteriori connessioni nel datapath così da rendere un risultato disponibile non appena prodotto – senza aspettare che venga salvato nel registro di destinazione 211 Criticità sui dati ● ● Non sempre il forwarding evita tutti gli stalli – un risultato potrebbe non essere stato ancora calcolato quando è richiesto – caso load-use Uso contemporaneo di bolle e forwarding 212 Ordine delle istruzioni e stalli ● Gli stalli possono essere in alcuni casi evitati con un opportuno riordinamento delle istruzioni da eseguire a = b + e; c = b + f; stallo stallo lw $t1, lw $t2, add $t3, sw $t3, lw $t4, add $t5, sw $t5, 0($t0) 4($t0) $t1, $t2 12($t0) 8($t0) $t1, $t4 16($t0) 13 cicli lw $t1, lw $t2, lw $t4, add $t3, sw $t3, add $t5, sw $t5, 0($t0) 4($t0) 8($t0) $t1, $t2 12($t0) $t1, $t4 16($t0) 11 cicli 213 Ordine delle istruzioni e stalli ● Il riordinamento può essere fatto – dal compilatore ● – dal processore ● ● ● deve conoscere l'architettura per cui genera codice out-of-order execution in genere associato a tecniche predittive-speculative (vedi oltre) Il riordinamento (ovviamente) non deve modificare il significato di un programma – as-if 214 Criticità sul controllo ● Una decisione di controllo dipende dal risultato di un'istruzione non ancora conclusa 215 Criticità sul controllo add beq lw ... 40: or ● $4, $1, $3, $5, $6 $2, 40 300($0) $7, $8, $9 La decisione se eseguire il salto o meno avviene nello stadio MEM – bisogna aspettare 3 cicli di clock dopo l'inizio dell'istruzione beq prima di decidere la prossima istruzione da caricare – necessario inserire 3 bolle → 3 stalli 216 Criticità sul controllo ● Prima soluzione: – aggiungendo ulteriore logica, si può anticipare il controllo della condizione di due stadi, portandolo nello stadio ID – un solo stallo caso branch taken 217 Criticità sul controllo ● Seconda soluzione – tiriamo a indovinare → branch prediction – stallo solo se la predizione è sbagliata prevediamo che il salto non venga eseguito predizione sbagliata 218 Branch prediction ● ● Static branch prediction – Basato sul comportamento tipico dei salti – Esempio: il salto all'indietro (es: loop) è preso – Esempio: il salto in avanti (es: if) non è preso Dynamic branch prediction – L'hardware misura il comportamento recente effettivo ● ● es: può registrare la storia recente di ogni branch – Assume che il comportamento futuro sia simile – Se la predizione è sbagliata, la pipeline va pulita, si carica l'istruzione corretta e si aggiorna la storia As-if 219 2-bit branch predictor ● Cambia decisione solo dopo due decisioni sbagliate 220 Criticità sul controllo ● Terza soluzione – branch-delay slot – l'istruzione dopo l'istruzione di branch viene sempre eseguita – si possono riordinare le istruzioni, inserendo in quella posizione una istruzione indipendente dal branch stesso ● se tale istruzione non esiste → nop 221 Registri della pipeline ● L'output di ogni stadio viene salvato in registri e diventa input per lo stadio successivo – viene salvato tutto quello che serve in uno stadio successivo 222 IF per load e store 223 ID per load e store 224 EX per load 225 MEM per load 226 WB per load 227 WB per load che registro viene scritto? 228 WB per load (corretto) il registro di destinazione viene “portato avanti” e usato durante WB 229 MEM per store 230 WB per store 231 Esempio stato della pipeline al CC 5 232 Controllo della pipeline ● Classifichiamo i segnali di controllo del datapath a seconda dei vari stadi in cui sono utilizzati 233 Controllo della pipeline 234 Controllo della pipeline ● ● Come nel caso del datapath a ciclo singolo, anche nel caso della pipeline i segnali di controllo sono derivati dall'istruzione I segnali di controllo sono calcolati in ID ma portati avanti fin dove necessario 235 Controllo della pipeline 236 Gestione del forwarding ● I registri sono passati lungo la pipeline – ● I registri operandi per l'ALU, nello stadio EX, sono dati da – ● es.: ID/EX.RegisterRs è il registro per Rs salvato nel pipeline register ID/EX ID/EX.RegisterRs, ID/EX.RegisterRt Si ha una criticità sui dati quando vale una delle seguenti condizioni: – EX/MEM.RegisterRd = ID/EX.RegisterRs – EX/MEM.RegisterRd = ID/EX.RegisterRt – MEM/WB.RegisterRd = ID/EX.RegisterRs – MEM/WB.RegisterRd = ID/EX.RegisterRt forward da EX/MEM pipeline reg forward da MEM/WB pipeline reg 237 Gestione del forwarding ● Inoltre l'istruzione più avanzata deve essere una istruzione che scriverà in un registro – EX/MEM.RegWrite, MEM/WB.RegWrite 238
© Copyright 2024 ExpyDoc