Multicomputers a scambio di messaggi • Massively Parallel Processors (MPP) • Clusters of Workstations (COW) 1 Multicomputers • I sistemi multiprocessore hanno una scalabilità limitata dalla difficoltà di connettere fra loro molti core (o molte CPU multi-core) fornendo loro la visibilità dell’intero spazio di memoria. • Inoltre, nei sistemi multiprocessore la presenza di memoria condivisa in cui centinaia di CPU stanno cercando di accedere alle stesse variabili crea un collo di bottiglia che limita fortemente la scalabilità di questo tipo di architetture. • Quando c’è bisogno di una potenza computazionale maggiore di quella che possono fornire i sistemi a memoria condivisa, è necessario ricorrere ad architetture in cui i vari nodi comunicano solo attraverso lo scambio di messaggi, e non esiste uno spazio di indirizzamento comune. A causa di questa caratteristica, queste architetture sono a volte chiamate NO Remote Memory Access 2 (NORMA) Multicomputers • Nei sistemi multicomputer i programmi che girano su CPU diverse interagiscono scambiandosi informazioni attraverso primitive come SEND e RECEIVE anziché con istruzioni come LOAD e STORE. • Ogni nodo del sistema è composto di una o poche CPU (eventualmente multi-core), della RAM condivisa solo dai core locali, eventualmente un disco (e/o altri dispositivi di I/O), e un processore per la comunicazione attraverso una rete di interconnessione (Tanenbaum, Fig. 8.34). 3 1 Massively Parallel Processors (MPP) • Le architetture MPP sono sistemi con un costo dell’ordine dei milioni o decine di milioni di dollari, usati per applicazioni scientifiche, finanziarie e militari. • Gli MPP sono tipicamente costituiti da centinaia o migliaia di CPU standard o prodotte appositamente, connesse da una rete privata ad alte prestazioni. • Gli MPP hanno di solito anche una alta capacità di I/O, dovuta al tipo di problemi trattati che richiedono la capacità di processare grosse quantità di dati (dell’ordine dei terabytes) e di spostarli velocemente da una macchina all’altra. 4 Massively Parallel Processors • Spesso usano software di gestione del sistema appositamente sviluppato per la sincronizzazione e la comunicazione fra i processi: librerie dedicate e/o sistema operativo. • Infine, gli MPP devono avere una alta tolleranza ai guasti, che non possono che essere frequenti, dato l’elevatissimo numero di CPU, banchi di memoria, e dischi coinvolti. • Devono così essere previsti specifici meccanismi hardware e software per monitorare il sistema, gestire i guasti, ed evitare che il lavoro fatto fino a quel punto vada perso. • Questi sistemi sono prodotti in quantità ovviamente limitate, così che non esistono dei principi generali di progettazione: ogni sistema ha le sue proprie peculiarità. 5 BlueGene • Il progetto BlueGene dell’IBM nasce nel 1999 con l’obiettivo di produrre un supercomputer adatto a risolvere problemi che richiedono un elevato sforzo computazionale: nell’analisi della struttura delle proteine umane, nei modelli climatici, in campo astronomico, finanziario e militare. • L’idea era quella di costruire non solo il sistema più veloce in termini di potenza di calcolo (teraflops), ma anche il più efficiente in termini di teraflops/$, teraflops/watt, teraflops/m3. • Da qui l’idea di non usare i processori più veloci (e costosi) disponibili, ma di produrre un chip custom che occupasse poco spazio, girasse a velocità relativamente bassa e consumasse molto poco. 6 2 BlueGene • Il cuore di BlueGene e un chip (prodotto a partire dalla metà del 2003) formato da due PowerPC 440 con un clock a “soli” 700 MHz (Tanenbaum, Fig. 8.36) 7 BlueGene • Il PowerPC 440 è un processore superscalare, usato principalmente in sistemi embedded, in grado di avviare fino a 4 istruzioni anche floating point) per ciclo di clock. La versione usata in BlueGene è stata arricchita con istruzioni FP di tipo vettoriale. • I due core su ogni chip sono identici, ma uno è usato per le computazioni vere e proprie, e l’altro per le comunicazioni tra i vari nodi del sistema. • Ogni coppia di core ha a disposizione 512MB di RAM privata (condivisa dai due core), estendibili fino a 2 GB. Per mantenere la coerenza delle cache tra i due core, viene usata una logica di snooping. 8 BlueGene • Una scheda custom ospita due chip e la RAM per ciascun chip. • 16 schede custom sono montate su una motherboard, per un totale di 32 chip (ossia 32 core per la computazione) e almeno 16GB. • 32 motherboard sono ospitate in un cabinet, per un totale di 1024 core per la computazione • Infine, un sistema completo è formato da 64 cabinet, per un totale di 65,536 core per la computazione e almeno 32TB di RAM (Tanenbaum, Fig. 8.37) 9 3 BlueGene • Notate che ogni core ha accesso diretto solo alla propria RAM, e che non esistono dischi “locali”: Il sistema ha invece 1024 nodi di I/O, connessi ai dischi e ad altre periferiche. • La rete di interconnessione tra i nodi è un toroide a tre dimensioni: Un toroide a due dimensioni è una griglia con i nodi ai lati connessi fra loro. • In un toroide 3D, ogni nodo è all’intersezione di 3 assi anziché 2, ed ha due vicini ai due lati di ogni asse. • Ogni chip comunica quindi con sei vicini, con una connessione punto a punto ad una velocità di 1,4 Gbit/sec, con una ampiezza di banda totale (la quantità di informazione che può essere spostata nell’intero sistema nell’unità di tempo) di 275 terabit/sec. 10 • La comunicazione tra i nodi è sostanzialmente a commutazione di pacchetto, con la differenza che i pacchetti vengono forwardati dai nodi intermedi senza attendere di aver ricevuto l’intero pacchetto. • In più, il sistema è connesso anche attraverso altre reti (tra cui una Gigabit Ethernet), per gestire la manutenzione e la comunicazione con i dispositivi di memorizzazione di massa (dischi e sistemi a nastro magnetico) • Su ogni chip gira un SO molto semplice, appositamente sviluppato, che supporta un solo utente ed un solo processo suddiviso in due thread: uno per ciascun core del chip. Questa semplice soluzione garantisce alte prestazioni e bassi errori software. • Attraverso software opportuno, il sistema è in grado di eseguire dei checkpoint, ai quali l’intero stato della computazione viene salvato su disco. In caso di crash del sistema, la computazione può 11 riprendere dall’ultimo check point BlueGene BlueGene • La descrizione dei lucidi precedenti si riferisce al progetto BlueGene iniziale, noto come BlueGene/L. Più di recente sono stati sviluppati sistemi BleGene con prestazioni ancora più elevate. • La serie dei BlueGene/P, progettati per raggiungere un potere computazionale di un PetaFLOPS (1015 operazioni floating point al secondo). Formati da chip contenenti ciascuno 4 PowerPC 450, per un totale di 294.912 core (scalabili fino a 884.736 core) • La serie dei BlueGene/Q, progettata per raggiungere i 20 PetaFLOPS, userà chip a 18 core PowerPC A2. • Il BlueGene/Q noto come Sequoia installato al Lawrence Livermore National Laboratory nel 2012 ha circa 1,6 milioni di core, e 1,6 PetaByte di RAM 12 4 Red Storm • Red Storm è un altro sistema MPP molto noto, sviluppato dalla Cray per una impresa privata che lavora per il governo USA. • I processori usati in Red Storm sono degli Opteron (inizialmente single core, e più di recente dual e quad core) • Gli Opteron sono assemblati a gruppi di 4 su una scheda, insieme ad un processore dedicato per la rete (un router prodotto dalla IBM chimato Seastar). Ogni core ha a disposizione almeno 1 GB di RAM privata. • Sulla scheda sono presenti anche un chip Ethernet da 100Mb/sec e un processore su cui gira Linux per la manutezione software degli altri componenti della scheda. • Le schede sono impaccate a gruppi di 8 in una card cage, e 3 card cage sono inserite in un cabinet, per un totale di 96 Opteron. 13 Red Storm • L’intero sistema è composto di 108 cabinets: 10880 processori (a uno o più core) con 10TB di RAM (Tanenbaum, Fig. 8.38). 14 Red Storm • Le CPU sono interconnesse fra loro da una rete toroidale 3D mediante i Seastar. Ogni Seastar ha 7 canali bidirezionali a 24 Gbit/ sec di comunicazione con gli altri 6 nodi adiacenti e con l’Opteron: il tempo di transito di una comunicazione tra 2 nodi adiacenti è di 2 microsecondi, e sale a 5 microsecondi tra due nodi qualsiasi. • Una rete Ethernet a 100 Mbit/sec che collega le varie schede viene usata come rete di backup e per la manutenzione. • Il sistema usa Opteron di servizio per l’amministrazione e l’I/O, in particolare verso i dischi, organizzati come sistemi RAID in grado di memorizzare fino a 240 TB con una ampiezza di banda aggregata di 50 MB/sec • Su Ogni CPU per la computazione gira un semplice SO custom, il catamount, mentre Linux è usato per le 512 CPU di servizio. 15 5 BlueGene e Red Storm Le configurazioni di base BlueGene (2004) e Red Storm (2005) a confronto (Tanenbaum, Fig. 8.40) 16 Massively Parallel Processors • Trovate informazioni dettagliate sui supercomputer più potenti del mondo su www.top500.org (www.top500.org ! list) • A giugno 2011 il Blue Gene più potente installato era solo al dodicesimo posto della classifica (con circa un PetaFLOPS di potere computazionale e 300.000 core). • I primi due MPP della classifica erano rispettivamente in Giappone e in Cina, e il “campione” del mondo era formato da circa 550.000 core e ha una potenza computazionale di circa 8 PetaFLOPS. • A giugno 2012, il super computer più potente è di nuovo un Blue Gene/Q, il Sequoia, con circa 1,6 milioni di core, e una potenza computazionale di picco di circa 20 PetaFLOPS. 17 Massively Parallel Processors • A giugno 2014 il computer più potente è il cinese Tianhe-2 Milky way-2, con 33 PetaFLOPS e più di tre milioni di core Xeon. • In tre anni (dal 2011 al 2014) si è quindi più che quadruplicata la potenza di calcolo massima raggiunta da un supercomputer. • Il Sequoia è retrocesso al terzo posto, mentre interessante è il secondo posto, detenuto dal Titan, un supercomputer CRAY che combina processori Opteron e processori grafici NVIDIA. • Un anno, dopo, nel giugno 2015, le prime posizioni sono rimaste invariate. Notevole il 17-esimo posto del supercomputer italiano HPC2, installato dall’ENI e capace di una potenza computazionale di 3 PetaFLOPS. È formato da processori Xeon e NVIDIA (ma un 18 anno prima, nel giugno 2014, era all’11-esimo posto). 6 COW: Clusters (Of Workstations) • Un cluster è tipicamente formato da un insieme di macchine connesse in rete. • Ma allora cosa li distingue dalle architetture MPP? • In realtà la distinzione non è netta. In genere, le unità computazionali di un MPP sono tutte uguali, e sono “impacchettate” in modo molto “denso” in una struttura progettata appositamente. • I processori comunicano fra loro mediante una rete ad alte prestazioni, spesso progettata specificamente per quella architettura. • La singola unità computazionale non potrebbe “funzionare da sola” 19 COW: Clusters (Of Workstations) • Al contrario, un cluster è innanzi tutto costituito da macchine che possono essere anche molto diverse fra loro: PC e workstations con processori diversi • In alcuni casi, ciascuna unità computazionale costituisce un sistema che potrebbe anche funzionare da solo (al massimo mancano il video e la tastiera/mouse) • I vari nodi sono connessi da una rete non progettata esplicitamente per quell’applicazione: una rete Ethernet o anche Internet. • Il numero di nodi connessi è estremamente variabile: si va da qualche PC a qualche decina di migliaia. • Ancor meno che con i MPP, non esiste un criterio di progettazione specifico per i cluster. 20 Google • Il motore di ricerca di Google deve in qualche modo di memorizzare ed indicizzare l’intero WEB, e compiere una ricerca in meno di un secondo, gestendo migliaia di richieste al secondo provenienti da tutto il modo 24 ore su 24. • Il servizio di Google deve sempre essere disponibile, indipendentemente da errori nel software, guasti hardware, e mancanze di energia. • Tutto ciò deve essere ottenuto al minor costo possibile. Come fa Google? 21 7 Google • Innanzi tutto, Google gestisce più centri di elaborazione (data centers) sparsi un pò in tutto il mondo. • In questo modo, un centro può fornire il servizio al posto di un altro che sia inutilizzabile per una qualsiasi ragione. • Inoltre, quando ci si collega a www.google.com l’IP del client viene ispezionato, e la richiesta viene rediretta al data center più vicino al client • Ogni centro ha almeno una connessione a fibra ottica a 2,488 Gbit (OC 48) con Internet, su cui vengono ricevute le query e inviate le risposte. • E’ presente anche una connessione di backup a 622 Mbit (OC 12) verso un provider alternativo, nel caso quello principale sia inaccessibile. 22 Google • La filosofia di Google è di utilizzare processori di basso costo (e quindi basse prestazioni), e di aggiornarli con processori più moderni solo quando questi diventano economicamente convenienti. • Ad esempio, nel marzo 2000 le CPU usate erano principalmente Celeron a 533 MHz, che costavano meno di 200$ l’uno, mentre il prezzo dei Pentium III a 800 MHZ era di circa 800$. • Nel novembre 2000 il prezzo dei Pentium III scese a 200$, e i Celeron vennero sostituiti. • Di fatto, un tipico PC Google è composto da una scheda madre con un processore di fascia bassa, qualche centinaio di mega di RAM e qualche giga di hard disk (Come dice Tanenbaum, “the kind of thing a grandmother might buy for checking her e-mail occasionally”). 23 Google • In accordo con uno dei report più recenti (e comunque vecchio di qualche anno), un PC Google è formato da un AMD Opteron dual core a 2,2 GHz, con 8GB di RAM DDR2 a 533 MHz (anziché a 666 MHz, che sarebbe lo standard, per diminuire i consumi). • Su ogni PC gira Linux Red Hat. 24 8 Google • 80 PC sono montati all’interno di un unico rack e connessi fra loro da una rete Ethernet. • Ciascuna connessione a fibra ottica è instradata a due switch Ethernet a 128 porte: due porte per ciascun rack. • Ogni rack ha quindi 4 connessioni verso l’esterno: devono guastarsi tutte e quattro perché il rack sia sconnesso dalla rete. • In tutto, 64 rack possono essere connessi alla rete in questo modo, per un totale di al massimo 5120 PC per centro di elaborazione. 25 Google • Un tipico cluster Google (Tanenbaum, Fig. 8.42) 26 Google • Sono tre i punti fondamentali su cui si basa la gestione di un sistema complesso ed esteso come Google: 1. I componenti si guastano, con frequenza tanto maggiore quanti più numerosi sono i componenti. C’è quindi bisogno di software tollerante ai guasti. 2. Replicare ogni componente, sia hardware che software. Questo migliora non solo la tolleranza ai guasti, ma anche le prestazioni del sistema. • In Google, i PC, i dischi, i cavi, gli switch Ethernet e le connessioni ad Internet sono replicati più volte. Analogamente, come vedremo più avanti, le informazioni usate da Google per le ricerche sono replicate pesantemente sia all’interno di un centro che nei vari centri. 27 9 Google 3. Ottimizzare il rapporto costo/prestazioni. Questo punto è di fatto una conseguenza dei precedenti due. • Se il sistema è stato correttamente congegnato per gestire i guasti, l’uso di componenti costosi, ad esempio RAID con dischi SCSI è inutile. • Anche il sistema più costoso si guasta, e spendere 10 volte di più per dimezzare il numero di guasti non sembra una buona idea. • Meglio comprare 10 volte più hardware e gestire i guasti quando si presentano: quando tutto funziona correttamente, più hardware significa prestazioni migliori. 28 Google • Proprio basandosi su un principio di ridondanza, Google si affida a più siti in cui le informazioni sono replicate: nel gennaio 2005 erano circa 60 i data centers google sparsi per il mondo, per un totale di circa 100.000 PC (ma questi numeri crescono continuamente, e Google fornisce le informazioni con un ritardo di alcuni anni) • Google, mantiene una copia di ogni pagina Web e periodicamente esplora l’intera rete per mantenere aggiornato il proprio database. (Il refresh rate va da uno a sette giorni, con una media di due) • Le copie delle pagine Web vengono suddivise in pezzi detti shards, replicati più volte e distribuiti sui vari cluster di “document server”. • I cluster di document server vengono tra l’altro usati per restituire i pezzettini di testo rilevante che formano il risultato di una query. 29 Google • Inoltre, le copie delle pagine vengono usate anche per fornire un rapido accesso alle pagine stesse quando Google fornisce il risultato di una interrogazione (ad esempio nel caso in cui le versioni originali non siano velocemente disponibili). • Analogamente, mentre aggiorna il suo database di pagine, Google aggiorna il suo “search index”, in cui ogni parola indicizzata è associata alla lista di documenti (pagine Web, file PDF, PPT, ecc.) presenti in rete che contengono quella parola, ordinati secondo una classifica di rilevanza • L’algoritmo usato per stabilire la rilevanza di una pagina rispetto ad una parola dell’indice è segreto. • Il search index è a sua volta grande alcuni terabyte, ed è suddiviso 30 in shards replicati e distribuiti su più cluster di “index servers”. 10 Google • Per mantenere Google attivo usando macchine che si possono guastare, un punto cruciale è la replicazione e la distribuzione delle informazioni. • Ogni shard è grande 64 megabyte, ed è replicato mediamente tre volte su macchine non adiacenti: non devono essere sulla stessa linea di alimentazione né sullo stesso switch verso la rete. • Alcuni master server vengono usati per sapere dove si trovano i vari shard, così da poter instradare le richieste ai relativi server. 31 Processamento delle query • Processamento di una query in Google (Tanenbaum, Fig. 8.41) 32 Processamento delle query • Una richiesta viene inizialmente inviata ad un data center (1) • Un load balancer instrada la richiesta ad uno dei vari gestori di query (2) e, in parallelo, ad un analizzatore sintattico (3) e ad un server che gestisce la pubblicità con cui Google si finanzia (4). • Il gestore della query interroga uno o più index server in parallelo per sapere in quali pagine si trovano le parole oggetto della ricerca (5, 6). • Con i risultati, consulta i document server per estrarre i pezzettini di testo più significativi che contengono le parole cercate (7, 8). • A questo punto, la risposta viene inviata al client, insieme con la pubblicità ed eventuali segnalazioni di errore (9, 10, 11). 33 11 PROCESSORI VETTORIALI 34 Processori Vettoriali • Nella prima parte del corso abbiamo visto come le prestazioni di un processore (single core) possano essere migliorate: 1. Lanciando più istruzioni per ciclo di clock 2. Usando pipeline con molti stadi • In questo modo, è possibile sfruttare più a fondo il parallelismo presente fra le istruzioni • Ma quanto maggiore è la quantità di ILP che vogliamo sfruttare, tanto maggiore è la quantità di hardware di cui abbiamo bisogno: 1. per analizzare le istruzioni da avviare e capire quali sono indipendenti fra loro 2. per supportare l’esecuzione parallela (più stazioni di prenotazione, ROB più grandi, branch prediction più sofisticati...) 35 Processori Vettoriali • La quantità di hardware necessaria per eseguire in parallelo più istruzioni cresce più che linearmente (più o meno quadraticamente) con il numero di istruzioni eseguite in parallelo. • Questo limita praticamente il numero di istruzioni avviabili per ciclo di clock e il numero di stadi di una pipeline. • I processori vettoriali, commercializzati a partire da metà anni 70 (i più famosi sono certamente i vari modelli prodotti dalla Cray), rappresentano una alternativa allo sfruttamento dell’ILP tipico dei classici processori superscalari – multiple issue moderni. • Queste architetture mettono a disposizione istruzioni che lavorano su vettori di dati, ossia, in sostanza, su array di numeri. • Una tipica operazione vettoriale può ad esempio sommare due vettori da 64 elementi e produrre un vettore risultato di 64 elementi 36 12 Processori Vettoriali • L’istruzione vettoriale è quindi equivalente ad un intero loop in cui ad ogni iterazione verrebbe calcolato uno dei 64 elementi di output, verrebbero aggiornati gli indici e si salterebbe indietro all’inizio del ciclo per operare sull’elemento successivo. • Le istruzioni vettoriali hanno quindi delle importanti caratteristiche: 1. Una singola istruzione vettoriale specifica una gran quantità di lavoro, equivalente ad eseguire un intero loop. • In particolare, una istruzione può rappresentare decine di operazioni più semplici, e intere unità funzionali posso essere tenute completamente occupate prelevando ed eseguendo una sola di tali istruzioni (invece che preoccuparsi di prelevare e lanciare molte istruzioni potenzialmente dipendenti tra loro ad ogni ciclo di clock). 37 Processori Vettoriali 2. L’uso di una istruzione vettoriale indica che la computazione di ogni elemento del vettore risultato è indipendente dalla computazione di altri risultati nel vettore. • Come conseguenza, l’hardware della CPU non deve controllare nessun data hazard all’interno di una istruzione vettoriale, e gli elementi del vettore possono essere elaborati usando un array di U.F. in parallelo, o un’unica U.F. pipelined o una configurazione mista. 3. E’ necessario controllare le alee tra due istruzioni vettoriali solo una volta per ogni vettore operando, e non per ogni elemento dei due vettori. • La logica di controllo è quindi molto più semplice, a parità di potere 38 espressivo delle istruzioni. Processori Vettoriali 4. Le istruzioni vettoriali accedono di solito a locazioni adiacenti di memoria, quelle che ospitano i vari elementi del vettore. • Gli accessi alla memoria (sia questa la RAM o la cache) sono in generale più efficienti, perché è più probabile che valga il principio di località. 5. Un intero loop viene sostituito da un’unica istruzione vettoriale • Come conseguenza, scompaiono tutti gli hazard sul controllo, e la necessità di gestire il branch prediction 39 13 Processori Vettoriali • Per tutte le ragioni viste, le operazioni vettoriali possono essere rese più veloci di una sequenza di operazioni scalari sullo stesso numero di dati, ed ha senso considerare l’uso di unità funzionali vettoriali per quelle applicazioni che ne possano fare un uso vantaggioso. • I processori vettoriali trovano un naturale impiego in vari campi scientifici e industriali in cui sia necessario manipolare grandi quantità di dati che hanno una naturale “forma” vettoriale: ad esempio, le previsioni metereologiche, simulazioni di crash test, applicazioni multimediali. 40 Architettura di base • L’architettura di base di un processore vettoriale, simile a quella del Cray-1 (H-P3, Fig. G.1) 41 Architettura di base • Un processore vettoriale è formato da una parte scalare classica e da una parte vettoriale. • le unità vettoriali sono di solito in grado di operare sia su numeri floating point che interi, e su valori binari. • Come per le architetture RISC, tutte le operazioni vettoriali lavorano sui registri (vettoriali) della macchina, e solo le operazioni vettoriali di load e store interagiscono con la memoria. • I componenti principali di un classico processore vettoriale sono i seguenti (facciamo anche alcune assunzioni numeriche, abbastanza standard): 42 14 Architettura di base • Registri vettoriali. 8 registri vettoriali, ciascuno dei quali contiene 64 elementi da 32 o 64 bit ciascuno • Unità Funzionali vettoriali. Ogni unità è pipelined, è può far partire una nuova operazione ad ogni ciclo di clock. Una unità di controllo verifica gli eventuali conflitti nell’uso delle unità funzionali (hazard strutturali) e nell’accesso ai registri (Hazard sui dati) • Unità vettoriali load-store. Possono operare in modo tale da spostare l’intero contenuto di più celle adiacenti di RAM nei registri vettoriali, e viceversa. • Registri scalari. Che possono essere usati per calcolare indirizzi di RAM o per eseguire operazioni tra vettori e scalari. 43 Alcune istruzioni vettoriali • Ecco alcuni esempi di classiche istruzioni macchina vettoriali • ADDV V1, V2, V3 somma gli elementi dei vettori V2 e V3, metti il risultato nel registro vettoriale V1 (ci saranno istruzioni analoghe per la moltiplicazione e la divisione) • ADDVS V1, V2, F0 somma lo scalare F0 ad ogni elemento del registro vettoriale V2, metti il risultato in V1 • LV V1, R1 Carica il contenuto della RAM a partire dall’indirizzo in R1 dentro V1 • EQ V1, V2 compara ogni elemento di V1 e V2 e metti 44 il risultato in un vettore di bit. Un semplice problema vettoriale • Dobbiamo eseguire il seguente calcolo: • dove a è uno scalare, ed X e Y sono due array (vettori) in RAM • Questo problema è noto come AXPY loop, ed è uno dei test di base usati in alcuni benchmark. • Per semplicità, assumiamo che il numero di elementi di X e Y sia identico al numero di elementi di un registro vettoriale su cui vogliamo operare. Y=aX+Y 45 15 Un semplice problema vettoriale • Ecco una possibile soluzione usando una macchina RISC. X e Y iniziano agli indirizzi scritti in Rx ed Ry: LD F0,a // load scalar a R4, Rx, #512 F2, 0 (Rx) F2, F2, F0 F4, 0 (Ry) // last address to load // load X(i) // a X(i) // load Y(i) ADD SD F4, F4, F2 0 (Ry), F4 // a X(i) + Y(i) // store into Y(i) ADD ADD Rx, Rx, #8 Ry, Ry, #8 // increment index to X // increment index to Y SUB BNEZ R20, R4, Rx R20, jmp // compute bound // check if done ADD jmp: LD MUL LD 46 Un semplice problema vettoriale • Ed ecco invece la soluzione usando una macchina vettoriale: LD LV MULVS LV ADDV SV • F0,a V1, Rx V2, V1, F0 V3, Ry V4, V2, V3 Ry, V4 // load scalar a // load vector X // vector-scalar multiply // load vector Y // add vectors // store result Notate, se i vettori sono di 64 elementi, il programma precedente richiede l’esecuzione di quasi 600 istruzioni, mentre quello vettoriale ne usa solo 6, sia perché lavora in un colpo solo su 64 elementi, e sia perché quasi la metà delle 600 istruzioni del programma precedente sono overhead del loop. 47 Un semplice problema vettoriale • Non solo, nel programma “scalare”, la SD dipende dalla ADD che implementa “a X(i) + Y(i)” e questa ADD dipende dalla MUL precedente. • Gli stall della pipeline possono essere limitati con le tecniche viste per l’ILP dinamico e statico, ma il numero di istruzioni da eseguire rimane comunque alto. 48 16 Processori vettoriali: osservazioni • Perché i processori vettoriali non hanno preso il sopravvento sulle classiche architetture superscalari? • Innanzi tutto, i processori vettoriali hanno una architettura inerentemente più complessa, che limita verso l’alto la velocità del clock: nel 2001 la più veloce architettura vettoriale aveva un clock di 500 MHz. • La complessità dell’architettura è dovuta proprio al modo in cui operano i processori vettoriali. infatti: 1. sono necessari registri molto più grandi e connessi al datapath in maniera più complicata. 2. Ogni unità funzionale vettoriale è molto più sofisticata, se si vuole operare su più elementi contemporaneamente. 49 Processori vettoriali: osservazioni 3. L’intero datapath di una CPU vettoriale deve essere più ampio, se si vogliono spostare più blocchi di operandi da un punto all’altro contemporaneamente. 4. Anche la connessione con la memoria deve essere più sofisticata, per riuscire a sostenere la quantità di dati che la CPU richiede di elaborare con un’unica istruzione vettoriale. • Per tutte queste ragioni, i processori vettoriali hanno costi di produzione sensibilmente superiori ai processori tradizionali. • Inoltre, il loro uso è effettivamente giustificato solo in quelle applicazioni che hanno una naturale formulazione vettoriale 50 Processori vettoriali: osservazioni • Come conseguenza, la domanda del mercato è sempre rimasta limitata e non sono state possibili produzioni su larga scala che ne avrebbero abbattuto i prezzi. • per contro, l’aumento delle prestazioni delle classiche CPU superscalari degli anni 80 e 90 ha permesso ai processori tradizionali di diminuire le differenze rispetto alle prestazioni dei processori vettoriali anche su problemi tipicamente “vettoriali” • per tutte queste ragioni, i processori vettoriali sono ormai diventati prodotti di nicchia. • Tuttavia l’esperienza progettuale dei processori vettoriali è stata almeno parzialmente trasferita nei processori superscalari moderni. • Infatti, molte applicazioni multimediali contengono codice che può essere naturalmente vettorizzato, e molti processori moderni hanno arricchito il loro set di istruzioni macchina con estensioni multimediali che ricalcano lo stile delle istruzioni vettoriali. 51 17 Processori vettoriali: osservazioni • la tecnica più comune consiste nel permettere che uno specifico registro (o un set di registri) possa essere suddiviso in sottoparole più corte che sono processate in parallelo. • Ad esempio, nel Pentium II MMX (1997) vennero aggiunte 57 istruzioni “vettoriali” che operavano sui registri floating poing a 64 bit permettendo di trattarli suddivisi in sottoparole di 16 o 32 bit. • a tutte le sottoparole di un registro poteva essere applicata in parallelo una qualsiasi istruzione vettoriale. • Alcune architetture (ad esempio le CPU Intel e il PowerPC) hanno col tempo aumentato la lunghezza dei registri vettoriali per permettere di elaborare più dati in parallelo. 52 Processori vettoriali: osservazioni • Nel 1999 il Pentium III venne ulteriormente arricchito di 70 istruzioni multimediali chiamate Streaming SIMD Extension (SSE), e all’architettura vennero aggiunti 8 registri vettoriali a 128 bit che potevano essere usati a blocchi di 32 bit per eseguire 4 operazioni floating point a singola precisione in parallelo. • Nel 2001 sono state aggiunte altre 144 istruzioni “SSE2” al Pentium 4, che permettono fra l’altro di trattare i registri vettoriali a blocchi di 64 bit per eseguire 2 operazioni floating point in doppia precisione in parallelo. • Nel 2004 Si è passati alla versione SSE3 introdotta nel Pentium 4 “Prescott”. Tra le altre cose, in questa versione sono disponibili istruzioni per eseguire operazioni diverse sui dati contenuti in due registri vettoriali. Ad esempio: ADDSUBPD input {A0, A1}, { B0, B1}, output: { A0 - B0, A1 + B1 } 53 Processori vettoriali: osservazioni • Nel 2007 si passa alle SSE4, che introducono altre istruzioni multimediali ad hoc, progettate per accelerare l’implementazione di specifiche funzioni multimediali considerate importanti. • La Advanced Vector Extensions (AVX) del 2010 duplica l’ampiezza dei registri a 256 bit, e offre istruzioni corrispondenti, che raddoppiano il numero di istruzioni eseguibili su dati di metà lunghezza (H-P5, Fig. 4.9): 54 18 Processori vettoriali: osservazioni • Infine, osserviamo che le istruzioni vettoriali sono particolarmente adatte per i processori embedded, perché permettono di esprimere elevati livelli di parallelismo in maniera concisa, e sono pesantemente usate nei processori delle console per videogames. 55 Una tassonomia delle architetture dei computer 56 Tassonomia delle architetture • Abbiamo visto diversi tipi di architetture, e ci si può chiedere se esse possano essere classificate in base a determinate caratteristiche. • Effettivamente, esiste una classificazione dei diversi tipi di architetture piuttosto nota, ma anche piuttosto rozza e imprecisa (e anche datata, visto che risale addirittura al 1966): la tassonomia di Flynn (Tanenbaum, Fig. 8.20): 57 19 Tassonomia delle architetture • La classificazione di Flynn è basata su due concetti: il livello di parallelismo nel flusso (stream) di istruzioni in esecuzione e nel flusso di dati processati dalle istruzioni. • Un sistema con n core ha n program counter, e quindi n “flussi di istruzioni” che possono procedere in parallelo. • Analogamente possiamo considerare un flusso di dati come costituito da una sequenza di dati. In un flusso, ogni dato è computato a partire dal dato precedente. Ma possiamo avere più flussi di dati fra loro indipendenti, nel senso che la computazione dei dati di un flusso è indipendente dalla computazione dei dati di un altro flusso. • I flussi di istruzioni e di dati sono (almeno entro certi limiti) ortogonali, e sono possibili 4 combinazioni diverse: 58 Tassonomia delle architetture • SISD: Single Instruction (stream) Single Data (stream) è la classica architettura monoprocessore, in cui le istruzioni vengono eseguite una alla volta su un unico flusso di dati: le variabili del programma in esecuzione. • Da quello che abbiamo visto nella parte sull ILP, questa visione è per lo meno molto superficiale (pensate solo alla presenza della pipeline), e ad oggi vale solo per i più semplici processori usati per applicazioni embedded, come ad esempio l’8051. • I processori della famiglia dell’8051 non sono pipelined, (molte istruzioni si eseguono in un ciclo di clock), lanciano ed eseguono le istruzioni in-order, e non hanno cache. • Sono macchine a 8 bit, un clock di qualche decina di MHz, costano 10, 20 centesimi di euro, e sono di gran lunga i processori più 59 venduti: attualmente circa 8 miliardi di pezzi l’anno. Tassonomia delle architetture • Sono usati nelle radio sveglie, nelle lavatrici, nei forni a microonde, nei telefoni cordless, in alcuni giochi “elettronici”, in alcuni dispositivi medici, e così via. • Al contrario, considerare appartenente alla categoria SISD un processore superscalare multiple-issue sembra un po’ una forzatura, che però di solito viene fatta: in fondo, i moderni processori sono comunque i naturali pronipoti della classica architettura Von Neumann • MISD: Multiple Instruction (stream) Single Data (stream): ha senso una architettura di questo tipo? Molti autori pensano di no. • Tuttavia, data l’innaturale classificazione dei moderni processori pipelined nella categoria SISD, viene a volte osservato che questi processori sono più vicini ad una architettura MISD: il dato in elaborazione passa da un’istruzione all’altra man mano che queste fluiscono attraverso i vari stadi della pipeline. 60 20 Tassonomia delle architetture • SIMD: Single Instruction (stream) Multiple Data (stream): Piuttosto sorprendentemente, il modello SIMD fu uno dei primi modelli di architettura parallela proposti, il cui più “famigerato” rappresentante fu l’Illiac IV. • Il progetto dell’Illiac IV fu avviato a metà degli anni 60, e l’Illiac IV vide la luce nel 1972: costava 31 milioni di dollari (di allora) e aveva una capacità computazionale di circa 50 MFLOPS (ma l’obiettivo iniziale era di 1 GFLOP: a quel tempo sarebbe stato equivalente all’intera capacità computazionale disponibile). • L’Illiac IV è stato il più famoso rappresentante di un modello di architettura in buona parte abbandonato noto come array processor: un ampio numero di processori identici che eseguono la stessa sequenza di istruzioni su insiemi diversi di dati. 61 Tassonomia delle architetture • Ma c’è una seconda classe di architetture SIMD, concettualmente assai simili agli array processors: i processori vettoriali. • Anche i processori vettoriali lavorano su un array di dati, ma un unico core è responsabile per l’esecuzione dell’operazione specificata su tutti gli elementi del vettore. • Come abbiamo visto, anche questi processori non hanno avuto molto successo, sebbene alcune delle idee provenienti da questo tipo di architetture siano state poi trasferite nei moderni processori superscalari con le istruzioni di tipo SIMD. 62 Tassonomia delle architetture • MIMD: Multiple Instruction (stream) Multiple Data (stream): Ossia tutte le architetture multicore, multiprocessore e multicomputer viste fino ad ora, dai piccoli sistemi UMA (o, addirittura, dai dual core), fino ai clusters come Google. • Occorre ribadire che la tassonomia di Flynn è piuttosto rozza, e diversi tipi di architetture non sono di facile classificazione seguendo lo schema di Flynn: – i processori multithreaded sono dei SISD o dei MIMD? – i processori moderni con estensioni SIMD dove li mettiamo? 63 21 Tassonomia delle architetture • La tassonomia di Flynn (Tanenbaum, Fig. 8.21). 64 Una nota storica • Le problematiche delle architetture a parallelismo sia implicito che esplicito, sia a livello hardware che software, sono ovviamente un campo di studio aperto e in continua evoluzione e, addirittura: “arguments for the advantages of parallel execution can be traced back to the 19th century [Menabrea 1842]!” (H-P3, p. 652) • Hennessy e Patterson fanno riferimento ad un articolo scritto appunto nel 1842: 65 Una nota storica Sketch of The Analytical Engine Invented by Charles Babbage By Luigi Federico Menabrea of Turin, Officer of the Military Engineers from the Bibliothèque Universelle de Genève October, 1842, n. 82 With notes upon the Memoir by the Translator ADA AUGUSTA, COUNTESS OF LOVELACE 66 22 Una nota storica • Charles Babbage (1792 – 1871), inglese, fu una figura eminente del suo tempo. • Gli fu assegnata la cattedra di Matematica a Cambridge nel 1828, La stessa che fu di Isaac Newton e, ai giorni nostri, di Stephen Hawking. • Lasciò tuttavia la cattedra nel 1839 per dedicarsi a tempo pieno alle sue idee di inventore. • Fu membro delle più importanti società scientifiche inglesi ed europee, e amico di Charles Darwin, Sir John Herschel (astronomo), e Pierre Simon de Laplace. 67 Una nota storica • Tra gli anni 1820 e 1830 Babbage concepisce e in parte realizza un dispositivo noto come difference engine, sostanzialmente una calcolatrice (attenzione, non un calcolatore) elettronica in grado di eseguire alcuni tipi di operazioni aritmetiche, anche su numeri molto grandi. • Babbage ottiene anche cospicui finanziamenti pubblici per la realizzazione della sua invenzione, che tuttavia non vede mai completamente la luce. • A parte i problemi tecnici, la ragione è che, a partire dai primi anni 30, Babbage si dedica ad una nuova invenzione: una macchina in grado di calcolare funzioni arbitrariamente complesse su un numero arbitrario (ma comunque limitato) di variabili: l’Analytical Engine 68 Una nota storica • Da subito, Babbage concepisce l’idea di controllare il funzionamento dell’Analytical Engine attraverso schede perforate: l’intuizione gli deriva da quelle usate nel telaio automatico inventato da Joseph-Marie Jacquard in Francia nel 1801. • Babbage incomincia a chiedere finanziamenti per realizzare questa sua nuova invenzione, ma senza molto successo, visti i soldi già spesi e gli scarsi risultati ottenuti con il progetto precedente. • Babbage incomincia allora a cercare fuori dall’Inghilterra quell’interesse per le sue idee che non era stato in grado di sollevare in patria, e nell’agosto del 1840 viene invitato a Torino, a tenere una serie di conferenze al “Secondo congresso degli Scienziati Italiani” patrocinato da re Carlo Alberto di Savoia. 69 23 Una nota storica • Nel partecipare al congresso, l’intenzione di Babbage è di sollevare l’interesse di Giovanni Plana, astronomo torinese, professore dell’Università di Torino, tra gli scienziati più noti e influenti a livello europeo in quel periodo (Plana fu tra l’altro il fondatore dell’Osservatorio Astronomico di Torino) • Babbage spera che Plana voglia scrivere e pubblicare un resoconto delle sue conferenze, incarico che però Plana affida ad un suo allora sconosciuto allievo, Luigi Federico (conte di) Menabrea, ingegnere del genio militare. • (Menabrea diverrà poi generale di Garibaldi, ministro del regno e primo ministro dal 1867 al 1869. Il suo interesse per la scienza rimase comunque sempre vivo, e fu tra l’altro professore di Scienza delle Costruzioni all’Università di Torino dal 1846 al 1860) 70 Una nota storica • Menabrea scrive un articolo che riassume le idee dell’Analytical Engine, e l’articolo viene pubblicato, in francese, nell’ottobre del 1842 sul n. 82 della rivista della Bibliothèque Universelle de Genève. • All’inizio del 1843, Ada Augusta Byron, contessa di Lovelace (e figlia del poeta George Byron) su consiglio di Charles Wheatstone – (amico di famiglia e co-inventore del telegrafo) traduce il lavoro di Menabrea per il Taylor's Scientific Memoirs, una rivista inglese specializzata nella pubblicazione di articoli scientifici e resoconti di congressi esteri. • Ada Lovelace invia la traduzione a Babbage, il quale la esorta (e con la quale collabora) ad aggiungere note di chiarimento al lavoro di Menabrea. 71 Una nota storica • L’articolo di Menabrea, tradotto e corredato delle ampie note di Ada Lovelace, viene pubblicato nel settembre del 1843, ed è considerato il primo articolo nella storia dell’informatica. • L’articolo descrive molti aspetti dell’architettura dei computer e della loro programmazione circa cento anni prima che queste idee fossero “riscoperte”, nel ventesimo secolo. • Charles Babbage viene universalmente considerato l’inventore del primo calcolatore elettronico digitale, e Ada Lovelace la prima programmatrice nella storia dell’informatica. • Sfortunatamente, le idee di Babbage e di Ada Lovelace furono prima ignorate, e poi dimenticate, per quasi un secolo... 72 24 Una nota storica • L’Analytical Engine era sostanzialmente un computer a schede perforate: come abbiamo visto, l’idea delle schede proveniva dal telaio per tessitura inventato da Jacquard: una scheda perforata permetteva di stabilire quale combinazione di fili di diverso colore dovessero essere usati in ogni riga di un tessuto • Ma nel telaio di Jacquard era necessaria una scheda per ogni riga del tessuto che doveva essere prodotto (a quei tempi esisteva un ritratto di Jacquard fatto al telaio usando 24.000 schede). • Un’intuizione fondamentale nell’Analytical Engine fu l’idea di usare cicli per i calcoli che dovevano essere ripetuti più volte, in questo modo usando un numero finito e limitato di schede per specificare calcoli che potevano essere ripetuti un numero indefinito di volte. 73 Una nota storica • La macchina di Babbage era progettata per eseguire delle Operazioni su delle Variabili. • Le operazioni venivano eseguite da un complesso dispositivo chiamato mill (mulino, macinino) guidato dalle schede perforate. • Il mill operava sulle Variabili: cilindri di ottone su cui erano impilati più dischi numerati da 0 a 9, in grado così di rappresentare numeri positivi e negativi in notazione decimale. • Le Variabili potevano memorizzare i valori di input di un calcolo da eseguire, il risultato di computazioni intermedie da usare poi in altre computazioni, e naturalmente il risultato finale delle computazioni: schede speciali permettevano di specificare quali Variabili dovevano memorizzare quali valori (iniziali, intermedi e finali) 74 Una nota storica • Nell’Analytical Engine emergono quindi già in modo chiaro alcuni concetti di base dei moderni processori: – l’unità di controllo, cositutita dal Mill, che opera sulle Variabili. – Il programma che deve essere eseguito dal Mill, rappresentato da una serie di schede perforate. – Il concetto di memoria, usata per contenere i dati iniziali, intermedi e finali del calcolo, rappresentato dalle Variabili della macchina (in sostanza, i registri di una moderna CPU). – Il concetto di computazione parallela, poiché diverse operazioni intermedie potevano essere eseguite in parallelo su diverse Variabili. – Il concetto di input e output, rappresentato da quelle Variabili che contenevano i valori di partenza di una computazione, e dalle Variabili designate per memorizzare i risultati finali. 75 25 Una nota storica • chi vuole approfondire questo argomento, può trovare in rete molte informazioni. Un buon punto di partenza è il seguente: – www.fourmilab.ch/babbage/contents.html • Qui troverete tra l’altro l’articolo di Menabrea tradotto da Ada Lovelace, biografie dei protagonisti di questa storia, riproduzioni dei disegni dei progetti di Babbage, e alcuni programmi Java che permettono di emulare il funzionamento dell’Analytical Engine. 76 26