Valutazione delle Prestazioni
Transcript
Valutazione delle Prestazioni
Valutazione delle Prestazioni Sia data una macchina X, definiamo: 1 PrestazioneX = --------------------------Tempo di esecuzione X La prestazione aumenta con il diminuire del tempo di esecuzione (e diminuisce se il tempo di esecuzione aumenta). Tempo di esecuzione = tempo effettivamente dedicato dal processore = tempo di CPU = tempo utente + ( tempo sistema) Siano date due macchine X, Y Prestazione X > Prestazione Y se e solo se Tempo di esecuzione X < Tempo di esecuzione Y Esempio X è n volte più veloce di Y PrestazioneX ----------------PrestazioneY =n ovvero Tempo-esec.Y ----------------Tempo-esec.X =n Esempio: Il programma prog viene eseguito su A in 10 sec. e su B in 15 sec. Quanto più veloce è A rispetto a B? PrestazioneA ----------------- = PrestazioneB Tempo-esec.B 15 ----------------- = ------- = 1.5 Tempo-esec.A 10 Cicli di clock, durata del ciclo, frequenza del ciclo e CPU-time Tempo di esecuzione (tempo di CPU) = Cicli di clock della × durata del ciclo CPU di clock 1 frequenza di clock = ------------------------- (cicli/sec.) durata ciclo di clock tempo di CPU = cicli di clock della CPU ---------------------------frequenza di clock Esempio frequenza di clock = 100 MHz cicli di clock della CPU = 109 109 cicli tempo di CPU = ------------------------ = 10 sec. 100 × 106 cicli/sec. tempo di CPU = cicli di clock della CPU ---------------------------frequenza di clock Il tempo di CPU può diminuire sia aumentando la frequenza del clock sia diminuendo i cicli di clock necessari per eseguire il programma. Esempio frequenza di clock = 100 MHz cicli di clock della CPU = 109 109 cicli tempo di CPU = ------------------------ = 10 sec. 100 × 106 cicli/sec. frequenza di clock = 200 MHz cicli di clock della CPU = 1000 ×106 1000 ×106 cicli tempo di CPU = ------------------------ = 5 sec. 200 × 106 cicli/sec. frequenza di clock = 100 MHz cicli di clock della CPU = 500 ×106 500 ×106 cicli tempo di CPU = ------------------------ = 5 sec. 100 × 106 cicli/sec. Esercizio Sia A una macchina con frequenza di clock uguale a 100 MHz. Sia prog un programma che la cui esecuzione su A richiede 10 sec. di CPU. Sia B un'altra macchina che richiede solo 6 sec. di CPU per eseguire prog. Nell'ipotesi che l’aumento della frequenza non alteri il numero di di cicli di clock necessari all’esecuzione di prog, vogliamo determinare la frequenza di clock di B. ----------- tempo di CPU = cicli di clock della CPU ---------------------------frequenza di clock cicli di clock della CPUA = tempo di CPUA × 100 × 106 L'ipotesi del problema ci permette di determinare il numero di cicli di clock della CPU di B: cicli di clock CPUB = cicli di clock CPUA = 10 × 100 × 106 cicli di clock CPU frequenza di clock = ------------------------------tempo di CPU frequenza di clockB = (10 × 100 × 106 cicli ) / 6 sec. = 1000/6 × 106 cicli/sec. ~ 166 MHz Esercizio (continua) Quale è la frequenza di B, nell'ipotesi che l’aumento della frequenza aumenti di 1.2 volte il numero di cicli di clock? Nelle nuova ipotesi: cicli di clock della CPUB = 1.2 × cicli di clock della CPUA = 1.2 × 10 × 100 × 106 = 1200 × 106 frequenza di clockB = (1200 × 106 cicli ) / 6 sec. = 1200/6 × 106 cicli/sec. = 200 MHz Cicli di clock e numero di istruzioni di programma Sia dato un programma prog. Il numero (medio) di cicli di clock per istruzione è definito come: cicli di clock della CPU per eseguire prog CPI = ---------------------------------------------------numero istruzioni di prog Cicli di clock della CPU numero istruzioni di prog × CPI = Il tempo di CPU che avevamo espresso come: tempo di CPU = cicli di clock della CPU ---------------------------frequenza di clock può quindi essere espresso come: tempo di CPU = numero istruzioni × CPI ---------------------------------frequenza di clock = numero istruzioni × CPI × durata del ciclo di clock Esempio La macchina A ha una durata del ciclo di clock di 10 ns. ed utilizza in media 2 cicli di clock per eseguire un’istruzione di un programma prog. Supponendo che prog contenga 1000 istruzioni, quale è il tempo di CPU per eseguire prog? I dati del problema sono: Numero istruzioni di prog = 1000 Durata del ciclo di clock = 10 ns. CPI = 2 tempo di CPU = numero istruzioni × CPI × durata del ciclo di clock = 1000 × 2 × 10 ns. = 20 µs. Esercizio Macchina durata ciclo clock A 10 ns. B 20 ns. CPI (per eseguire prog) 2.0 1.2 Quale delle due macchine eseguirà prog più velocemente? E di quanto? cicli clock Sia I il numero di istruzioni di prog. tempo di CPUA = I × 2.0 × 10 ns. = I × 20 ns. tempo di CPUB = I × 1.2 × 20 ns. = I × 24 ns. durata ciclo CPI A è più veloce di B di … . prestazioneA --------------prestazioneB = tempo di CPUB -----------------tempo di CPUA … … 1.2 volte = I × 24 ns. ------------- = 1.2 I × 20 ns. Esercizio Macchina A frequenza clock 200 MHz # istr. 200 × 106 tempo 10 sec. Quale è il valore di CPI per eseguire le istruzioni considerate sulla macchina A? tempo di CPU = (numero istruzioni × CPI) × durata ciclo di clock = (numero istruzioni × CPI ) / frequenza di clock CPI = tempo di CPU × frequenza di clock / numero istruzioni = [10 sec. × (200 × 106 ) cicli/sec.] / (200 × 106) = 10 cicli Nella prima realizzazione del sottoinsieme di istruzioni MIPS abbiamo supposto che la durata del ciclo di clock fosse sufficientemente lunga da permettere la terminazione di ogni istruzione, ovvero CPI =1. Esempio Consideriamo un programma prog con la seguente distribuzione di istruzioni: load 24% store 12% R-istruzioni 44% salti (beq) 18% jump 2% Ogni istruzione richiede un diverso numero di accessi alla memoria, operazioni sui registri etc. Ipotizziamo i seguemti tempi per le varie componenti: accesso alla memoria: 2ns. operazioni ALU: 2 ns operazioni sui registri (lettura /scrittura): 1 ns. operazione di fetch (recupero dell’istruzione dalla memoria istruzioni) 2 ns. load store R-istr. Beq Jump acc. Mem 2 ns. 2 ns. 0 0 0 op. ALU acc. Reg. 2 ns. 2×1 ns. 2 ns. 1 ns. 2 ns. 2×1 ns. 2 ns. 1 ns. 0 0 fetch 2 ns. 2 ns. 2 ns. 2 ns. 2 ns. totale 8 ns. 7 ns. 6 ns. 5 ns. 2 ns. Avendo ipotizzato un ciclo di clock sufficientemente lungo da permettere la terminazione di ogni istruzione, la durata del ciclo di clock deve essere di almeno 8 ns. (tempo necessario per eseguire ua operazione di load) Allora, se I è il numero di istruzioni di prog, il tempo di esecuzione è tempo di CPU = 8 × I ns. Nota: nell'ipotesi di ciclo singolo questo tempo è indipendente dalla distribuzione delle istruzioni, se queste contengono almeno una load. In una diversa ipotesi (anche se non realistica) di ciclo variabile Il tempo necessario per eseguire le I istruzioni potrebbe essere load store R-istruzioni 24 × I/100 × 8 ns. 12 × I/100 × 7 ns. (1.92 0. 84 + + 44 × I/100 × 6 ns. 2. 64 + beq 18 × I/100 × 5 ns. 0. 90 + jump 2 × I/100 × 2 ns. 0.04) × I ns. = (6. 34 × I) ns. Questo richiederebbe un ciclo di clock variabile per ogni tipo di istruzione. Generalmente si avranno invece realizzazioni in cui il ciclo di clock non varia ma varia invece il numero di cicli di clock necessari per la realizzazione di una istruzione al variare della classe a cui l’istruzione appartiene. CPIi : cicli di clock per l’esecuzione delle istruzioni nella classe i : numero istruzioni della classe i Ci Cicli di clock della CPU = ∑ i CPIi × Ci CPI = Cicli di clock della CPU ----------------------------∑ i Ci Numero istruzioni considerate Esempio. Su di una macchina sono realizzate tre classi di istruzioni: Classe A B C CPI 1 2 3 Un progettista di compilatori può scegliere tra due diverse sequenze di istruzioni per realizzare un’istruzione di un linguaggio ad alto livello. Le due sequenze differiscono sia per il numero di istruzioni che per il tipo (classe di appartenenza) di istruzioni considerate: A B C seq_1 2 1 2 seq_2 4 1 1 1. Quale sequenza di istruzioni è più veloce? 2. Quale è il CPI per ciascuna sequenza? cicli di clock CPU per seq_1 = 2 × 1 + 1 × 2 + 2 × 3 = 10 cicli cicli di clock CPU per seq_2 = 4 × 1 + 1 × 2 + 1 × 3 = 9 cicli Quindi seq_2 è piu’veloce anche se ha più istruzioni. CPIseq_1 = Cicli di clock della CPU per seq_1 10 ------------------------------------------- = -------- = 2 Numero istruzioni seq_1 5 CPIseq_2 = Cicli di clock della CPU per seq_2 9 ------------------------------------------- = -------- =1.5 Numero istruzioni seq_2 6 Esercizio Un programma (compilatore) utilizza istruzioni appartenenti a 4 classi distinte: A, B, C e D, con le seguenti frequenze: A 40% B 25% C 25% D 10% - Quale tra le due seguenti opzioni scegliereste per realizzare un nuovo processore che deve eseguire tale programma? I) - Frequenza di clock di 500 MHz - CPI_A = 2, CPI_B = 3, CPI_C = 3, CPI_D = 5 II) - Frequenza di clock di 600 MHz - CPI_A = 2, CPI_B = 2, CPI_C = 3, CPI_D = 4 - Quale è la CPI per ciascuna opzione? I) Cicli di clock CPU per I istruzioni = ( 40 × 2 + 25 × 3 + 25 × 3 + 10 × 5 ) × I /100 = 2. 8 × I cicli CPU_1 = 2. 8 × I / 500 × 106 sec. = 5.6 × I ns. II) Cicli di clock CPU per I istruzioni = (40 × 2 + 25 × 2 + 25 × 3 + 10 × 4) × I /100 = 2.45 × I cicli CPU_2 = 2. 45 × I / 600 × 106 sec. = ~ 4.08 × I ns. La seconda opzione e' ~1.37 (=560/408) volte più veloce. CPI = Cicli di clock della CPU ----------------------------∑ i Ci CPI_prima opzione = 2.8 cicli CPI_seconda opzione = 2.45 cicli Nota. Nella seconda opzione: - aumenta la frequenza di clock - diminuisce il CPI ed entrambi i parametri portano ad un decremento del tempo di esecuzione. Supponiamo ora di modificare il programma in modo che la percentuale di istruzioni nelle varie classi venga modificata nel seguente modo. Variazione istr. classi A B C D 90% 90% 85% 95% Cioè viene diminuito il numero di istruzioni e per ogni classe la diminuzione percentuale è quella indicata. (Es. se prima venivano eseguite I istruzioni di classe A ora ne vengono eseguite I × 90/100 = 0.9 × I) Quale è in questo caso il nuovo valore di CPI per la macchina con frequenza di clock di 500 MHz? base new A B C D tot istr. 40×I /100 25×I /100 25×I /100 10×I /100 I 36×I /100 22.5×I /100 21.25×I /100 9.5×I /100 0.8925×I tot cicli clock = (2×36 + 3×22.5 + 3×21.5 + 5×9.5) ×I /100 = 2.515×I CPI = tot. cicli clock / tot istr. = 2.515×I / 0.8925×I = 2.81 Quanto più veloce è la nuova realizzazione rispetto alla prima? tempo di CPUbase n. cicli clockbase × durata ciclo di clock ---------------------- = -------------------------------------------------tempo di CPUnew n. cicli clocknew × durata ciclo di clock = (I × 2.8) / (I × 2. 515) = 1.11 Esempio Supponiamo che il tempo di CPU per eseguire su di una macchina A un dato programma prog sia di 100 sec. Supponiamo inoltre di sapere che 80 di questi 100 secondi sono spesi in operazioni di moltiplicazione. Di quanto deve essere incrementata la velocità di moltiplicazione affinchè il programma venga eseguito 5 volte più velocemente? Supponiamo di aumentare la velocità della moltiplicazione di n volte (con n da determinare). altre 80 op. Il nuovo tempo di CPU sarà quindi: ------ + 20 sec. n moltiplicazione Si deve determinare il valore di n affinchè (80/n) + 20 = 100/5 Esiste un tale n? (80/n) + 20 = 20 NO! NON è vero che il miglioramento di un aspetto della macchina migliori le prestazioni complessive di una quantità proporzionale all’entità del miglioramento. Il miglioramento complessivo dipende anche da quanto viene utilizzata la caratteristica che è stata migliorata. Legge di Amdahl Corollario È sempre preferibile rendere più veloce il caso più comune. Esercizio Supponiamo di poter realizzare una nuova unità per le operazioni in virgola mobile che sia 5 volte più veloce di quella originale. Supponiamo inoltre che l’esecuzione di prog richieda 10 sec. nella versione originale e che metà di questi 10 secondi vengano impiegati per operazioni in virgola mobile. Quale miglioramento si ha nell’esecuzione di prog utilizzando la nuova unità di calcolo? Miglioramento Prestazione dopo la modifica = -----------------------------------------Prestazione prima della modifica Tempo di esecuzione prima della modifica = ------------------------------------------------------Tempo di esecuzione dopo la modifica Tempo di esecuzione dopo la modifica = 5 sec. (tempo dedicato alle operazioni NON in virgola mobile) + 1 sec. (tempo dedicato alle operazioni in virgola mobile) Miglioramento = 10/6 = Quale programma scegliereste (con quali caratteristiche) per mostrare un miglioramento di 3? Supponiamo che il tempo T_prec prima della modifica sia ripartito: X% per operazioni floating point Y% per altre operazioni T_prec = (T_prec × X /100) + (T_prec × Y /100) Dopo la modifica il tempo di esecuzione è: T_dopo = (T_prec × X /100) /5 + (T_prec × Y /100) = T_prec × (X+5Y) /500 e poichè X+Y = 100 = T_prec × (100+4Y) /500 Per mostrare un miglioramento di 3, dobbiamo scegliere Y in modo che T_prec / T_dopo = T_prec / (T_prec × (100+4Y) /500) = 3 Ovvero Y = 50/3 (e quindi X = 250/3) Si può ad esempio creare un programma che, prima del miglioramento, viene eseguito in 300 sec., utilizza 50 sec. per operazioni NON floating point e 250 sec. per operazioni floating point. Dopo il miglioramento dell’unità di floating point si avrà il miglioramento globale desiderato. Benchmarks (programmi di valutazione) Sono (raccolte di) programmi di piccole dimensioni che vengono utilizzati per valutare le prestazioni di una macchina, (o di un compilatore attraverso l’esecuzione del suo compilato). Esempio: SPEC (System Performance Evaluation Cooperative) è una raccolta di programmi sviluppati per valutare le prestazioni di una macchina. L’utilizzo di benchmarks non sempre fornisce risultati sicuri: E’possibile applicare miglioramenti “ad hoc” volti a migliorare solo i casi trattati dai benchmarks. o facilmente interpretabili. esempio programma macchina A macchina B 1 2 1 sec. 1000 sec. 10 sec. 100 sec. quali conclusioni possiamo trarre? MIPS = milioni di istruzioni per secondo Numero di istruzioni MIPS = ------------------------------------Tempo di esecuzione × 106 = Numero di istruzioni -------------------------------------Cicli di CPU × durata clock × 106 Ricordando che: Cicli di CPU = Numero istruzioni × CPI durata clock = 1/ frequenza clock = Numero di istruzioni × frequenza clock ----------------------------------------------Numero di istruzioni × CPI × 106 = frequenza clock -------------------CPI × 106 N.B. Il valore CPI “dipende” dall’insieme di istruzioni considerate. Dedurre prestazioni basandosi sulla misura data dai MIPS può condurre a conclusioni sbagliate. (Non si tiene conto di possibili diversi CPI per diverse classi di istruzioni). Esempio Si consideri una macchina con frequenza di clock di 100MHz e tre classi di istruzioni con CPI_A=1, CPI_B =2, CPI_C =3. Si vogliono confrontare due diversi compilatori: Compilatore milioni di istr. della classe A B C C1 C2 5 10 1 1 1 1 Quale sequenza di codice viene eseguita più velocemente? MIPS = 100 MHz ------------CPI × 106 Cicli di CPU CPI = ----------------------------Numero di istruzioni Per C1 si ottiene CPI_C1 = [(5 × 1) + (1 × 2) + (1 × 3)] / 7 = 10/ 7 Per C2 si ottiene CPI_C2 = [(10 × 1) + (1 × 2) + (1 × 3)] / 12 = 15/12 E quindi: MIPS_1 = 100 × 106 / ( 10/7 × 106) = 100 × 7/10 = 70 MIPS_2 = 100 × 106 / ( 15/12 × 106) = 100 × 12/15 = 80 E’vero che C2 è preferibile? tempo di CPU = cicli di clock della CPU / frequenza di clock tempo di CPU_1 = 10× 106 / 100 × 106 = 0.1 sec. tempo di CPU_2 = 15× 106 / 100 × 106 = 0.15 sec.