Prestazioni - Dipartimento di Informatica

Transcript

Prestazioni - Dipartimento di Informatica
Le prestazioni di un sistema informatico
- Dal punto di vista dell'utente finale, un calcolatore è più veloce
di un altro se esegue lo stesso compito in un tempo inferiore.
- Il direttore di un centro di calcolo ha invece un'opinione diversa,
legata alla sua esigenza di soddisfare un gran numero di utenti;
per lui il sistema più veloce è quello che completa il maggior
numero di lavori in un intervallo di tempo definito, per esempio in
un'ora.
- Si può quindi affermare che l'utente è interessato alla riduzione
del tempo di risposta (spesso indicato anche con i termini di
tempo di esecuzione o di !atenza), ossia il tempo che trascorre
tra l'inizio di un compito e il suo completamento.
- Il direttore di un centro di calcolo, invece, è interessato a un
parametro più complessivo: la quantità di lavoro svolto in un dato
tempo, misurato spesso con il termine inglese di throughput.
Prestazioni (I)
- Le prestazioni di un calcolatore si valutano dunque
tipicamente in riferimento a durate temporali: il
calcolatore che svolge la stessa quantità di lavoro nel
minor tempo è più veloce.
- Occorre allora stabilire come, in questo contesto,
misurare gli intervalli di tempo.
- Le due modalità che meglio si adattano ai punti di
vista presentati in precedenza, quello dell'utente e
quello del direttore del centro di calcolo, sono l’elapsed
time ed il CPU time.
1
Prestazioni (II)
- Si può misurare il tempo complessivo (detto in genere
e!apsed time) che trascorre tra l'inizio e la fine
dell'esecuzione del compito.
- Tempo che comprende gli accessi ai dischi, gli accessi alla
memoria, le attività di ingresso/ uscita, il sovraccarico di
lavoro dovuto alla presenza del sistema operativo, nonché
l'esecuzione di altri processi attivi concorrentemente con
quello in esame.
- Si può misurare il tempo effettivo di elaborazione dedicato
dalla CPU allo svolgimento del compito, detto in genere
tempo di CPU (CPU time), che non comprende i tempi di
attesa dovuti alle operazioni di ingresso/uscita e
all'esecuzione di altri processi.
Elapsed vs. CPU time
- Dal punto di vista dell'utente, ogni ostacolo alla rapida
esecuzione del processo sotto esame è rilevante:
- come parametro di valutazione delle prestazioni si considera
quindi il tempo complessivo di esecuzione del processo.
- Per il gestore di un centro di calcolo, invece, il valore
importante è il tempo di CPU,
- che descrive quanto ogni processo tiene occupato il processore
che lo esegue.
- Infatti, ipotizzando che il calcolatore in esame esegua più processi
contemporaneamente, se si sostituisce il processo che si pone in
attesa con un altro pronto per l'esecuzione, anche nei tempi morti di
un processo la CPU non rimane inattiva ma esegue appunto altri
processi.
2
I parametri che influenzano il
tempo di CPU (I)
- Il tempo di CPU di un processo (tCPU) può essere
espresso dal prodotto del numero di cicli di clock nCK
necessari per il completamento del processo stesso per il
periodo di clock TCK :
tCPU = nCK x TCK
• Se, invece del periodo, si vuole considerare il suo
inverso: la frequenza di clock fCK, che viene misurata in
megahertz, si ottiene:
tCPU = nCK / fCK
I parametri che influenzano il
tempo di CPU (II)
- Parametro interessante è il numero ni di istruzioni eseguite.
- Dividendo il numero dei cicli di clock per il numero delle
istruzioni si ricava il numero medio di cicli di clock richiesti per
eseguire un'istruzione (CPI), secondo la relazione:
CPI = nCK / ni.
- Il valore di CPI può anche essere ricavato da un'analisi
statistica del comportamento di diversi programmi, per poi
essere utilizzato per ricavare il tempo di CPU di un certo
processo, dato il numero delle corrispondenti istruzioni da
eseguire.
- Infatti nCK = CPI x ni può essere sostituito nell'espressione
del tempo di CPU:
tCPU = CPI x ni x TCK oppure anche tCPU = CPI x ni / fCK
3
Velocità di esecuzione
- La velocità di esecuzione dipende essenzialmente da
tre fattori:
1- la frequenza di clock alla quale funziona la CPU;
2- il numero dei cicli di clock necessari in media per
completare un'istruzione;
3- il numero delle istruzioni macchina che devono
essere eseguite per completare un processo.
CISC
- Nella scelta dell'insieme delle istruzioni sono contrapposte
due diverse filosofie di progettazione:
-
ClSC (Complex Instruction Set Computer) e
RISC (Reduced Instruction Set Computer).
- La progettazione delle CPU CISC è basata sull'idea di
realizzare a livello hardware funzioni sempre più complesse, in
modo che il processore sia in grado di eseguirle direttamente.
- Questo si riflette nella scelta di istruzioni macchina
compIesse,
- che possono richiedere anche un elevato numero di cicli di clock per
essere eseguite ma che dovrebbero consentire di ridurre il numero di
istruzioni richieste per il completamento dell'esecuzione di un
programma.
4
RISC (I)
- La dimensione del programma eseguibile e quindi il numero
delle istruzioni da cui è costituito, dipende dall'abilità del
compilatore che viene utilizzato
- per tradurre in linguaggio macchina il codice scritto in un linguaggio
di programmazione di alto livello.
- Varie analisi hanno dimostrato che anche i migliori
compilatori non erano in grado di sfruttare efficacemente un
insieme di istruzioni complesse, e ne utilizzavano solo un
sottoinsieme ridotto.
-Da ciò ha preso spunto l'approccio RISC, basato sull'idea di
rendere molto semplici le istruzioni riconosciute dalla CPU, e
di inserire nell'insieme di tal istruzioni solo quelle che i
compilatori riescono a utilizzare facilmente.
RISC (II)
- Si possono così realizzare CPU capaci d eseguire le
istruzioni a velocità elevate, riducendo il loro periodo di clock.
- Nel progettare una CPU RISC si cerca di ridurre la
complessità dell'insieme delle istruzioni per ottenere un basso
valore di CPI e una elevata frequenza di clock,
- compensando in questo modo il grande numero di istruzioni
necessarie per completare un processo.
- Le architetture RISC hanno avuto un grande successo nei
primi anni novanta, ma non sono riuscite a soppiantare le CPU
CISC nel settore dei personal computer,
- dove il livello delle prestazioni non sempre viene considerato come il
principale criterio di scelta tra diversi calcolatori.
- In questo settore, infatti, prevalgono motivazioni diverse, come la
compatibilità con il software già installato e la diffusione di
programmi applicativi.
5
CRISC
- Nella loro evoluzione, le CPU CISC hanno inoltre fatto
propri alcuni dei principi che hanno ispirato le architetture
RISC,
-
portando alla realizzazione di architetture miste (dette anche
CRISC).
- Obiettivo di queste CPU è di bilanciare la complessità
dell'insieme delle istruzioni con la velocità di esecuzione,
garantendo in ogni caso la compatibilità con le versioni
precedenti rispetto all'insieme delle istruzioni eseguibili.
-La ricerca nel settore dei compilatori ha consentito poi di
migliorare l'utilizzo delle istruzioni più complesse e di sfruttare
sempre più le unità funzionali complesse inserite nelle CPU
CISC.
Altri indicatori di prestazioni
- Un primo indice di prestazioni si ottiene misurando il
numero di istruzioni in linguaggio macchina che la CPU può
eseguire in un secondo.
- Tale indice è detto MIPS (Mega Instructions Per Second) si
ottiene per un certo programma dall’espressione:
MIPS = ni / tCPU x 10-6,
che può essere riscritta anche come MIPS = fCK / CPI x 10-6
- Il valore espresso dai MIPS rappresenta quindi la frequenza
di esecuzione delle istruzioni, e quanto più veloce è il
calcolatore tanto più elevato è tale valore.
6
I MIPS sono a volte poco
affidabili (I)
- I MIPS dipendono dall'insieme delle istruzioni macchina:
-
istruzioni più semplici corrispondono a valori più elevati.
Per questo motivo non è significativo utilizzare i MIPS per
confrontare calcolatori caratterizzati da diversi insiemi di istruzioni.
- I MIPS misurati per uno stesso calcolatore variano a
seconda del programma considerato.
-
Infatti, il numero delle istruzioni eseguite in un secondo dipende
da quali istruzioni vengono eseguite:
- quelle più semplici richiedono meno tempo di quelle complesse.
- Cambiando il programma varia anche l'insieme delle istruzioni da
eseguire e quindi il valore di MIPS.
I MIPS sono a volte poco
affidabili (II)
- In certe condizioni i MIPS possono variare in maniera
inversamente proporzionale alle prestazioni.
- Si consideri il caso di un calcolatore dotato di un coprocessore
opzionale per le operazioni in virgola mobile.
- In assenza del coprocessore, tali operazioni vengono tradotte, con
l'intervento di opportune librerie software, in una serie, anche molto
lunga, di istruzioni più semplici.
- Tante operazioni semplici consentono quindi di ottenere un numero di
MIPS elevato.
- Quando invece si utilizza il coprocessore, le operazioni in virgola
mobile vengono eseguite direttamente in hardware, anche se le
istruzioni macchina richiedono un numero di cicli di clock superiore alla
media delle semplici operazioni comprese nella libreria software.
- L'effetto finale è che si usano molte meno istruzioni, più complesse di
quelle usate prima e questo si traduce un valore di MIPS ridotto, anche
se il tempo complessivo di esecuzione è inferiore.
7
MegaFLOPS
- Un secondo indice alternativo al tempo di esecuzione si
basa sul numero di operazioni (e non istruzioni) in virgola
mobile eseguite in un secondo,
- indicato dall' acronimo FLOPS, che sta per FLoating point
Operation Per Second.
- Anche in questo caso, per trattare con numeri ragionevoli, si
considerano i milioni di operazioni (MegaFLOPS, ovvero
MFLOPS) piuttosto che le singole operazioni.
- La formula utilizzata per calcolare i MFLOPS si ottiene
direttamente dalla definizione:
MFLOPS = nFLOP / tCPU x 10-6
dove nFLOP indica il numero delle operazioni in virgola mobile
(FLOP) svolte dal processo sotto esame.
I MegaFLOPS sono a volte
poco affidabili (I)
- Esistono intere categorie di programmi che praticamente
non effettuano operazioni in virgola mobile (un tipico
esempio è rappresentato dai compilatori),
-
quindi applicando i MFLOPS al di fuori del loro ambito si possono
ricavare indicazioni fuorvianti.
- Inoltre, la scelta di riferirsi a operazioni piuttosto che a
istruzioni non risolve effettivamente il problema evidenziato a
proposito dei MIPS:
-
l'ipotesi che uno stesso programma, funzionando su diversi
calcolatori, esegua eventualmente un diverso numero di istruzioni
ma lo stesso numero di operazioni in virgola mobile non è in
generale corretta.
8
Incrementare le prestazioni
con il parallelismo
-La frequenza di clock influenza direttamente il tempo di ciclo
del data path e quindi le prestazioni di un calcolatore;
- è limitata dalla tecnologia disponibile.
- Il parallelismo permette di migliorare le prestazioni senza
modificare la frequenza di clock.
- Esistono due forme di parallelismo:
-
parallelismo a livello delle istruzioni
(architetture pipeline o architetture superscalari);
- parallelismo a livello di processori
(Array computer, multiprocessori o multicomputer).
Architettura pipeline
- Organizzazione della CPU come una “catena di montaggio”:
-
la CPU viene suddivisa in “stadi”, ognuno dedicato all’esecuzione
di un compito specifico;
- l’esecuzione di un’istruzione richiede il passaggio attraverso (tutti o
quasi tutti) gli stadi della pipeline;
- in un determinato istante, ogni stadio esegue la parte di sua
competenza di una istruzione;
- in un determinato istante, esistono diverse istruzioni
contemporaneamente in esecuzione, una per ogni stadio.
9
Introduzione alle pipeline (I)
- Il pipelining è una tecnica di realizzazione in cui si
sovrappone l' esecuzione di più istruzioni.
- Oggi il pipelining è la chiave per rendere veloci i processori.
- Una pipeline è come una catena di montaggio: in entrambe
ciascun passo completa una parte del lavoro complessivo.
- In una catena di montaggio ben bilanciata, una nuova
automobile esce dalla catena nel tempo medio che serve per
svolgere una delle fasi della lavorazione.
- La catena di montaggio non riduce il tempo di realizzazione
di una singola automobile, essa aumenta il numero di
automobili che vengono costruite in una certa unità di tempo
-
la frequenza con cui le automobili vengono completate.
Introduzione alle pipeline (II)
-Come in una catena di montaggio, il lavoro che deve essere
fatto in una pipeline da un'istruzione è spezzato in piccole
parti
- ciascuna delle quali richiede una frazione del tempo necessario al
completamento dell 'intera istruzione.
-Ciascuno di tali passi è chiamato stadio o segmento di
pipeline.
-Gli stadi, nel loro insieme, costituiscono la pipeline:
- le istruzioni entrano da una estremità, vengono elaborate
attraverso gli stadi, escono dall'altro estremo.
10
Introduzione alle pipeline (III)
-Il pipelining non riduce il tempo necessario al completamento
di una singola istruzione.
-Questa tecnica accresce il numero di istruzioni eseguibili
simultaneamente e la frequenza con cui le istruzioni vengono
completate:
- cioe’ incrementa la frequenza di operazione (throughput) delle
istruzioni più che migliorare il tempo di esecuzione della singola
istruzione.
-Le pipeline prevedono quindi la sovrapposizione temporale
dell’ esecuzione di diverse istruzioni.
Introduzione alle pipeline (IV)
-La frequenza di operazione di una catena di montaggio
di automobili è determinata dalla frequenza con cui le
automobili escono dalla catena.
-La frequenza di operazione di una pipeline è
determinata dalla frequenza di uscita delle istruzioni.
-Gli stadi di pipeline sono collegati in successione,
devono tutti operare in modo sincrono:
- la frequenza con cui le istruzioni escono dalla pipeline non
può superare quella con cui entrano nella pipeline.
11
Introduzione alle pipeline (V)
-Il tempo necessario per far avanzare un'istruzione di un
passo lungo la pipeline corrisponde idealmente a un ciclo
di clock.
-Poiché tutti gli stadi devono operare in modo sincrono, la
durata di un ciclo di clock è determinata dal tempo richiesto
dallo stadio più lento della pipeline.
-L'obbiettivo dei progettisti è bilanciare la lunghezza di
ciascuno stadio.
-Se ciò non avviene, si crea un tempo d'attesa tra uno
stadio e l'altro.
Un semplice esempio
- Se ipotizziamo che nella nostra unità di calcolo multiplatori,
unità di controllo, accessi al PC e l’unità di estensione in
segno non abbiano ritardi, il tempo necessario per eseguire
un’istruzione potrebbe essere:
12
Un semplice esempio (II)
- Supponiamo di avere una sequenza di tre istruzioni di
caricamento (lw).
- Il tempo che intercorre tra la 1 e la 4 istruzione sarà 3x40 =
120 ns.
Un semplice esempio (III)
- Una sequenza di istruzioni di caricamento, nella
realizzazione con pipeline diventa allora:
13
Un semplice esempio (IV)
-Il tempo che intercorre tra la 1 e la 4 istruzione sarà 70 ns.
-Se però aggiungiamo 1000 istruzioni simili, il tempo di
esecuzione diventa 1000 x 10 ns + 70 ns = 10070 ns.
-Nell’esempio senza pipeline invece avremmo 1000 x 40
+120 ns = 40120 ns.
-Quindi in questo esempio il pipelining migliora la frequenza
di operazione delle istruzioni, pur peggiorando il tempo di
esecuzione della singola istruzione.
-E’ interessante notare che rispetto ad altre tecniche di
accelerazione dell’esecuzione, il pipelining ha il vantaggio di
essere invisibile agli occhi del programmatore,
- che non nota cambiamenti nel comportamento dell’esecutore
Evoluzione: superpipelining
- Per aumentare la frequenza a cui può funzionare un
processore si può aumentare il numero di stadi della pipeline
(Superpipeline)
– idea generale: la frammentazione ulteriore della pipeline in più
stadi rende i singoli stadi più elementari e quindi i segnali possono
attraversarli più velocemente (meno ritardi di propagazione dovuti
alla semplificazione dei circuiti)
– estremizzazione del principio della pipeline
– Pentium 4 Prescott: 31 stadi
– anche il cambio di tecnologia permette fisicamente un aumento
della frequenza di funzionamento
14
Evoluzione: superscalarità (I)
- Vista la disponibilità di un maggior numero di transistor si
inseriscono più pipeline nella stessa CPU
– aumenta il parallelismo perché è possibile eseguire
contemporaneamente diversi flussi di istruzioni;
– è necessario garantire che non ci siano conflitti tra le istruzioni che
vengono eseguite insieme e che l’ordine di esecuzione sia tale da
massimizzare l’uso delle unità funzionali;
– di solito il controllo è affidato al compilatore
Evoluzione: superscalarità (II)
15
Superscalarità e unità replicate (I)
Inoltre in congiunzione all’uso di più pipeline si possono
replicare le unità funzionali
– rappresentano lo stadio più lento della pipeline (in genere
richiedono diversi cicli di clock)
– unità funzionali specializzate o pipeline specializzate
– è più semplice evitare i conflitti tra le diverse istruzioni
– esecuzione fuori ordine
Evoluzione: hyperthreading
- Per ottimizzare lo sfruttamento delle unità funzionali di un
processore superscalare posso eseguire più flussi di
esecuzione in contemporanea
– le istruzioni di un flusso di esecuzione sono per forza di cose
condizionate l’una dall’altra in quanto successione logica, quindi è
difficile utilizzare tutte le unità o che non si verifichino mai blocchi a
causa di interdipendenze
– idea: duplicare l’unità di controllo del processore per poter gestire
un secondo flusso di esecuzione dello stesso programma (non ci
può essere cambio di contesto) che vada a occupare gli stadi liberi
o alimenti la pipeline durante i blocchi (piccolo miglioramento di
prestazioni)
– necessario il supporto software ai flussi multipli di esecuzione
(thread)
– più propriamente detto simultaneous multithreading
(hyperthreading è un nome commerciale)
16
Evoluzione: multicore
•Il miglioramento tecnologico permette di aumentare la
densità dei transistor
– idea: anziché complicare un processore o aumentare la frequenza
per ottenere maggiori prestazioni, posso integrarne insieme più
d’uno
– in un componente fisico detto package vengono integrati più
componenti logici detti core (che quindi sono progettati in modo
integrato) che possono eseguire più flussi di elaborazione
assolutamente indipendenti
– a una certa frequenza si può ottenere lo stesso livello di prestazioni
di un processore a core singolo con frequenza molto più elevata
(quindi che costa, assorbe e scalda di più)
– non si complica eccessivamente la scheda madre
Architetture multiprocessore (I)
- Sin dagli inizi l’industria dei computer è stata guidata dalla
continua ricerca di una sempre maggiore potenza di calcolo.
- In passato la soluzione consisteva sempre nell’aumentare la
velocità del clock:
- Limiti strutturali:
–Velocità della luce.
–Dispersione del calore.
- Possibile soluzione:
–Impiego di computer massicciamente paralleli.
–Tali macchine si compongono di molte CPU.
–Collettivamente hanno una potenza ben maggiore di quella di una
singola CPU.
17
Architetture multiprocessore (II)
- I multiprocessori a memoria condivisa sono sistemi di
computer in cui due o più CPU condividono il pieno accesso
ad una RAM comune.
-Sono denominati Shared-memory MultiProcessor (SMP)
CPU
CPU
Memoria Condivisa
Architetture multiprocessore (III)
-Ogni CPU ha eguale possibilità di accedere alla memoria
fisica:
- di solito in 10-50 ns
- Ogni CPU può leggere e scrivere parole singole:
- tramite LOAD e STORE
Diverse CPU condividono una memoria comune:
-le CPU debbono coordinarsi per accedere alla memoria;
-esistono diversi schemi di collegamento tra CPU e memoria
- quello più semplice prevede che ci sia un bus condiviso;
- se i processori sono veloci il bus diventa un collo di bottiglia;
- esistono soluzioni che permettono di migliorarne le prestazioni, ma si
adattano a sistemi con un numero limitato di CPU (<20).
- La memoria condivisa rende più semplice il modello di
programmazione:
- si deve parallelizzare l’algoritmo, ma si può trascurare la
“parallelizzazione” dei dati.
18
Architetture multicomputer
- Sistemi composti da tanti calcolatori collegati fra loro
–ogni calcolatore è dotato di una memoria privata e non c’è
memoria in comune;
–comunicazione tra CPU basata su scambio di messaggi;
–uso di reti di calcolatori (spesso con tecnologie specializzate).
- Non è efficiente collegare ogni calcolatore a tutti gli altri,
quindi vengono usate topologie particolari:
–griglie a 2/3 dimensioni, alberi e anelli;
–i messaggi, per andare da fonte a destinazione, spesso devono
passare da uno o più calcolatori intermedi o switch.
–Tempi di trasferimento dei messaggi dell’ordine di alcuni
microsecondi sono comunque facilmente ottenibili.
- Sono stati costruiti multicalcolatori con ~10.000 CPU.
19