Lezioni 2009

Embed Size (px)

Citation preview

Struttura Generale del Corso: v0.5 Beta1) Architettura dei Calcolatori:

GeneralitProcessori e pipeline (ILP)MultiprocessoriArchitettura della memoriaSistemi di archiviazione

2) Basi di ingegneria del software:Il processo di creazione del softwareModelizzazione a oggetti cenni di UML

3) Ambienti di sviluppoI compilatori gcc e icc in LinuxL'ambiente Visual Studio (cenni di .net)

4) Introduzione alla programmazione a oggetti con il C++

Architettura dei calcolatori;

Tipi di calcolatoriDefinizione di ArchitetturaTendenze tecnologichePrincipi di progettazione dei calcolatoriParallelismo,principio di localita'Legge di AmdahlPerformance di un processore

Errori comuni e miti.

Grazie all'ascesa dei microprocessori

Dei vecchi tipi di calcolatori (minicomputer / vax) sono sopravvissuti solo I mainframe (IBM Z9).(Qual'e' il linguaggio piu' usato per I mainframe ?)

Caratteristichepeso 2003 Kgpotenza 18. KW

memoria max 512 GB

numero di processori dedicati54 Generali54 IFL ( dedicati a Linux)16 ICF Interconnessione interna27 zAAP Dedicati all'applicazione27 zIIP Processori di informazione.

Unita' Crittografica dedicata max 512 GB

Progettato per un Up Time del 99.999%

I piu' moderni supercomputer sono realizzati con reti di microprocessori

Ad esempio il CRAY attuali sono realizzati usando reti di processori AMD. (Fino a 120000 cores).

A lato una foto del computer che stato piu' potente al mondol'IBM blue Gene/L che raggiungge I 360 TeraFlop conuna memoria di 32 tebibytes ovvero 32 2^40 Bytes.

Il numero di nodi e' 65532 dual core, la capacita' di scrittura su disco e' di 1024 Gbit/s su fs parallelo

Recentemente anche Microsoft e' entrata tra I fornitori di soluzioni in ambito HPC con Windows Server 2008 HPC.( http://www.microsoft.com/HPC/ ) --->{ Se volete crearvi un cluster virtuale possibile }Non possiamo comunque abbandonare questo argomento senza citare il progetto APE dell'INFN.

Sia I mainframe che I supercomputer realizzati con retidi micropocessori (per una classifica si veda www.top500.org) offrono una grande affidabilita'.

E in questi anni si sta anche affermando l'uso di macchine virtuali.

La stessa che devono anche offrire molti SERVERS.

Avete idea di quanto costa un'ora di Downtime per alcuni servizi ?

Nel progettare queste macchine l'affidabilita' 24/7 e' importante !

Il mercato Desktop e' il piu' vasto e lucroso.E' un ambiente ove conta molto il rapporto prezzo prestazioni specie per quanto riguarda la capacita' di calcolo e la grafica.

Spesso I processori piu' nuovi (o a cui sia stato ridotto il prezzo) appaiono in questo mercato.

Pensate alle esigenze di elaborazione sia grafica che di calcolo dei videogiochi ma anche di programmi professionali che usano intensivamente la CPU (CAD, risulutori FEM)

La fascia di mercato e' molto vasta da poche centinaia di euro fino a qualche migliaio di euro per una singola mancchina.

Ma vi e' una classe di calcolatori quasi invisibili per l'utente comune:I cosidetti embedded computers o calcolatori dedicati.

Li troviamo in modo ubiquitario intorno a noi inclusi in ogni tipo di elettrodomestico ed anche all'interno delle automobili.

Per molti di questi e' necessario operare in modalita' REAL TIME.

Si dice che un programma opera in modo Real Time quando il tempo che ha a disposizione per terminare un determinato compito e' limitato.

Si pensi per esempio al decodificatore satellitare di SKY.Il tempo che ha a disposizione per decodificare ciascun fotogramma e' limitato.Ma questo tipo di applicazione trova ampio uso in Fisica quando si disegnano I sistemi di acquisizione dati.

I Sistemi di Trigger hanno un tempo limitato per decidere se acquisire l'evento oppure rigettarli.

Poter operare in modalita' REAL TIME dipende anche dal sistema operativo.

Per questo tipo di sistemi si passa da microcontrollori con memoria flash interna fino a processori di alta fascia.

Che cosa definisce una architettura di calcolatore ?

Vi sono 3 aspetti fondamentali:

Il Set di Istruzioni usato dal microprocessore. (ISA Instruction Set Architecture)

L'organizzazione generale del progetto comprendendo tutti gli aspetti quali organizzazione della memoria, connessione della momoria, organizzazione interna del processore. Vi possono essere processori diversi che pur implementando lo stesso set di istruzioni hanno organizzazioni interne diverse.

Hardware, ovvero la componentistica usata per l'effettiva realizzazione della macchina.Due processori anche molto simili fra loro con la stessa organizzazione e lo stesso ISA possono essere adatti a compiti diversi (applicazioni mobili, space qualified)

Che cosa caretterizza un set di istruzioni di un processore ?

La sua Classe ( quasi tutti ora sono delle General Porpouse Register ISA )

Indirizzamento della memoria quasi tutti I processori moderni indirizzano la memoria come BYTE. Alcuni di questi richiedono che per indirizzare un oggetto entro la memoria questo debba essere allineato ovvero che se s e' la dimensione di un oggetto e A il suo indirizzo A mod s = 0.L'80x86 non richede l'allignamento ma gli accessi allineati sono piu' veloci.

Modi di indirizzamento possono essere Assoluto, Relativo, a Registro ed altri

Tipo e grandezza degli operandi. L'80x86 supporta interi di 8,16,32,64 bit e floting point (IEEE754) di 32 e 64 bit oltre alla precisione estesa di 80bit

Operazioni. Processori come il MIPS hanno un set ridotto di istruzioni facile da mettere in pipeline e' un vero RISC, l'80x86 ne ha molte di piu'.

Controllo di Flusso. Tipi di salto condizionato e incondizionato, modi di ritorno

Codifica Puo' essere a lunghezza fissa (MIPS) o variabile (80x86 da 1 a 18 Byte)

Tendenze tecnologiche:

La tecnologia ha fatto progressi enormi (ma questo non vuol dire che tutto cambi).

Densita' dei transistors aumenta di circa il 35% all'anno che combinata con una crescita in del die di un10-20% comporta ad un aumento del 40-55% per anno del numero transistor nel chip.

La capacita' della memoria DRAM aumenta del 40% ogni anno.

La capacita' dei dischi e' aumentata del 30% per anno fino al 1990. Dal 1990 al 96 si e' avuto un aumento del 60% per anno che e'ulteriormente cresciuto al 100% per anno fino al 2004 per poi riscendere sl 30%.

Tutti questi cambiamenti obbligano I progettisti a disegnare per il futuro.

Le parole Bandwith o throughput definiscono il numero di operazioni eseguite in un certo tempo, mentre le parole latency o response time definiscono il tempo trscorso tra l'inizio e la fine di un singolo compito

La figura nella pagina seguente descrive I progressi effettuati sia in termini di larghezza di banda che di latenza.

Se consideriamo un grande sistema vi sono due punti di vista:

Il singolo utente e' interessato a diminuire la latency, mentre l'amministratore e' interessato ad aumentare la Bandiwith.

Per confrontare due sistemi X e Y riguado allo stesso task vale la formula:

Ove per Time normalmente si intende wall clock time.

Guardiamo ora la figura e cerchiamo di capire se ci puo' dire qualcosa riguardo a come dobbiamo disegnare I nostri programmi.

La bandwith migliora meglio che la latency...... questo ha a che fare qualcosa su come scriviamo I programmi ?

Tendenze Tecnologiche:

Feature Size : Dimensioni della pi piccola struttura (Transistor o filo ) su di un circuito integrato.

Nel 1971 = 10 Micron

Nel 2006 = 65 Nanometri (0.065 Micron) In produzione.

Nel 2007 si sperimentano a 45 nm

La feature size e' data dall'equazione di Rayleight:

Ove e' la lunghezza d'onda con cui si illumina il wafer, K e' un fattore complesso ce contiene tutti I termini aggiuntivi dovuti per esempio alla qualita' del photoresist e all'uso di tecniche per il miglioramento della risoluzione (illuminazione fuori asse, griglie di spostamento di fase ed altre) e NA e' chiamata Numeriacl Aperture

Andamento della NA e del fattore K. Dal punto di vista pratico si considera K > 0.25 e NA < 0.93. Quindi usando questi valori con una = 193 nm si ottiene una risoluzione limite di 52 nm. Ma si puo' andare oltre.Come si vede il limite fisico per la NA in aria e' 1. Ma le cose cambiano se usiamo un mezzo piu' denso. In microscopia si usano lenti immerse in olio. Nel nostro caso si usa acqua ultrapura.

INTEL HA GIA' MESSO IN PRODUZIONE CHIP DA 45nm

La tecnologia ha superato la legge di Moore:

The complexity for minimum component cost has increased at a rate of roughly a factor of two per year

Il numero di compunenti cresce quadraticamente rispetto alla feature size.

La velocit cresce in modo pi complesso a causa del ritardo del segnale nei fili all'interno del chip.

Il Pentium 4 (2001) riserva due stadi della propria pipeline solo al ritardo dei segnali.

Consumo elettrico:

Un circuito CMOS ( Complementary MosFet ) consuma energia solo quando cambia stato. Questo chiato consumo dinamico.

I primi processori dissipavano decimi di Watt. Un moderno Pentium 4 (3.5 GHz) ne dissipa circa 135. Per abbassare la potenza assorbita si pu abbassare la frequenza la tensione. In 20 anni si passati da 5V a circa 1V.Per un compito prefissato ridurre la frequenza riduce la potenza ma NON l'energia assorbita.Vi una parte di potenza perduta tramite correnti parassite (25% circa nel 2006).

L'affidabilita' di un calcolatore o di un sistema dipende da quella delle sue parti.Se in auto mi salta la cinghia devo farla riparare anche se tutte le altri meccaniche ed elettriche sono perfettamente funzionanti.Nei satelliti le parti critiche vengono ridondate e cosi' accade anche in alcuni computer con le ventole I dischi gli alimentatori ed anche I banchi di memoria per non parlare di interi sistemi ridondati (si veda ad esempio

L'unita' di misura usata e' il MTTF (Mean Time to Failure) spesso confuso col il MTBF (Mean Time Between Failures ) che e' invece dato dalla somma del MTTF col MTTR (Mean Time to Repair). L'inverso dell'MTTF e' chiamato failure rate o FIT di solito espresso per miliardo 109 di ore di funzionamento.

Per ogni parte del sistema quindi si puo' definire:

Esercizio: Valutate il MTTF per un sistema che ha: 10dischi con MTTF di 1000000 ore1 controller SCSI 500000 ore1alimentatore 200000 ore1 ventola 200000 ore1cavo SCSI1000000 ore

Benchmarks.

La scelta migliore e' usare applicazioni REALI. Ovvero I programmi che realmente vorreste usare sul vostro sistema.

L'uso di programmi semplificati quali Kernels, toy programs, synthetic benchmarks provocano spesso errori nella reale valutazione delle prestazioni del sistema.

Ricompilando un codice di una applicazione reale per per poter avere dei risultati significativamente confrontabili spesso bisogna usare un determinato compilatore con un ben determinato insieme di opzioni (vedremo che significa).

Attualmente e' molto diffuso usare I benchmark della SPEC :(Standard Performance Evaluation Corporation) http://www.spec.org

Attualmente la suite di applicazioni usate per provare le macchine e' arrivata alla sua quinta generazione SPEC2006 e contiene 12 programmi che operano su interi (CINT2006) e 17 programmi che operano in virgola mobile (CFP2006).Questi test vengono applicati a sistemi con singola CPU o (in piu' copie) su sistemi con CPU multiple. Altri benchmars sono dedicati alle transazioni ( www.tpc.org )

