breve introduzione al calcolo parallelo - mauroennas.eu · l’importanza del calcolo automatico...
TRANSCRIPT
Breve introduzione
al calcolo parallelo
Creative Commons 2013
Free Report
CC BY Mauro Ennas 1998-2013
Some Rights Reserved
CC 1998-2013 BY Mauro Ennas - Some Rights Reserved
Breve introduzione al calcolo paralleloSe utilizzi queste note (testo, codici e figure) per produrre nuovo materiale, cita la fonte.
Indice
1 Introduzione al calcolo parallelo 1
2 Architetture parallele 8
2.1 La Connection Machine - TMC . . . . . . . . . . . . . . . . . . . . 13
2.2 L’IBM-SP2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2.1 Componenti del sistema . . . . . . . . . . . . . . . . . . . 17
2.2.2 I processori . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.3 Il sottosistema di comunicazione . . . . . . . . . . . . . . 18
2.2.4 Ambiente parallelo . . . . . . . . . . . . . . . . . . . . . . . 20
3 Programmazione parallela 21
3.1 Modello message-passing . . . . . . . . . . . . . . . . . . . . . . 22
3.2 Modello shared-memory . . . . . . . . . . . . . . . . . . . . . . . 22
3.3 Modello data-parallel . . . . . . . . . . . . . . . . . . . . . . . . . 23
4 Programmazione data-parallel 25
4.1 L’High Performance Fortran . . . . . . . . . . . . . . . . . . . . . 26
4.2 Il FORTRAN 90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3 Caratteristiche del linguaggio HPF . . . . . . . . . . . . . . . . . 31
4.3.1 Il mapping dei dati . . . . . . . . . . . . . . . . . . . . . . 33
Mauro Ennas Creative Commons 2013
5 Compilatori per macchine parallele 36
5.1 PGHPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2 ADAPTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3 Prestazioni degli algoritmi paralleli . . . . . . . . . . . . . . . . . 39
5.3.1 Modello semplificato per i tempi di calcolo . . . . . . . . . 41
Bibliografia 43
CC 1998-2013 BY Mauro Ennas - Some Rights Reserved
Breve introduzione al calcolo paralleloSe utilizzi queste note (testo, codici e figure) per produrre nuovo materiale, cita la fonte.
Capitolo 1
Introduzione al calcolo
parallelo
La costruzione del primo calcolatore elettronico moderno viene attribui-
ta ai due ricercatori statunitensi Mauchly ed Eckert dell’Universita della
Pennsylvania, che insieme ad oltre trenta studenti della stessa Universita
riuscirono a progettare e portare a termine la costruzione del calcolatore
denominato ENIAC I 1 nel 1946.
L’importanza del calcolo automatico era emersa precocemente, rispetto al-
le tecnologie disponibili, nei secoli precedenti ad opera di Gottfried Wilhelm
von Leibnitz (1646-1716) che costruı una macchina meccanica capace di
effettuare moltiplicazioni e divisioni e Charles Babbage (1792-1871) che
tento di costruire un grosso calcolatore meccanico, costituito da ingranag-
gi e ruote dentate, che per complessita e caratteristiche di progetto stimolo,
nei decenni sucessivi, i progettisti dei moderni sistemi di calcolo.
Con l’ENIAC I viene fatta cominciare l’era moderna del progetto di calcola-
tori elettronici 2 in quanto dall’esperienza maturata nella costruzione di un
1Elettronic Numeric Integrator And Calculator.2Anche se e noto che, in realta, i primi tentativi risalgono a dieci anni prima, ne
e un esempio l’elaboratore Z1 di Konrad Zuse nella Germania hitleriana (1938) che
rappresenta il primo calcolatore a rele funzionante; seguirono lavori di John Atana-
soff dello Iowa State College e di George Stibbits presso i Bell Labs che costruirono
Mauro Ennas Creative Commons 2013
2
simile mostro, costituito da 18000 tubi a vuoto e 1500 rele, pesante ben 30
tonnellate e con consumi quantificati in 140 kilowatt, Mauchley ed Eckert
diedero vita, sei anni dopo, al primo calcolatore commerciale l’UNIVAC I
(1952).
Dai corsi tenuti da Mauchley ed Eckert nel dopoguerra si scateno un inte-
resse crescente per il progetto di calcolatori elettronici e vennero affinate
le tecniche di progetto finche si giunse nel 1960 ad un modello generale
proposto da John von Neumann che costruı la IAS machine (a transistori 3
) presso l’Istituto di Studi Avanzati dell’Universita di Princeton. La cosidetta
MEMORIA
Unitàdi Controllo
Accumulatore
Input Output
Figura 1.1: Macchina di von Neumann.
macchina di von Neumann (figura (1.1)) e alla base delle moderne architet-
ture dei calcolatori elettronici.
Gli anni cinquanta e sessanta furono segnati dallo sviluppo di una piccola
azienda produttrice, originariamente, di perforatrici e ordinatori meccanici
per schede. Si tratta dell’IBM, che finanzio vari progetti e produsse per pro-
prio conto macchine a valvole prima e a transistori poi, commercializzando-
li su vasta scala sino a divenire leader mondiale del mercato dei calcolatori
elettronici negli anni sessanta e settanta con i processori INTEL. Da studi
effettuati al M.I.T. di Boston sotto la sigla TX project (Transistorized eXperi-
mental) nasce la DEC di Kenneth Olsen con varie versioni dei sistemi PDP
calcolatori ad aritmetica binaria e con meccanismi di refresh della memoria del
tutto simili a quelli delle moderne RAM dinamiche.3Il primo transistore venne costruito nei laboratori Bell nel 1948 da John
Bardeen, Walter Bratten e William Shockeley che per questa invenzione furono
insigniti del Premio Nobel nel 1956.
Mauro Ennas Creative Commons 2013
3
a partire dal PDP-1 che introdusse il controllo del video (CRT) e sul quale
vennero programmati i primi videogiochi, sino al piu noto PDP-11.
La terza generazione di calcolatori viene fatta coincidere con l’avvento dei
circuiti integrati (1965-1980) che permisero all’IBM un’ulteriore espansio-
ne nel mercato commerciale, sviluppando una linea di sistemi (famiglia)
i cosidetti IBM-360 (dal 1964); vennero introdotte importanti innovazioni
quali la possibilita di gestire in memoria piu programmi contemporanea-
mente tramite la multiprogrammazione, la possibilita di emulazione di altri
processori e l’estensione dello spazio di indirizzamento. La quarta genera-
Cray X-MP
Figura 1.2: Evoluzione dei calcolatori paralleli. La continua crescita del numero di processori
per una singola macchina e strettamente correlato ai progressi nei settori delle tecnologie elettroniche e
microelettroniche e alla drastica riduzione dei costi di produzione su larga scala.
zione arriva sino ai giorni nostri ed e caratterizzata dall’avvento dei sistemi
integrati su larga scala VLSI e UVLSI; nasce il personal computer e vengono
sviluppate famiglie (quali INTEL e Motorola) di circuiti elettronici digitali in-
tegrati (IC). Migliorano notevolmente le prestazioni in termini di velocita di
calcolo e di precisione nei calcoli in virgola mobile, migliora la facilita d’uso
del calcolatore (grazie al potenziamento della programmazione e l’avven-
to dell’era del software) e si moltiplicano le interfacce esterne che possono
Mauro Ennas Creative Commons 2013
4
essere controllate attraverso il calcolatore e che ne hanno potenziato le pre-
stazioni e la diffusione sino ai giorni nostri.
Degno di nota il sistema VAX (1978) della DEC, il primo supermini a 32 bit
ancora in funzione in molti centri di calcolo.
Per avere nuovi sviluppi nel progetto delle architetture dei calcolatori si
devono attendere gli anni ottanta con il progetto delle macchine RISC 4
cosı denominate in contrapposizione alle macchine CISC (Complex Instruc-
tion Set Computer) ossia le IBM-360, i DEC-VAX, INTEL-X86 e i Motorola-
68030.
Il nuovo paradigma di progettazione propone una revisione completa ed
una riduzione di complessita delle tecniche di progettazione in uso sino
agli anni ottanta. Il dibattito sulle strategie legate all’introduzione di tecno-
logie avanzate muove da ragioni dominate da inferenze di tipo ecomonico,
determinate dalla globalizzazione della competitizione industriale.
Col passare del tempo i microprocessori raggiungono complessita crescen-
ti che appiattiscono, dal punto di vista delle prestazioni, le diverse classi
di calcolatori che avevano dominato il ventennio precedente a causa della
maturazione delle tecnologie, della diffusione sempre crescente dei calcola-
tori in tutti i settori produttivi e della conseguente riduzione dei loro costi
(figura (1.2)). Spesso si assume che in origine tutti i processori fossero
macchine RISC, con un piccolo numero di istruzioni gerarchiche che pote-
vano essere eseguite in sequenza. Le esigenze sempre crescenti portarono
all’introduzione della microprogrammazione per il progetto di processori piu
sofisticati. Il passo fondamentale per la semplificazione delle archittettu-
re e, paradossalmente, il miglioramento del software, in particolare dei
sistemi operativi e dei compilatori [8]. La prima macchina RISC fu il mini-
calcolatore IBM-801 (1975), ma le piu note macchine di questa categoria
restano la MIPS di John Hennessy (1984) e la SPARC 5 della Sun Micro-
system (1987). Gia dagli anni sessanta si era pensato che piu calcolatori
opportunamente programmati avrebbero potuto risolvere problemi di gran-
4Acronimo coniato da gruppo di Berkeley guidato da D. Patterson e C. Sequin
che progettarono nel 1980 il VLSI-RISC (Reduced Instruction Set Computer) che
porto ai processori RISC I e II.5Scalable Processor ARChitecture.
Mauro Ennas Creative Commons 2013
5
Cray X-MP
Figura 1.3: Evoluzione delle prestazioni delle macchine parallele.
de complessita, piu velocemente, se avessero potuto funzionare parallela-
mente cioe applicando gli stessi algoritmi su insiemi diversi di dati, oppure
applicando algoritmi differenti contemporaneamente sugli stessi dati. Nel
1964 nasce CDC-6600 a parallelismo interno estensivo, ben dieci volte piu
veloce della IBM-7094 che domino il calcolo scientifico negli anni ’60. Il
primo supercalcolatore parallelo fu il CRAY-1 del 1974.
I supercalcolatori sono stati concepiti per risolvere problemi di calcolo scien-
tifico altamente estensivi ed intensivi; cioe in grado di lavorare su grosse
quantita di dati e di massimizzare il numero di operazioni in virgola mo-
bile per secondo FLOPS (FLoating point Operations Per Second). Qualsiasi
macchina che non raggiunga prestazioni di 1 Giga-FLOPS non viene consi-
derata un supercalcolatore (figura (1.3)).
Generalmente le archittetture parallele vengono progettate per applicazioni
molto particolari ma negli ultimi anni si stanno imponendo sempre piu si-
stemi dalle caratteristiche flessibili, applicabili a piu ambiti, grazie alle mi-
gliorate caratteristiche dei processori. Seymour Cray padre delle macchine
CDC, fondo la societa che prende il suo nome e che attualmente produ-
Mauro Ennas Creative Commons 2013
6
ce il T3D e T3E. Negli anni novanta le macchine a parallelismo massiccio
che hanno avuto maggiore successo commerciale sono, oltre alle macchine
Cray, la Connection Machine (Thinking Machine Corporation) e l’IBM-SP2.
In Italia l’Alenia Spazio ha progettato in collaborazione con il CNR, l’INFN e
l’ENEA le macchine denominate QUADRICS, in due modelli QH16 6 e QDe-
SC 7, variamente configurabili.
In questo primo capitolo verranno introdotte le nozioni base del calcolo
parallelo, relativamente ad architetture, linguaggi e compilatori. Verra da-
ta particolare enfasi ai concetti legati al modello di programmazione data
parallel ed al linguaggio High Performance FORTRAN, indicando le caratte-
ristiche in base alle quali e stato scelto per il progetto di software scien-
tifico ad alte prestazioni (High Performance Computing). Verranno indicate
le caratteristiche salienti del calcolatore parallelo IBM-SP2/30 del CRS4,
utilizzata per lo sviluppo e il testing dei codici che verranno descritti det-
tagliatamente nei capitoli successivi. Nella parte conclusiva del capitolo
vengono definiti alcuni importanti indicatori di prestazioni.
6Sino a 200 GFLOPS.7Sino ad 1 GFLOPS.
Mauro Ennas Creative Commons 2013
7
Anno Nome Costruttore Note
1934 Analytical Engine Babbage Primo calcolatore numerico (non riuscito).
1936 Z1 Zuse Prima macchina a rele funzionante.
1943 COLOSSUS Regno Unito Primo calcolatore completamente elettronico.
1944 Mark I Aiken Primo calcolatore general purpose.
1946 ENIAC I Mauchley/Eckert Primo calcolatore moderno (post bellico).
1949 EDSAC Wilkes Primo calcolatore con programmi in memoria.
1951 Whirlwind M.I.T. Primo calcolatore real time.
1952 UNIVAC I Mauchley/Eckert Primo calcolatore commercializzato.
1960 IAS von Neumann Riferimento per calcolatori di II generazione.
1960 CEP Univ. di Pisa Piu potente sistema costruito in Europa.
1960 ELEA 9.300 Olivetti Primo calcolatore commerciale italiano.
1961 PDP-1 DEC Primo minicalcolatore (50 esemplari venduti).
1962 1401 IBM PC record di vendite negli anni ’60.
1963 7094 IBM Calcolatore scientifico dominante negli anni ’60.
1964 B5000 Burroughs Prima macchina con linguaggio di alto livello (Algol-60).
1964 360 IBM Prima famiglia di calcolatori.
1965 6600 CDC Prima macchina a parallelismo interno estensivo.
1970 PDP-8 DEC Primo minicalcolatore di massa (50000 venduti).
1970 PDP-11 DEC Minicalcolatore dominante negli anni ’70.
1974 8080 Intel Prima CPU general purpose integrata.
1974 CRAY-1 Cray primo supercalcolatore.
1978 VAX DEC Primo supermini a 32 bit.
Mau
roE
nn
as
Cre
ativ
eC
om
mon
s2013
Capitolo 2
Architetture parallele
Un calcolatore tradizionale ha una sola CPU che emette richieste sequen-
ziali del bus dati per leggere o scrivere in memoria o nello spazio di Input-
Output, ricevendo una risposta per volta. Questa modalita di funziona-
mento e nota come collo di bottiglia di von Neumann. Ad essa si e pensato
di ovviare progettando calcolatori che avessero piu unita di controllo, piu
unita logico aritmetiche (ALU), piu memorie in grado di operare in parallelo
nella esecuzione di uno o piu programmi.
Sono numerosi i progetti che aggregano CPU potenti debolmente connesse
o numerose ALU e FPU (Floating Point Unit) fortemente interagenti e sincro-
nizzate e tutta una varieta di progetti intermedi che hanno come finalita il
progetto di efficaci sistemi di calcolo parallelo.
La descrizione dei sistemi di calcolo parallelo richiede la conoscenza della
natura, della dimensione e del numero degli elementi di elaborazione e dei
moduli di memoria interagenti, nonche delle strategie per connettere tra lo-
ro processori e memorie. In genere gli elementi di elaborazione sono CPU
complete oppure ALU minime, con dimensioni largamente variabili, da un
chip a varie decine di schede sulle quali sono montati migliaia di elementi
1. Nel caso di CPU complete le tecnologie attuali permettono connessioni
di poco piu di 1000 elementi.
1Esistono sistemi con 65536 (CM-2) elementi di elaborazione (ALU) [8] ed
esistono progetti con oltre un milione di elementi.
Mauro Ennas Creative Commons 2013
9
Gli elementi di memoria sono suddivisi in moduli che operano indipenden-
temente gli uni da gli altri. Tra gli svariati sistemi esistenti vi sono da un
lato quelli con migliaia di elementi di elaborazione e memorie della dimen-
sione di qualche Kbyte (1 Kbyte = 210 byte = 1024 byte), dall’altra vi sono
sistemi con poche potenti unita di elaborazione con decine di Mbyte di me-
moria (220 > un milione di byte). Il problema cruciale e quello della velocita
relativa tra sistemi di elaborazione e memoria.
Figura 2.1: Topologie di connessione dei processori.
Topologia. I sistemi di elaborazione parallela si diversificano, oltre che
per il progetto delle CPU e della memoria, soprattutto per le modalita con
le quali si mettono insieme i componenti [8][12]. Abbiamo due grosse
categorie per gli schemi di interconnessione:
• schemi statici: cosidetti perche cablano tutti i componenti in un grafo
fissato (stella, griglia o anello);
• schemi dinamici: quando unita di elaborazione e memorie sono ag-
ganciati ad una rete di commutazione che guida i messaggi dinami-
camente tra processori differenti e memorie.
Questa prima classificazione strutturale e tipica di un approccio top-down.
Se vogliamo evidenziare quale sia il processo di calcolo che effettivamen-
te deve essere parallelizzato possiamo pensare che esistono problemi che
hanno bisogno di svolgere la stessa funzione su un insieme di dati di volta
in volta differente (ad esempio l’applicazione di uno stesso operatore locale
su diverse sezioni di uno stesso volume) oppure diverse funzioni su uno
stesso dataset (interrogazione di uno stesso archivio da parte di piu uten-
ti), con la stessa finalita di riduzione del tempo di elaborazione. Un sistema
Mauro Ennas Creative Commons 2013
10
parallelo in questo senso puo essere visto come un sistema time sharing,
ossia relativo ad un parallelismo delle funzioni in esecuzione in un sistema
distribito (in rete) tra processori e memoria.
Un altro modo di vedere le cose e quello di considerare un calcolatore
Figura 2.2: Ipercubo di processori e codice di Gray. Un efficiente meccanismo di comunicazione e il
cosidetto modello dei primi vicini ed e basato su una particolare allocazione della memoria dei processori
su una matrice, attraverso una codifica binaria (codice Gray) che garantisce la vicinanza dei dati; il
codice e tale che due numeri interi consecutivi differiscono per una sola cifra binaria, in questo modo e
possibile distribuire i dati in modo tale da mantenere una relazione di stretto vicinato, minimizzando le
comunicazioni.
parallelo utilizzato per eseguire un unico lavoro costituito da piu processi
paralleli parzialmente disgiunti che concorrono ad un risultato finale uni-
tario.
Ancora, possiamo pensare a sistemi che agiscono sul flusso delle istruzioni
smistando le operazioni su piu ALU operanti contemporaneamente oppu-
re ad un alevato livello di pipeline (differenti stadi della stessa istruzione
vengono eseguiti in modo concorrente); i calcolatori vettoriali ricadono in
quest’ultima categoria.
Granulatita ed Accoppiamento. Un’altra caratteristica che ci permette
di classificare i sistemi paralleli e la cosidetta granularita (grain size). Nei
sistemi time sharing e in quelli con piu CPU abbiamo una cosidetta unita
di parallelismo elevata che coincide col programma eseguibile nella sua
interezza. L’esecuzione di grosse porzioni di codice con poca o senza comu-
Mauro Ennas Creative Commons 2013
11
nicazione tra unita di elaborazione distinte prende il nome di parallelismo a
grana grossa in contrapposizione al parallelismo a grana fine caratterizzato
dall’elaborazione di piccole porzioni di codice con una discreta comunica-
zione tra processori, come avviene nei calcolatori vettoriali. In genere la
granularita e un concetto che si riferisce al software ma ha un’analogia
immediata nell’hardware [8]. In questo caso si parla piu propriamente di
accoppiamento 2 stretto oppure di accoppiamento debole, in relazione alla
quantita di dati che vengono scambiati in un secondo (banda di accoppia-
mento). In genere, i problemi con parallelismo a grana grossa lavorano
meglio su sistemi ad accoppiamento debole mentre quelli con parallelismo
a grana fine su architetture ad accoppiamento stretto, ma gli algoritmi e
le architetture esistenti sono talmente varie che una indicazione di questo
tipo puo risultare fuorviante in molti casi.
Tassonomia. Si cerca di mettere ordine in una situazione di questo tipo
cercando di costruire delle vere e proprie tassonomie dei sistemi di elabora-
zione parallela (figura (2.3)). Tra le piu note vi e certamente la tassonomia
di Flynn 3 (1972), mostrata in figura (2.3). La tassonomia di Flynn e basata
su due concetti:
• il flusso delle istruzioni, che corrisponde ad un contatore di program-
ma; un sistema con n CPU ha n contatori di programma, quindi n
flussi d’istruzione;
• il flusso dei dati e costituito da un insieme di operandi; un programma
che calcola una funzione su un elenco di dati ha un flusso di dati,
quello che calcola la stessa funzione su piu elenchi diversi di dati ha
piu flussi di dati.
Poiche il flusso di istruzioni e quello di dati sono indipendenti esistono
quattro categorie di macchine parallele:
2I sistemi con un piccolo numero di potenti CPU indipendenti che hanno una
banda di accoppiamento stretta sono dette ad accoppiamento debole, viceversa
sistemi con molti processori meno potenti ma con banda di accoppiamento piu
larga sono detti ad accoppiamenti stretto.3Altre sono attribuite a Gayski e Pier e a Treleaven (entrambe nel 1985).
Mauro Ennas Creative Commons 2013
12
SISD
SIMD
MISD
MIMD
VettorialiParalleli A memoria
condivisa A memoriaprivata
Switched
BusSwitched
BusUltracomputer
RP3Butterfly
SequentEncoreFirefly
HypercubeTransputer
SP2
Workstationsu LAN
von Neumann
?
CrayCyber 205NEC SX ILLIAC IV
CM-2, CM-200
Figura 2.3: Tassonomia di Flynn.
• SISD (Single Istruction Single Data), come la tipica macchina di von
Neumann;
• SIMD (Single Istruction Multiple Data), nella quale vi e una sola unita
di controllo che esegue una sola istruzione alla volta e piu ALU per
eseguire simultaneamente la stessa istruzione su diversi data-set;
• MISD e una categoria anomala in quanto dovrebbero esserci piu istru-
zioni che operano sugli stessi dati; molti annoverano in questa cate-
goria le macchine a pipeline;
• MIMD, cioe macchine costituite da piu CPU distinte e indipendenti
che operano come parte di un sistema piu grande. Molti processori o
sistemi paralleli appartengono a questa categoria.
La tassonomia di Flynn si ferma qui ma puo essere estesa consideran-
do le macchine SIMD divise in due sottogruppi, i supercalcolatori numerici
e le macchine vettoriali, inoltre anche la grande categoria delle macchi-
ne MIMD (figura (2.4)) puo essere suddivisa in macchine che hanno una
memoria primaria condivisa (multiprocessori) da quelle che non ce l’hanno
(multicalcolatori, o calcolatori a memoria privata o disgiunta).
Mauro Ennas Creative Commons 2013
2.1 La Connection Machine - TMC 13
Figura 2.4: Schemi tipici per le archittetture parallele MIMD. [ a] Interconnessione a rete tipica
delle macchine MIMD a memoria distribuita; [ b] Interconnessione a BUS per multiprocessori a memoria
condivisa (shared-memory).
2.1 La Connection Machine - TMC
Un esempio di calcolatore SIMD e la Connection Machine (CM) progettata
da W. Daniel Hillis 4 che in seguito fondo la Thinking Machines Corporation
per costruire e commercializzare le CM, sin dal 1986.
Nel seguito ci riferiremo per semplicita alla CM-2 (figura (2.5)), precurso-
re della piu moderna CM-200 5, allo scopo di evidenziare la complessita e
le eccezionali capacita di calcolo messe a disposizione dalle architetture a
parallelismo massiccio. La CM-2 e costituita da quattro parti (quadranti),
ciascuna delle quali e divisa in due sezioni di 8192 processori (PE-8K) cia-
scuna. Ogni quadrante contiene un’unita di controllo (sequenziatore) che e
in grado di eseguire un programma completo non appena e stato caricato in
memoria. Il sistema e caratterizzato dall’assenza di memoria di programma
(ovvero e una macchina di back-end), per cui dovra appoggiarsi ad uno o
piu host (sino a quattro host, ad esempio DEC-VAX). I programmi vengono
editati, compilati e collegati sull’host e quindi caricati sulla CM attraverso
4Il progetto originario era parte della sua tesi di Ph.D. sull’intelligenza artificiale
(M.I.T. 1985).5Attualmente la Thinking Machines Corporation progetta e costruisce macchine
MIMD a parallelismo massiccio (CM-5)
Mauro Ennas Creative Commons 2013
2.1 La Connection Machine - TMC 14
Nome Costruttore Tipo Memoria
CM-200 TMC SIMD Distribuita
CM-5 TMC MIMD Distribuita
T3D (T3E) Cray MIMD Distribuita
Paragon Intel MIMD Distribuita
CS-2 Meiko MIMD Distribuita
SP2 IBM MIMD Distribuita
C-90 Cray SIMD Condivisa
PowerChallenge SGI MIMD Condivisa
Tabella 2.1: Calcolatori paralleli moderni.
una griglia di interruttori 4× 4 e quindi eseguiti.
I quattro quadranti possono operare separatamente eseguendo quattro
programmi diversi contemporaneamente; e possibile raggruppare piu qua-
dranti per formare un unico sistema di 65536 processori operanti all’uni-
sono nella soluzione di un problema di grosse dimensioni.
Ogni processore e costituito da un’unita logico aritmetica (ALU) e da 8 Kby-
te di memoria privata oltre a 4 bit di flag; le ALU sono riunite in gruppi di 16
(VLSI) e per ogni gruppo e presente un istradatore che si occupa della spe-
dizione dei messaggi tra i processori. L’insieme di 32 gruppi viene riunito
in una piastra costituita da 160 chip ed altri circuiti integrati d’interfac-
cia (figura (2.6)). Sedici piastre costituiscono un sottocubo per un totale di
8196 processori, due sottocubi formano un quadrante e quattro quadranti
un cubo di 1.5 metri di lato, costituito complessivamente da 25000 circuiti
integrati.
La topologia di comunicazione e di tipo ipercubo (figura (2.2)). Un sistema
di questo tipo e in grado di effettuare 4 miliardi di operazioni in virgola
mobile al secondo.
Ogni sottocubo ha il proprio canale di I/O al quale si puo collegare un si-
stema di memorie di massa detto data vault, oltre ad un display grafico
ed altre periferiche. Ogni data vault e costituito da ben 39 disk drive e su
Mauro Ennas Creative Commons 2013
2.1 La Connection Machine - TMC 15
Figura 2.5: Struttura della CM-2. L’interrutore a griglia permette la configurabilita dell’accesso alle
unita di calcolo (quadranti).
ALU
Figura 2.6: Unita di elaborazione nella CM-2.
ognuno di essi puo essere scritto un bit, di una parola di 39, in parallelo.
Questo permette di raggiungere velocita di 40 Mbyte/sec per ognuno degli
otto sistemi data vault per un totale di 320 Mbyte/sec. La capacita totale
dei dischi e compresa tra 40 Gbyte e 80 Gbyte a seconda che si utilizzino
unita di 150 o 300 Mbyte.
Mauro Ennas Creative Commons 2013
2.2 L’IBM-SP2 16
Caratteristiche
Numero di processori 65536
Memoria 512 Mbyte
Banda della Memoria 300 Gbyte/sec
Banda I/O 320 Mbyte/sec
Banda interprocessore 250 milioni di parole/sec
Addizione di interi (32 bit) 2500 MIPS
Addizione in virgola mobile (32 bit) 4 GFLOPS
Dissipazione di energia 28 kW
Peso 1200 kg
Tabella 2.2: Caratteristiche principali della CM-2.
2.2 L’IBM-SP2
Il sistema parallelo scalabile 6 IBM-SP2 possiede la principale caratteristica
della macchine moderne a parallelismo massiccio: la flessibilita.
Tradizionalmente il progetto di calcolatori paralleli era orientato ad usi spe-
cifici con nicchie di mercato estremamente strette. Attualmente, grazie alla
potenza delle prestazioni delle singole unita di elaborazione, vengono pro-
gettati calcolatori paralleli general pourpose, capaci di assolvere ad una
grande varieta di utilizzi.
Il sistema SP2 e un sistema basato su un’architettura message passing a
memoria distribuita. Generalmente sono disponibili sistemi con un nume-
ro di unita di elaborazione che variano tra 2 e 128 nodi (unita di processo);
sono stati sviluppati sistemi con 512 nodi ed oltre per applicazioni parti-
colari. I singoli nodi della SP2 sono processori RISC System/6000 in tec-
nologia POWER2, interconnessi da una rete a commutazione di pacchetto
(packet-switched network) ad alte prestazioni, multistadio, per le comuni-
cazioni interprocessore. Ciascuno dei nodi e dotato di memoria propria e di
una copia del sistama operativo standard AIX e di altro software di sistema
6Configurabile con un numero variabile di processori interagenti.
Mauro Ennas Creative Commons 2013
2.2 L’IBM-SP2 17
specifico.
Caratteristiche
Numero di processori 30 (Thin Node2)
Clock 66.7 MHz
Memoria 128 Mbyte
Bus della memoria 64 bit
Cache L1 128 Kbyte (dati) e 32 Kbyte (istruzioni)
Velocit a del Bus 160 Mbyte/sec
Velocit a dello Switch 150 Mbyte/sec
Peso 340-635 Kg
Tabella 2.3: Caratteristiche principali dei processori RS/6000 della SP2/30
del CRS4.
2.2.1 Componenti del sistema
Nel seguito verranno descritte con maggiore dettaglio le principali carat-
teristiche dei componeti del sistema parallelo IBM-SP2 (figura (2.7)). Le
caratteristiche dei singoli componenti si riflettono in modo diretto sulle es-
senziali caratteristiche di scalabilita, di flessibilita e sulla natura general
purpose di un sistema di questo tipo.
2.2.2 I processori
Il fattore che determina le prestazioni del sistema, in prima analisi, e l’effi-
cienza di ogni singolo processore. Per il sistema SP2 l’IBM [9] ha utilizzato
il processore piu veloce e robusto che aveva a disposizione, permettendo in
questo modo la possibilita di utilizzare il sistema multiprocessore anche in
modalita multipla monoprocessore con la stessa affidabilita.
I processori RISC System/6000 in tecnologia POWER2 sono processori su-
perscalari (ognuno dei quali e in grado di eseguire piu istruzioni concor-
Mauro Ennas Creative Commons 2013
2.2 L’IBM-SP2 18
{{Figura 2.7: La struttura dell’IBM-SP2/30.
rentemente per ogni ciclo) e funzionanti in pipeline spinto (cioe funzionanti
con frequenze molto elevate). Vi sono tre diversi tipi di nodo (wide, thin e
thin2). Ciascuno dei nodi del primo e secondo tipo hanno due unita in vir-
gola mobile (FPU) ed un’unita di controllo d’istruzione. Il clock di 66.7 MHz
permette ai processori di raggiungere performance di 267 MFLOPS. L’unita
di controllo d’istruzione opera sulla decodifica delle istruzioni multiple ot-
timizzando la loro gestione. Tutto cio unito ad una memoria gerarchica di
grande capacita (da un minimo di 2 Gbyte) e di elevate prestazioni (banda
passante di 2.1 Gbyte/sec). La memoria cache e di 256 Kbyte a 4 vie set
associative, trasferisce quattro operandi di 64 bit (due linee) per ogni ciclo
alla FPU. I nodi dei tre tipi differiscono per la memoria (quantita e tipo) e
per la configurabilita.
2.2.3 Il sottosistema di comunicazione
Viste le elevate prestazioni del processore [9], le richieste di velocita di co-
municazione sono molto elevate, le parole chiave sono larga banda e piccola
latenza. I nodi della SP2 sono interconnessi attraverso uno switch ad alte
prestazioni (HPS) progettato con caratteristiche di scalabilita, bassa laten-
za, larga banda, basso overhead, affidabile e flessibile. La sua topologia e
del tipo any-to-any packetswitch, multistadio e a rete indiretta (Omega net-
work like) (figura (2.8)), cio consente di adeguare linearmente la bisezione
della banda alla dimensione scalare del sistema (altrettanto non avviene
Mauro Ennas Creative Commons 2013
2.2 L’IBM-SP2 19
nelle reti ad anello o in quelle reticolari). La topologia HPS permette di ave-
Figura 2.8: Esempio di rete Omega a tre stadi per la comunicazione tra processori e memoria.
Sono presemti 12 interruttori a due ingressi (alto (0)) e due uscite per collegare 8 processori a 8 elementi
di memoria (in generale sono necessari log2(n) stadi con n/2 interruttori per stadio).
re banda costante tra ogni coppia di nodi indipendente dalla loro posizione
reciproca. In generale la banda disponibile in un nodo e pari a:
Blink ·Nlink
Nhops
nella quale:
• Blink e la banda coinvolta nella comunicazione (link band);
• Nlink rappresenta il numero di comunicazioni per nodo nello switch;
• Nhops il numero medio di stadi attraverso lo switch richiesti per l’ope-
razione di comunicazione.
In uno switch multistadio come l’HPS sia Nhops che Nlink scalano logaritmi-
camente col numero di nodi e viene resa costante la banda disponibile.
Nelle reti dirette il numero di stadi, per una configurazione di comunica-
zione casuale, cresce col numero di nodi mentre il numero di link per nodo
resta costante e quindi la banda media per coppia di nodi comunicanti
decresce. Questo punto risulta determinante in quanto evita al program-
matore di dover ottimizzare il software per minimizzare Nhops.
Mauro Ennas Creative Commons 2013
2.2 L’IBM-SP2 20
Ogni nodo della SP2 e connesso alla scheda HPS tramite un adattatore in-
telligente Micro Channel. Questo adattatore (con microprocessore onboard)
e in grado di gestire le transazioni di messaggi direttamente sulla memoria
del processore o a partire da essa (tramite Direct Memory Access) e de-
crementa sensibilmente il tempo di elaborazione dei messaggi con effetti
benefici sulla gestione della banda di comunicazione.
2.2.4 Ambiente parallelo
L’ambiente parallelo viene denominato SP2-AIX [9] integrato in un insieme
di componenti permette lo sviluppo, il debugging ed il parallel tuning di
programmi in FORTRAN 7 e C, inoltre permette di inizializzare, controllare
e monitorare la loro esecuzione.
Le componenti principali dell’ambiente parallelo sono:
• la libreria Message-Passing (MPL)
libreria avanzata di comunicazione per programmi FORTRAN e C, che
utilizza protocollo TCP/IP su una connessione LAN o attraverso lo
switch.
• l’ambiente operativo parallelo (POE)
permette di compilare e di effettuare il collegamento delle librerie di-
sponibili; permette di creare partizioni dei nodi disponibili; carica gli
eseguibili sui nodi e permette il controllo dell’esecuzione.
• i tool di visualizzazione (VT)
permettono il monitoraggio post mortem.
• il debugger parallelo (PD)
e una versione del sistema UNIX dbx - debugging tool specializzata per
il debugging parallelo.
Il file system e stato progettato ad hoc e denominato PIOFS (Parallel I/O
File System).
7FORmula TRANslation.
Mauro Ennas Creative Commons 2013
Capitolo 3
Programmazione parallela
Il programma parallelo e un insieme di processi per i quali esiste un ordine,
seppure parziale, non fissato rigorosamente a priori come per i programmi
sequenziali.
L’obiettivi principale della programmazione parallela e la distribuzione ot-
timizzata dei carichi di lavoro (load balancing) sui diversi processori con la
finalita di ottenere velocita di calcolo piu elevate possibile.
La disponibilita di programmi applicativi e uno degli elementi piu impor-
tanti nel successo commerciale di un sistema di calcolo. Nel caso delle
piattaforme parallele vengono richiesti applicativi per lo sviluppo di soft-
ware principalmente nei linguaggi FORTRAN e C.
Vi sono esenzialmente tre modelli di programmazione parallela utilizzati
nella maggior parte dei sistemi scalabili:
• il modello di programmazione message passing;
• il modello di programmazione shared memory;
• il modello di programmazione data parallel.
Mauro Ennas Creative Commons 2013
3.1 Modello message-passing 22
3.1 Modello message-passing
Nel modello basato sul passaggio esplicito di messaggi, i processi di un’ap-
plicazione parallela hanno ciascuno il proprio spazio d’indirizzamento pri-
vato e condividono i dati attraverso l’uso esplicito di messaggi; il processo
sorgente esplicitamente manda (primitiva SEND) un messaggio ed il proces-
so target esplicitamente lo riceve (primitiva RECEIVE). I processi evolvono
nel senso che seguono il flusso di condivisione dei dati esplicitato diretta-
mente nel programma attraverso le primitive SEND e RECEIVE.
I programmi generalmente hanno una struttura SPMD (Single Program Mul-
tiple Data), ossia lo stesso programma agisce su porzioni parzialmente di-
sgiunte dei dati. Il programma in esecuzione evolve secondo la modalita
non perfettamente sincrona (loosely synchronous style) nella quale si al-
ternano una fase di calcolo con una di comunicazione. Durante la fase
di calcolo, ciascuno dei processi effettua i calcoli sulla porzione di dati
assegnatagli e nella fase di comunicazione i processi scambiano dati uti-
lizzando le librerie message-passing. Un esempio di linguaggio che sup-
porta la programmazione message passing e l’OCCAM, inoltre attraverso il
FORTRAN possono essere costruite librerie, quali MPI e PVM, di suppor-
to al modello di programmazione. Generalmente, tra i maggiori vantaggi
espressi dalla programmazione message passing vi e la concreta possibilita
di creare implementazioni estremamente veloci degli algoritmi, dipendente
strettamente dalla natura del problema e dall’abilita del programmatore.
Tra i difetti riconosciuti bisogna ricordare che la portabilita non e garanti-
ta e che la programmazione presenta delle difficolta da non sottovalutare
nell’implementazione di codici complessi.
3.2 Modello shared-memory
Nel modello a memoria condivisa i processi facenti capo ad una applicazio-
ne parallela condividono uno spazio d’indirizzamento ed in esso effettuano
le operazioni di ingresso/uscita in modo asincrono; i dati, in questo modo,
sono condivisi rispetto allo spazio direttamente referenziato senza bisogno
Mauro Ennas Creative Commons 2013
3.3 Modello data-parallel 23
di azioni esplicite per individuare i dati da condividere. La sincronizzazione
dei processi deve essere esplicitata utilizzando dei costrutti particolari.
Il modello di programmazione shared memory viene spesso associato al
controllo dinamico del parallelismo, nel quale porzioni logicamente indi-
pendenti dello stesso flusso di programma possono essere considerati come
blocchi funzionali o come cicli di iterazione indipendenti.
3.3 Modello data-parallel
Con il nome modello data-parallel s’intende individuare quella classe di lin-
guaggi che permettono di realizzare il parallelismo eseguendo una stessa
operazione, ovvero una serie di istruzioni, in modo concorrente su insiemi
di dati parzialmente disgiunti, facenti parte di una stessa struttura dati
complessiva. In questo modo ciascuna delle operazioni su ciascuno degli
elementi del dataset puo vedersi come un processo indipendente dagli altri,
cio porta a dire che la naturale granularita di un linguaggio data parallel e
una granularita fine.
Il modello di programmazione con parallelismo nei dati viene supportato
da linguaggi quali l’High Performance FORTRAN (HPF). I programmi sono
scritti utilizzando il FORTRAN 90 sequenziale per specificare le operazioni
sui dati, attraverso l’uso di costrutti particolari per le operazioni su vettori
e matrici oltreche direttive intrinseche dell’HPF per mappare i dati in modo
che possano essere distribuiti sui vari processori.
Il preprocessore o il compilatore HPF traducono il codice sorgente scritto
utilizzando FORTRAN 90 piu le direttive del linguaggio HPF in un codice
equivalente SPMD con chiamate message passing (se il sistema suppor-
ta un’architettura message passing come nel caso dell’SP2) oppure con le
appropriate sincronizzazioni (se il sistema supporta un’architettura time
sharing). Il carico di calcolo viene distribuito ai processi paralleli secondo
le specificazioni fornite attraverso le direttive di distribuzione HPF. Questo
approccio ha il grande vantaggio di liberare il programmatore dal compito
di distribuire matrici globali su matrici locali, sostituendo indici e rinomi-
nandoli oltre che indicare esplicitamente le chiamate per la trasmissione e
Mauro Ennas Creative Commons 2013
3.3 Modello data-parallel 24
la ricezione dei dati o la loro sincronizzazione. Un’altro vantaggio notevole
dello scrivere codici in HPF e la compatibilita con il FORTRAN standard,
agevolando il porting e la manutenzione dei codici, oltre che lo sviluppo su
workstation monoprocessore.
Esempi di linguaggi che supportano la programmazione data parallel sono
CM FORTRAN, CRAFT, C∗, FORTRAN D e VIENNA FORTRAN.
Mauro Ennas Creative Commons 2013
Capitolo 4
Programmazione data-parallel
I linguaggi data-parallel forniscono un modello astratto di parallelismo, in-
dipendente dalla macchina.
Linguaggi di questa categoria hanno la caratteristica di permettere ope-
razioni parallele a grana fine, devono permettere la condivisione dei dati
attraverso operazioni di mapping dei dati ed inoltre la sincronizzazione im-
plicita delle operazioni su di essi.
Cio permette di rendere le operazioni globali, su matrici anche di grandi
dimensioni, concettualmente semplici e di semplificare la programmazione
scientifica degli algoritmi. Lo svantaggio piu rilevante sta nella complica-
zione dei compilatori. Un approccio di questo tipo distribuisce il lavoro tra
programmatore e compilatore:
• Il programmatore dovra concentrare la sua attenzione sui concetti e le
strutture di alto livello, aggregando le operazioni operanti su strutture
dati di grosse dimensioni e fornendo le informazioni per la mappatura
dei dati su matrici globali (array sintax).
• I compiti del compilatore sono quelli di tradurre il mapping concet-
tuale in una distribuzione fisica, su un numero finito di processo-
ri, permettendo l’efficacia del parallelismo mediante la cura dei det-
tagli, fornendo all’utilizzatore indicazioni per attuare le direttive di
distribuzione dei dati e ottimizzando le comunicazioni.
Mauro Ennas Creative Commons 2013
4.1 L’High Performance Fortran 26
4.1 L’High Performance Fortran
La necessita di creazione di uno standard per la programmazione data-
parallel dei supercalcolatori ha trovato una prima adeguata risposta con
la costituzione di un comitato operativo nel Novembre 1991, denominato
High Performance FORTRAN Forum (HPFF), che porto all’uscita delle prime
note HPF Specification v1.0, nel Maggio 1993.
Nel 1994 compaiono i primi compilatori commerciali e nel corso dei due
anni successivi molte compagnie, non solo negli ambiti tecnologici affini
ma anche importanti societa industriali interessate allo spin-off tecnologico
promosso da un’iniziativa di questo tipo, aderiscono all’HPF Forum.
Attualmente il consorzio di ricerca e costituito da circa 40 tra industrie,
universita e laboratori di tutto il mondo non ancora legati formalmente con
gli organi internazionali per la standardizzazione ma in contato con l’ANSI
1 X3J3 [1].
Gli obiettivi dell’HPF Forum sono quelli di definire un linguaggio con le
seguenti caratteristiche:
• basato sul modello data parallel;
• tale da permettere elevate prestazioni su architetture SIMD e MIMD;
• tale da permettere la portabilita dei codici su varie piattaforme archi-
tetturali.
Questi obiettivi possono essere raggiunti tramite la definizione di nuove
caratteristiche del linguaggio, quali:
• funzioni intrinseche per il mapping dei dati;
• costrutti che operano in parallelo sui dati;
• direttive per il compilatore.
Il linguaggio HPF poggia sui costrutti propri del FORTRAN 90 [6], al quale
unisce direttive per l’allineamento e la distribuzione dei dati estendendo le
librerie ed offrendo la possibilita di creare interfacce con altri linguaggi.
1American National Standards Institute.
Mauro Ennas Creative Commons 2013
4.2 Il FORTRAN 90 27
4.2 Il FORTRAN 90
Il FORTRAN 90 e significativamente migliore del FORTRAN 77 [7], in quan-
to contiene direttive e costrutti che ne semplificano l’uso e migliorano la
leggibilita dei codici, carattteristica questa, di grande rilievo nei progetti di
grosse dimensioni. I miglioramenti piu importanti riguardano le operazioni
sulle matrici e sui vettori, la possibilita di definizione dei tipi (come avviene
in altri linguaggi di alto livello come il C) e nuovi costrutti di controllo e di
allocazione dinamica, l’introduzione dei puntatori e di nuove funzionalita
intrinseche.
Il FORTRAN 90 (F90) puo essere visto come un sottoinsieme del linguaggio
HPF, anche se alcune sue funzionalita come i puntatori, le definizioni di
tipo e i moduli non sono ancora presenti nei compilatori in commercio; il
lavoro di adeguamento e tutt’ora in corso.
Le caratteristiche piu rilevanti del linguaggio riguardano le operazioni sulle
matrici. La sintassi del F90 e molto sintetica e minimizza l’uso degli indici,
come puo notarsi dall’esempio seguente:
F77 F90
REAL A(100,100) REAL, DIMENSION(100,100) :: A
....... .......
DO i=1, 100 A = 4.0
DO j=1, 100
A(i,j) = 4.0
ENDDO
ENDDO
Un’altra caratteristica importante e il costrutto di controllo WHERE che
equivale ad un IF su ciascuno degli elementi della matrice:
REAL, DIMENSION(3,3) :: A
.......
WHERE(A < 5.0)
A = 5.0
Mauro Ennas Creative Commons 2013
4.2 Il FORTRAN 90 28
ELSE WHERE
A = 2* A + 1.0
ENDWHERE
che produce il risultato mostrato in figura (4.1).
Gli indici possono essere gestiti in modo semplice per individuare insiemi
5
Figura 4.1: Il costrutto WHERE permette di effettuare un IF su ogni elemento della matrice globale
(A nell’esempio).
all’interno di vettori e matrici nella forma:
indice− iniziale : indice− finale : passo
come nell’esempio seguente
REAL, DIMENSION(100) :: A
.......
c A(1) = A(2) = ...= A(100) = 0.0
A(1:100) = 0.0
c A(50) = A(51) = ... = A(100) = 1.0
A(50:100) = 1.0
c A(1) = A(3) = .... = A(49) = 2.0
A(1:50:2) = 2.0
Le operazioni sulle matrici possono essere effettuate se c’e congruenza
dimensionale, ovvero:
INTEGER :: A(50), B(10)
Mauro Ennas Creative Commons 2013
4.2 Il FORTRAN 90 29
.......
c B(1) = A(5), B(2) = A(10), ... ,B(10) = A(50).
B = A(1:50:5)
c B(1) = B(1) * A(21), B(2) = B(2) * A(22), ... , B(10) = B(10) * A(30).
B = B* A(21:30)
Vi sono direttive per l’allocazione e la deallocazione dinamica della me-
moria 2:
REAL, DIMENSION(:,:), ALLOCATABLE :: A
INTEGER :: nx
.......
nx = 100
ALLOCATE ( A(0,nx-1) )
.......
A = SQRT( A )
.......
DEALLOCATE( A )
La forma delle matrici puo, in questo modo, non essere dichiarata espli-
citamente. Sono disponibili funzioni per determinare le caratteristiche delle
matrici (SIZE, LBOUND), per costruire matrici (SPREAD, PACK, RESHAPE),
funzioni per calcolare il prodotto tra matrici (DOT PRODUCT, MATMUL),
funzioni di riduzione che a partire da una matrice determinano il massi-
mo o la somma degli elementi (MAXVAL, SUM) oppure applicano operatori
logici ad insiemi particolari di dati (ANY, ALL), funzioni che determinano
la locazione indiciale di massimi e minimi relativi (MAXLOC, MINLOC) e
funzioni per manipolare le matrici come oggetti globali (CSHIFT, EOSHIFT,
TRANSPOSE).
Un esempio di funzione per costruire matrici e la funzione SPREAD che
agisce come mostrato in figura (4.2). Per manipolare le matrici (ad esempio
le immagini) si fa largo uso della funzione di traslazione ciclica CSHIFT (fi-
gura (4.3)). La varieta delle funzioni e delle direttive rendono il linguaggio
2Contrariamente a quanto avviene in FORTRAN 77.
Mauro Ennas Creative Commons 2013
4.2 Il FORTRAN 90 30
Figura 4.2: La direttiva SPREAD.
di facile utilizzo e la sua efficacia viene dimostrata dalla facilita d’imple-
mentazione di algoritmi complicati.
Inoltre, non devono essere trascurate tutte quelle caratteristiche che gia
appartenevano al F77 e che sono patrimonio comune, almeno nella seman-
tica (non certo nella sintassi), dei linguaggi moderni di alto livello. Questo
Figura 4.3: La direttiva CSHIFT.
breve paragrafo non ha la pretesa di essere esaustivo 3 ma solo quella di
indicare le principali caratteristiche di un linguaggio che a detta di molti
dominera lo scenario della programmazione scientifica avanzata dei prossi-
mi anni, grazie ad altre sue importanti caratteristiche quali la gestione dei
puntatori e delle stutture come i piu moderni linguaggi di programmazione.
3Per una completa descrizione del linguaggio si rimanda a testi specifici quali
[6].
Mauro Ennas Creative Commons 2013
4.3 Caratteristiche del linguaggio HPF 31
4.3 Caratteristiche del linguaggio HPF
La programmazione data-parallel si pone gli ambiziosi obiettivi di ridurre la
complessita della programmazione parallela e nel contempo di permettere
operazioni a grana fine efficienti nel senso del costo computazionale.
L’HPF ha diverse possibilita per muoversi in questa direzione. La prima
e senza dubbio quella offerta dal supporto del F90 con le operazioni sulle
matrici; un’altra e rappresentata dalla procedura FORALL che permette di
utilizzare cicli basati sulla struttura dello spazio degli indici, generalizzando
il concetto di assegnamento dei valori ad una matrice tipico delle istruzioni
di controllo quali il WHERE.
Il FORALL viene eseguito in quattro passi:
• calcolo degli indici validi
• definizione degli indici attivi
• valutazione delle espressioni al secondo membro
• valutazione delle espressioni al primo membro
Gli elementi di ciascuno stadio vengono valutati in parallelo ed ogni stadio
del ciclo deve essere portato a termine prima che inizi il sucessivo; un
comportamento non conforme si evidenzia nell’assegnare valori diversi alle
stesse locazioni di memoria, per lo stesso stadio del ciclo.
Il FORALL risulta utile in diverse situazioni:
• negli assegnamenti in funzione degli indici
FORALL (i=1:N, j=1:M) A(i,j) = SQRT( 1.0/ REAL(i+j) )
• nella distribuzione di dati a partire da geometrie irregolari:
FORALL (i=1:N) B(i) = A(i,i)
• nelle operazioni che utilizzano funzioni definite dall’utente:
FORALL (i=1:N, j=1:M) A(i,j) = FUNZIONE(DATO1(1,j), DATO2 (i,j))
Mauro Ennas Creative Commons 2013
4.3 Caratteristiche del linguaggio HPF 32
end
begin
a[3]
c[3]
a[1] a[2]
c[2]c[1]
d[3]d[1] d[2]
b[3]b[1] b[2]
end
begin
a[3]
c[3]
a[1] a[2]
c[2]c[1]
b[1] b[2] b[3]
d[3]d[1] d[2]
Figura 4.4: FORALL e ciclo DO a confronto.
Possiamo confrontare un esempio di FORALL con un’esempio di ciclo DO,
come mostrato in figura (4.4). Se un’iterazione scrive su una locazione ap-
partenente ad una variabile riutilizzata nel ciclo e vogliamo che cio non
accada, dobbiamo fare uso della direttiva INDIPENDENT (figura (4.5)). Le
librerie HPF possiedono un grande numero di funzioni, per la descrizione
delle quali si rimanda alla lettura dei manuali dell’attuale versione dello
standard del linguaggio (HPF Specifications v x.0) [1].
Un’inportante categoria di funzionalita intrinseche del linguaggio sono quel-
le per la distribuzione dei dati all’interno dei singoli processori.
end
begin
a[3]
c[3]
a[1] a[2]
c[2]c[1]
b[1] b[2] b[3]
d[3]d[1] d[2]
Figura 4.5: La direttiva INDIPENDENT.
Mauro Ennas Creative Commons 2013
4.3 Caratteristiche del linguaggio HPF 33
4.3.1 Il mapping dei dati
Il cosidetto mapping consiste nella distribuzione dei dati all’interno dei pro-
cessori per ottenere un agevole accesso parallelo agli stessi [3][2]. L’HPF
utilizza due modalita per il mapping dei dati:
• la distribuzione vera e propria viene attuata attraverso la direttiva al
compilatore DISTRIBUTE che divide gli elementi di un oggetto tra i
vari processori a disposizione, secondo modalita prestabilite;
• l’allineamento dei dati ottenuto attraverso la direttiva al compilatore
ALIGN che crea una relazione tra gli oggetti utilizzati nel calcolo.
Il linguaggio prevede un’ulteriore livello di mapping che puo essere proposto
a cura dei progettisti delle varie versioni dei compilatori. Altre direttive sono
Figura 4.6: Mapping dei dati dal modello astratto ai processori fisici.
PROCESSORS che determina la forma della griglia di processori astratti e
TEMPLATE che permette di agire sullo spazio degli indici per permettere
allineamenti anche complicati [3]. Vi sono anche funzioni d’interrogazione
che permettono di conoscere run-time alcune informazioni quali il numero
di processori utilizzati e la forma della griglia fisica dei processori.
La direttiva di distribuzione si esprime nel modo seguente:
!HPF$ DISTRIBUTE A(tipo.distribuzione)
Mauro Ennas Creative Commons 2013
4.3 Caratteristiche del linguaggio HPF 34
oppure
!HPF$ DISTRIBUTE (tipo.distribuzione) :: A
Il tipo.distribuzione puo essere BLOCK, CYCLIC oppure * (leggi star).
La dichiarazione seguente
INTEGER, DIMENSION(100) :: A
.......
!HPF$ DISTRIBUTE A( * )
significa che tutti i 100 elementi del vettore A devono essere ricopiati
(collassati) su ogni processore. Altri esempi di distribuzione sono ripor-
(BLOCK,BLOCK)(BLOCK, *)
(CYCLIC(2), CYCLIC(4))(*, CYCLIC)
Figura 4.7: La direttiva di distribuzione dei dati DISTRIBUTE.
tati in figura (4.7). Dalla distribuzione dei dati, oltre che dall’algoritmo,
dipendono i tempi di comunicazione tra i processori, questo implica una
dipendenza stretta tra la natura del problema che si vuole risolvere e l’im-
plementazione data parallel che si e in grado di realizzare. Ci viene in aiuto
la direttiva di allineamento ALIGN che permette di distribuire gli elementi
Mauro Ennas Creative Commons 2013
4.3 Caratteristiche del linguaggio HPF 35
di un nuovo oggetto concordemente ad uno gia distribuito e col quale si
vuole che interagisca nelle varie fasi del calcolo. Per modificare gli assetti
gia fissati durante l’esecuzione del programma si utilizzano direttive qua-
li REDISTRIBUTE e REALIGN che, com’e facile supporre, utilizzano grossi
intervalli temporali per la comunicazione tra i processori che si scambiano
i dati da ridistribuire.
Mauro Ennas Creative Commons 2013
Capitolo 5
Compilatori per macchine
parallele
5.1 PGHPF
Il compilatore utilizzato su IBM-SP2/30 e il compilatore commerciale HPF
della Portland Group Inc. (PGI).
Esso e implementato per funzionare su una grande varieta di architettu-
re parallele (Intel-Paragon, Cray T3D e T3E, SGI-PowerChallenge) e risulta
compatibile con ambienti distribuiti come i cluster di workstation.
Il comando principale e pghpf (definito compilation driver); esso controlla le
varie fasi della compilazione: la compilazione del linguaggio HPF vera e pro-
pria, la pre-elaborazione e la compilazione FORTRAN 77, l’assemblaggio e il
collegamento (che include le routine del run time system PGI HPF). L’esecu-
zione di pghpf puo essere effettuata su sistemi differenti e produce output
per sistemi differenti, con comandi disponibili variabili da sistema a siste-
ma. In generale, utilizzando pghpf, il processo di sviluppo e compilazione e
costituito di tre fasi:
• La prima fase e caratterizzata dalla produzione di un programma HPF
(con estensione .hpf, .f90, .for, .F o .f) scritto per essere eseguito in
parallelo.
Mauro Ennas Creative Commons 2013
5.1 PGHPF 37
• La compilazione del programma HPF utilizzando il comando pghpf
con le varie opzioni disponibili. Cio permette di ottenere un file og-
getto che include le librerie messe a disposizione dal run time system
HPF.
• L’esecuzione del modulo oggetto su un sistema target rappresenta la
terza ed ultima fase. Il comportamento dell’ esecuzione puo essere
controllato sulla linea di comando o con variabili d’ambiente.
Sono comunque possibile variazioni rispetto a questa sequenza generale
di sviluppo che permettono, ad esempio, di fermare la compilazione nel-
le varie fasi intermedie per esaminare i risultati prodotti. Esistono tutta
una serie di opzioni che possono essere abilitate o meno a seconda delle
esigenze, queste caratteristiche non verranno evidenziate anche se hanno
una grande importanza pratica nel processo di produzione del software.
Il modello di riferimento e un modello SPMD (Single Program Multiple Da-
ta), cio significa che ciascuno dei processori esegue lo stesso programma,
ma su dati differenti (in pratica l’immagine dello stesso programma viene
caricata su ogni processore). Ne consegue una allocazione della porzione di
dati assegnata a ciascuno dei processori, in accordo con le direttive di di-
stribuzione, con la dimensione delle matrici da distribuire e col numero di
processori, determinata a run-time dal compilatore o utilizzando argomenti
attraverso comandi in linea.
Le librerie messe a disposizione attraverso pghpf tengono conto delle co-
municazioni che devono essere attuate procedendo all’ottimizzazione a due
livelli. Un primo livello che tiene conto della dimensione e geometria dei
dati e dei processori coinvolti nel processo di calcolo (trasport indipendent
level) ed un secondo livello (trasport dipendent level) nel quale si fa rife-
rimento ad un protocollo standard di comunicazione oppure a particolari
meccanismi di trasferimento dei dati.
Mauro Ennas Creative Commons 2013
5.2 ADAPTOR 38
5.2 ADAPTOR
Il traduttore ADAPTOR 1 (Automatic Data Parallelism TranslatOR) e un soft-
ware applicativo public domain in grado di trasformare programmi scritti
secondo il modello data parallel in FORTRAN 77 + estensioni (utilizzando
le matrici generalizzate, cicli paralleli e direttive di distribuzione ed alli-
neamento dei dati) in un programma parallelo con passaggio esplicito di
messaggi (message passing) [10] [11]. Il linguaggio utilizzato nel program-
ma d’ingresso puo essere il CM FORTRAN o l’High Performance FORTRAN
2. Il codice che viene generato e un codice message passing che puo esse-
re eseguito su differenti sistemi multiprocessore a memoria distribuita ma
anche a memoria condivisa o su architetture a memoria virtuale condivisa.
ADAPTOR e costituito essenzialmente di due elementi, un nucleo di trasfor-
mazione da sorgente a sorgente denominato fadapt e la libreria del run time
system DALIB (Distribuited Array LIBrary) [4]. Per compilare e collegare il
Figura 5.1: La struttura di ADAPTOR.
programma generato, viene utilizzato il compilatore FORTRAN disponibile
1Progettato e realizzato da Thomas Brandes del GMD (German National Center
of Mathematics and Computer Science) di Bonn.2Allo stadio attuale dello sviluppo del compilatore non tutte le direttive di questi
linguaggi sono supportate.
Mauro Ennas Creative Commons 2013
5.3 Prestazioni degli algoritmi paralleli 39
sulla macchina parallela utilizzata; fadapt genera due programmi, un pro-
gramma host.f che gestisce le operazioni di I/O che devono essere esegui-
te dal nodo scelto come front-end del sistema e un programma node.f che
verra eseguito su ogni nodo disponibile della macchina. Vi sono anche altre
due modalita di funzionamento, una delle quali genera solo il programma
node.f utilizzando il primo nodo per le operazioni di I/O, l’altra e la moda-
lita UNIPROC ossia il funzionamento sul nodo singolo, in quest’ultimo caso
la traduzione produrra un codice F77 sequenziale.
5.3 Prestazioni degli algoritmi paralleli
Gli algoritmi sequenziali vengono valutati in termini di tempo di esecuzione
in funzione della quantita di dati in ingresso. Nelle architetture parallele il
tempo di esecuzione non dipende solo dalla mole di dati da elaborare ma
soprattutto dal numero di processori e dal modo in cui tali processori inte-
ragiscono.
La valutazione delle prestazioni degli algoritmi paralleli risulta strettamente
legata all’architettura cui si fa riferimento. Un primo importante concetto
e la cosidetta scalabilita di un algoritmo eseguito su una certa architettu-
ra, che rappresenta una misura della proporzionalita delle prestazioni in
funzione del numero di processori che vengono utilizzati. Le prestazioni
possono essere valutate in vari modi, attraverso degli indicatori dell’effi-
cienza computazionale; i piu usati sono il run-time, lo speed-up, l’efficienza
e il costo [12] [5].
Run-Time. Per un programma seriale il run-time rappresenta il tempo
totale di esecuzione Ts su un calcolatore sequenziale, mentre il run-time
parallelo Tp rappresenta il tempo intercorrente tra l’avvio dell’esecuzione e
l’istante in cui l’ultimo dei processori attivi termina l’esecuzione.
Speed-up. Puo essere indicativo sapere quali vantaggi possono aversi nel
parallelizzare un codice implementati in modo sequenziale. Lo speed-up
misura il guadagno che si realizza risolvendo il problema in parallelo e vie-
ne definito come il rapporto tra il tempo richiesto per risolvere il problema
Mauro Ennas Creative Commons 2013
5.3 Prestazioni degli algoritmi paralleli 40
su un singolo processore e quello necessario per risolvere lo stesso proble-
ma su un calcolatore parallelo costituito da n processori identici .
Dato un problema, possono esistere piu soluzioni sequenziali dello stesso
algoritmo, non tutte parallelizzabili allo stesso modo. In genere viene preso
come riferimento, se esiste, l’algoritmo sequenziale piu veloce e lo speed-up
viene definito con riferimento ad esso e alla sua parallelizzazione:
S(p) =|Ts|min
Tp(n)
ossia lo speed-up viene definito come il rapporto tra il run-time minimo (cioe
relativo all’algoritmo seriale piu veloce) ed il run-time parallelo dello stesso
algoritmo su p processori identici al singolo processore utilizzato per il test
sequenziale.
Come esempio consideriamo un algoritmo che somma n numeri con n = 2k
e k ∈ N ; consideriamo n processori che operano parallelamente in modo
da effettura la somma totale per sucessive somme parziali di 2, 4, 8, ..2k ele-
menti. Il tempo di calcolo seriale sara una certa funzione di n, diciamo Y (n)
mentre per l’algoritmo parallelo in questione sara Y (log(n)). Lo speed-up lo
indicheremo come:
S(n) =Y (n)
Y (log(n))
Efficienza. Un calcolatore parallelo ideale potra eseguire un algoritmo
operante su N dati con n processori in un tempo
t ∝N
n,
ma cio significherabbe considerare le comunicazioni istantanee e cio nella
realta non e realizzabile. L’efficienza viene introdotta come indicatore della
quantita di tempo nella quale il processore viene effettivamente utilizzato,
definita come il rapporto tra speed-up e numero di processori:
E =S
n.
Dall’esempio precedente risulta E = 1/Y (log(n)).
Costo. Il costo necessario per risolvere un problema su un sistema paral-
lelo viene definito come il prodotto tra il run-time ed il numero di processori
utilizzati:
C = Tp · n;
Mauro Ennas Creative Commons 2013
5.3 Prestazioni degli algoritmi paralleli 41
viene anche indicato come lavoro o prodotto tempo-elaborazione.
Overhead. La funzione di overhead tiene conto di quella parte del costo che
non e dovuta all’elaborazione ma ad altri fenomeni come le comunicazioni.
In pratica si considera qualla porzione di tempo in piu rispetto al tempo
necessario al piu veloce algoritmo sequenziale per completare le elabora-
zioni. Se indichiamo con Tw il tempo del migliore algoritmo sequenziale,
l’overhead risulta:
To = n · Tp − Tw.
Tipo Numero di Processori Velocita di calcolo tipiche
Hitachi SR 2201 1024 1 TFLOPS
Intel XP/S 3680 700 GFLOPS
Cray T3D 1024 500 GFLOPS
IBM SP2 512 440 GFLOPS
SGI Power Challange 288 110 GFLOPS
Cray2 4 1.6 GFLOPS
Tabella 5.1: Prestazioni tipiche dei moderni calcolatori paralleli.
5.3.1 Modello semplificato per i tempi di calcolo
Per un modello semplificato di programma parallelo avremo un tempo to-
tale di esecuzione dato dall’espressione seguente:
Ttot = Tseq +Tpar
p+ Tcom (5.1)
nella quale Tseq tiene conto dell’eventuale presenza di parti esclusivamente
sequenziali all’interno del codice (come accade generalmente per l’input e
l’output dei dati), Tpar e il tempo impiegato da ciascuno degli n processori
utilizzati nell’azione di calcolo, mentre il tempo Tcom tiene conto del tempo
impiegato nella comunicazione tra processori e nella sincronizzazione dei
processi e dei dispositivi.
Mauro Ennas Creative Commons 2013
5.3 Prestazioni degli algoritmi paralleli 42
A B
C D
Figura 5.2: Comunicazioni: esempio di distribuzione (BLOCK,BLOCK).
Le richieste di parallelismo e di minimizzazione del tempo Tcom posso-
no ottenersi in modo spontaneo in certi problemi (embarrassingly parallel
problems) come nel caso degli algoritmi di basso livello per l’elaborazione
delle immagini o per i metodi di decomposizione (domain decomposition),
ma nella maggioranza dei casi sono in conflitto tra loro in quanto il paral-
lelismo estremo richiederebbe un processore per ogni stadio consistente di
elaborazione mentre la minimizzazione delle comunicazioni richiederebbe
di avere tutti i dati necessari ad una elaborazione distribuiti su un unico
processore [3]. Soddisfare entrambe le condizioni significa rendere l’algorit-
mo sequenziale. I problemi di conflitto hanno la loro causa nella natura del
problema, nell’architettura della macchina cui si fa riferimento e nel compi-
latore (soprattutto se in continua evoluzione, come nel caso dei compilatori
HPF).
Mauro Ennas Creative Commons 2013
Bibliografia
[1] A.A.V.V. HPF - language specifications. Rice University, Huston Texas,
1993.
[2] Erwing A.K., Richiardson H., Simpson A.D., and Kulkarni R. Wri-
ting Data Parallel Program with HPF. Edinburgh Parallel Computing
Center, University of Edinburgh, 1995.
[3] Koelbel C. HPF in Pratice. Rice University, 1996.
[4] Greco D. and Cabitza G. HPParLib++ : a Run-Time System for High
Performance Fortran. CRS4 TECH-REP-95/3, 1995.
[5] Baiardi F., Tomasi A., and Vanneschi M. Architetture dei sistemi di
elaborazione. Franco Angeli, 1991.
[6] Kerrigan J. F. Migrating to Fortran 90. O’Reilly and Associates, Inc.,
1993.
[7] Hellis T. M. R. Fortran 77. Zanichelli, 1989.
[8] Tanenbaum A. S. Architettura del computer - un approccio strutturale.
Prentice Hall International - Jackson libri, 1991.
[9] Agerwala T., Martin J.L., Mirza J.L., Sadler D.C., Dias D.M., and Snir
M. SP2 system architecture. IBM Corporation, Vol. 34, No. 2 - Scalable
Parallel Computing, 1995.
[10] Brandes T. Compiling Data Parallel Programs to Message Passing, Pro-
grams for Massively Parallel MIMD Systems. German National Center
of Mathematics and Computer Science, 1993.
Mauro Ennas Creative Commons 2013
BIBLIOGRAFIA 44
[11] Brandes T. ADAPTOR - Users Guide - Version 2.0. German National
Center of Mathematics and Computer Science, 1994.
[12] Kumar V., Grama A., Gupta A., and Karypis G. Introduction to Pa-
rallel Computing. University of Minnesota, The Benjamin/Cummings
publishing Company - Inc., 1994.
Mauro Ennas Finito di stampare il 6 luglio 2013 utilizzando LATEX2ε Creative Commons 2013