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.