Come in un qualunque esperimento quando si riportano I risultati di un benchmark e' assolutamente necessario riportare le condizioni sperimentali nel del dettaglio.

Alcuni principi di progettazione dei calcolatori:

Parallelismo:

Puo' essere a tutti I livelli dal sistema al chip. Tipicamente nelle applicazioni WEB si aggiungono nuovi computer ad una farm per aumentare le prestazioni.Un sistema che puo' essere esteso come numero di processori o capacita' di dischi o altro e' chiamato scalabile.Quando parleremo di Pipeline parleremo proprio di parallelismo a livello di architettutra del processore (singolo core).

Principio di Localita':

Localita' temporale: 90% del tempo di elaborazione viene speso in 10% del codice.

Localita' spaziale: gli accessi alla memoria tendono a riguardare locazioni vicine fra loro.

Focalizzarsi sul caso piu' comune.

La legge di Amdhal

E' importantissima e ci da' subito l'idea di quanto un codice potra' essere accelerato dopo una ottimizzazione. E' valida anche per interi sistemi e viene applicata anche quando si parallelizzano I codici per portarli su di un super computer.

Il miglioramento delle performance di un programma (sistema) dipende:

1) Dalla frazione del programma (sistema) che puo' essere migliorata.

2) Da quanto e' il guadagno in performance di quella frazione.

