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