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