Chiamando

Si ha:

Chiudiamo con alcune affermazioni FALSE:

Il costo del processore e' il piu' importante.

I Benchmark rimangono validi per sempre.

Un disco con un MTTF di 1200000 ore non si guasta mai.

Le prestazioni di picco sono un puon indice delle prestazioni reali.

Cominciamo ora a parlare della struttura interna di un processore moderno.Quello che diremo solamente una parte minima della materia ma importante che conosciate almeno le basi perch queste vi aiuteranno a scrivere I vostri programmi in modo pi efficente sfruttando al meglio l'architettura del calcolatore che state usando.

Per prima cosa dobbiamo accennare a che cosa sia un'ALU.

La sigla sta per Arithmetic Logic Unit ed una delle parti fondamentali del processore.

La sua funzione quella di svolgere TUTTE le funzioni aritmetico logliche fra due operandi.

Un processore moderno pu avere al suo interno pi di un'ALU, ma non esiste (che io sappia) un processore che non ne abbia almeno una.

Le ALU sono disponibili anche come componenti discreti.

A sinistra che riassume tutte le operazioni di un'ALU in basso il diagramma a blocchi del componenete discreto.Da notare anche la presenza di registri interni.In tutti I processori (a me noti) ve ne sono.

OpCode

Registri

Provate a cercare in internet in DataSheet di questo componente per avere maggiori dettagli.

Il concetto di Pipeline per un processore simile a quello di una catena di montaggio.

Cos come il montaggio di una automobile pu essere diviso in tante operazioni che vengono svolte in parallelo, anche l' esecuzione di una istruzione di processore viene suddivisa in operazioni eseguite contemporaneamente.

Quello che vedremo valido per un processore RISC:

Tutte le operazioni sono fatte su dati contenuti in registri

Gli unici accessi alla memoria sono di tipo LOAD e STORE

Il formato delle istruzioni semplice e tipicamente di lunghezza fissa.

Fetch dell'istruzione: (IF)
L''istruzione viene letta alla locazione di memoria specificata dal PC (Program Counter) che un registro interno al processore.

Decodifica e lettura dei registri: (ID)
L'istruzione viene decodificata e gli operandi vengono letti dai registri
Nel caso di una istruzione di salto (BRANCH) viene calcolato l'indirizzo ove fare il salto e in alcune architetture viene eseguito.
La decodifica dell'istruzione e lettura in parallelo sono possibili per il semplice formato delle istruzioni.

Esecuzione o calcolo dell'indirizzo effettivo: (EX)
La ALU opera sui dati preparati nel ciclo precedente :
Riferimento alla memoria: Somma base+offset per ottenere l'indirizzo effettivo
Operazione fra registri: L'ALU esegue l'operazione indicata dall'OpCode
Operazione registro-Dato: L'ALU esegue l'operazione indicata dall'OpCode

Accesso alla memoria: (MEM)
Se l'istruzione un LOAD la memoria viene letta, se uno STORE scritta alla locazione calcolata precedentemente.

Accesso ai registri: (WB)
Nel caso di istruzioni di LOAD o istruzioni da fra registri dell'ALU il risultato dell'operazione viene scritto nel registro.

In questo tipo di implementzione le istruzioni di BRANCH vengono eseguite in due cicli, quelle di STORE in 4 e tutte le altre in 5.Supponendo che vi sia un 12% di BRANCH e un 10% di STORE calcolate quanti cicli in media richiede un'istruzione.

Ciascuna istruzione viene eseguita pi lentamentamente ma si un'accelerazione complessiva

Problemi nell'uso della Pipeline. Sono chimati Hazards e sono di tre tipi:

1) Di tipo strutturale: Quando l'hardware non pu gestire tutte le possibili combinazioni di istruzioni sovrapposte.

2) Dovuti ai dati:a) Sono dovuti alla dipendenza di un'istruzione ( i ) dal risultato di una seguente ( j ).- Tipo RAW (Read after Write) j tenta di leggere un dato prima i l'abbia scritto.- Tipo WAW (Write after Write) j scrive un risultato prima di i . - Tipo WAR (Write after Read) j scrive un risultato prima che i lo legga.

Nel tipo di pipeline statica che stiamo presentando (scrittura in un solo stadio e nessun riordino delle istruzioni) si ha solo il tipo RAW. b) (name dependency) all'uso di uno stesso registro di memoria senza per un reale passaggio di dati fra due istruzioni

3) Dovuti al controllo di flusso:Sono dovuti alle istruzioni di BRANCH condizionato.

Questo tipo di problemi obbliga a fermare la pipeline finch il problema non si risolto limitandone cos le prestazioni.

Data Hazards:

Considerate il seguente programma:

Dadd R1,R2,R3 // Somma R2+R3 ----> R1Dsub R4,R1,R5 // Differenza R1-R5 ----> R4And R6,R1,R7 // ANDR1&R7 ----> R7.. etc......

Tutte le istruzioni dopo la prima usano il suo risultato ! Ma mantre Dsub legge R1 nel suo stadio ID, Dadd lo scriver solo durante il WB.

Se non viene gestito correttamente il problema porta ad un risultato non deterministico del valore letto da Dsub. (Potrebbe esserci stato un interrupt tra Dadd e Dsub)

Questo tipo di problemi viene risolto nei processori moderni con una tecnica chiamata forwarding.

Tralasciando I dettagli si tratta di scrivere il risultato di Dadd non solo in R1 (durante il WB) ma subito dove l'istruzione Dsub ne ha bisogno ovvero in entrata all'ALU.

Ma non sempre questo trucco funziona.

L'accesso alle memoria MEM produce il suo risultato tramite il forwarding solo alla fine del ciclo di CLOCK mentre EX lo richiede all'inizio. Quindi necessario fermare per un ciclo la pipe line

Vi sono tecniche avanzate di ottimizzazione chiamte Dinamic scheduling o Out of Order execution ove le istruzioni sono eseguite in un ordine diverso da quello originale. Questo introduce nuovi possibili problemi di tipo WAR (WRITE after READ) e WAW (Write after Write).

Control Hazards:

Sono quei problemi dovuti a salti condizionati all'interno del programma. Vi sono diverse strategie. Una di queste scegliere un'istruzione da eseguire subito dopo quella di BRANCH in modo da prendere la decisione in seguito se fare o non fare il salto. Questa politica chiamata Branch delay slot. Sta al compilatore scegliere che istruzione mettere.

Questo chiamato anche static branch prediction.

Esitono e dobbiamo almeno citarle senza vederle in dettaglio tecniche di dinamic branch prediction ove, per esempio, le decisioni prese per ciascun branch viengono registrate (branch prediction buffer) e la predizione viene espressa in base alla storia passata. (profiling)

Per ottenere il massimo di prestazioni la pipeline deve essere costantemente tenuta piena.Per far questo bisogna sfruttare al massimo il parallelismo fra le istruzioni trovando nel programma sequenze di istruzioni non correlate fra loro che possono essere quindi sofrapposte all'interno della pipeline.

Per evitare lo stallo due istruzioni dipendenti i e j devono essere separate fra loro almeno per un numero di clicli di clock tale da permettere a i di produrre un risultato utile.

Consideriamo il seguente loop:For (i=1000; i>0; i=i-1) x[i]=x[i]+s ;

Una traduzione letterale del codice in linguaggio macchina assolutamente poco efficente. Non solo contiene un branch ma le dipendenze interne fra le istruzioni provocano una serie di stalli forzati della pipeline.

In fase di compilazione si pu usare una tecnica chiamata LOOP UNROLLING, ovvero lo scrivere esplicitamente quali righe del programma le linne del ciclo fin quando il numero di registri disponibili lo permette.x[1]=x[1]+s ;x[2]=x[2]+s ;x[3]=x[3]+s ;...

In questo modo si evitano I branch e le continue sottrazzioni all'indice I e il codice diviene.

Anche questo ha degli stalli ma I diversi LOAD e somme sono indipendenti e quindi..........

Posso riordinare il codice senza interferire sul suo risultato ottenendo:

Questo ciclo non ha nessun stallo. L'aver esplicitato I cicli del LOOP permette di aver pi istruzioni e quindi di poterle riordinare in modo pi efficente.

Una ottimizzazione del genere pu sembrare banale ma non lo . Richiede due tecniche di intelligenza artificiale: sostituzione simbolica e semplificazione.In questo le espressioni possono essere riscritte in modo da ridurre tutte le costanti ovvero: ((A+1)+1) viene riscritta come (A+(1+1)) e semplificata in (A+2) gi a livello di compilazione.

Ma non tutto sempre cos semplice.

Consideriamo il ciclo:

For (i=1; i