High Performance Computing
Laurea in Ingegneria e Scienze Informatiche, Università di Bologna, 2022/2023
Questa è la pagina dell'edizione precedente del
corso. L'edizione più recente è disponibile a questo
indirizzoa.
Salta all'introduzione
- 17/9/2023
- Questa edizione del corso è conclusa. Ricordo che c'è tempo fino al 30/9/2023 per la consegna del progetto. La pagina dell'edizione più recente del corso è disponibile a questo indirizzo.
Salta al programma del corso e libri di testo
Questa è la pagina del corso di High
Performance Computing, corso di laurea in Ingegneria
e Scienze Informatiche, AA
2022/2023, Università di Bologna (campus di Cesena). Il corso
fornisce le conoscenze teoriche e pratiche necessarie per progettare,
implementare e analizzare programmi paralleli su architetture a
memoria condivisa e distribuita. In particolare, durante il corso gli
studenti e le studentesse impareranno a realizzare programmi paralleli
usando OpenMP, MPI e CUDA/C.
Prerequisiti: Questo corso richiede una buona
conoscenza della programmazione in linguaggio C e delle architetture
dei calcolatori (a livello di quanto presentato nel corso di
architettura dei calcolatori). Lavoreremo in ambiente Linux
utilizzando prevalentemente software libero (compilatore GCC, libreria Open MPI; per la
programmazione CUDA useremo il software proprietario NVIDIA, dato che
al momento mancano alternative libere adeguate). È quindi
auspicabile avere già acquisito confidenza con l'ambiente
Unix/Linux e i suoi strumenti di sviluppo.
Torna in cima alla pagina.
Salta alla modalità d'esame
Programma di massima
- Architetture parallele: sistemi a memoria condivisa e distribuita; GPGPU
- Pattern per la programmazione parallela: problemi embarassingly parallel; work farm; partitioning; reduce; stencil
- Valutazione delle prestazioni di programmi paralleli: speedup, efficienza, scalabilità
- Programmazione di architetture a memoria condivisa con OpenMP
- Programmazione di architetture a memoria distribuita con MPI
- Programmazione di GPU con CUDA/C
- Programmazione SIMD su architettura Intel
Laboratorio
Durante il corso verranno svolte esercitazioni di laboratorio per
acquisire pratica con le tecniche viste a lezione. Verrà messo
a disposizione un server Linux configurato con il software necessario;
per le modalità di accesso si faccia riferimento alle istruzioni sulla piattaforma Virtuale.
All'inizio di ogni laboratorio, il docente fornisce le
implementazioni seriali di alcuni programmi che risolvono semplici
problemi. Scopo dell'esercitazione è di parallelizzare la versione
seriale usando le tecniche indicate di volta in volta. Uno degli
esercizi verrà svolto dal docente in modo guidato.
Verranno proposti più esercizi di quanti possano essere
realisticamente svolti nel tempo disponibile. Non mi aspetto
che vengano svolti tutti durante il laboratorio: l'intento
è lasciare un po' di scelta in modo che ciascuno possa trovare
qualcosa di proprio interessante.
Testi di riferimento
I seguenti testi coprono la gran parte del materiale che vedremo a
lezione e in laboratorio; tuttavia, essi non sostituiscono la
frequenza di lezioni e laboratori, che restano essenziali per una
preparazione solida e completa.
-
Peter Pacheco, An Introduction to
Parallel Programming, Morgan Kaufmann, 2011, ISBN
978-0123742605
Errori noti, a cura dell'autore.
Un valido libro didattico sulle architetture e
programmazione parallela, su cui si baserà buona parte del
corso; le lezioni copriranno le parti introduttive e quelle sulla
programmazione OpenMP e MPI. Non vedremo la programmazione
Pthread. Il libro, purtroppo, non tratta la programmazione di GPU
né la programmazione SIMD.
-
CUDA C++ programming
guide
Guida di programmazione CUDA/C, liberamente disponibile sul sito di NVIDIA.
Materiale per approfondimenti
In rete si trova molto materiale per approfondire gli argomenti
trattati nel corso. Si tenga presente che i libri su OpenMP, MPI e
CUDA tendono ad invecchiare velocemente man mano che nuove versioni
delle specifiche sono rese disponibili (tuttavia non
tratteremo le ultime versioni delle librerie, dato che comunque
sarebbero poco e male supportate dai compilatori).
-
Georg Hager, Gerhard Wellein, Introduction to High Performance Computing for Scientists and Engineers, CRC Press,
2010, ISBN 9781439811924
Libro è fortemente
consigliato. Contiene una parte introduttiva sulle
architetture parallele e sullo sviluppo di algoritmi paralleli;
prosegue poi con la programmazione OpenMP e MPI. Il libro è
ricco di esempi e considerazioni sulle prestazioni di applicazioni
parallele; purtroppo non tratta la programmazione di GPU. Il
codice di esempio è in C e FORTRAN.
-
Roman Trobec, Boštjan Slivnik, Patricio Bulić, Borut Robič, Introduction to Parallel Computing: From Algorithms to
Programming on State-of-the-Art Platforms, Springer,
2018, ISBN 978-3-319-98832-0
Libro molto completo che include una parte
introduttiva sulle architetture parallel, OpenMP, MPI e
OpenCL. Probabilmente verrà adottato come testo di in
future edizioni del corso.
-
MPI: A Message-Passing
Interface Standard Version 4.0 descrive lo standard MPI
4.0 (la versione più recente è sempre disponibile qui)
-
Specifiche di
OpenMP aggiornate all'ultima versione disponibile. Si tenga
presente che spesso i compilatori non supportano ancora le
versioni più recenti di OpenMP.
-
Norm
Matloff, Programming on
Parallel Machines: GPU, Multicore, Clusters and more,
liberamente disponibile online con licenza Creative Commons.
Questo libro è liberamente disponibile online,
e copre la maggior parte degli argomenti affrontati a lezione,
cioè OpenMP, MPI e CUDA. Si tratta di una bozza ancora in
fase di stesura, il che significa che certe parti sono incomplete
o mancano del tutto. È comunque molto utile come supporto
allo studio del materiale di questo corso.
-
I. Foster. Designing and Building Parallel
Programs. Addison-Wesley, 1995, ISBN
978-0201575941
Questo libro è liberamente disponibile
online (cliccare sul titolo); il contenuto è un po' datato,
ma la parte generale sulle metodologie di programmazione e di
valutazione delle prestazioni resta comunque valida.
-
Jason Sanders, Edward Kandrot, CUDA by Example: An Introduction to General-Purpose GPU Programming, Addison-Wesley, 2010, ISBN 978-0131387683
Questo libro tratta la programmazione delle
GPU mediante CUDA. Altre risorse indicate per chi già
conosce CUDA e desidera approfondire tecniche efficienti di
programmazione, sono GPU Gems 2 e GPU Gems 3 (entrambi
disponibili online).
-
Michael McCool, Arch D. Robison, James Reinders,
Structured Parallel Programming, Morgan Kaufmann, 2012, ISBN 978-0-12-415993-8
Contiene una buona introduzione ai pattern per la programmazione parallela. Questo libro è liberamente scaricabile dal sito dell'editore, collegandosi dalla rete di Ateneo.
-
Per chi non ha molta pratica con l'ambiente Linux (che comunque
dovreste aver già usato nel corso di Sistemi Operativi) consiglio
questo tutorial
GNU/Linux a cura del progetto Debian
Per mancanza di tempo, nel corso non tratteremo in modo
approfondito gli aspetti metodologici di progettazione e analisi di
algoritmi paralleli. Se da un lato questi argomenti potrebbero
sembrare un po' teorici, sono in realtà importanti e
costituirebbero un ottimo investimento a lungo termine, perché
non diventano mai obsoleti come succede con le tecnologie. Sarebbe
infatti inutile conoscere le ultime novità, ad es., di MPI ma
non essere in grado di progettare un algoritmo parallelo efficiente in
grado di sfruttarle!
Di seguito vengono forniti alcuni riferimenti bibliografici per chi
fosse interessato a questi aspetti. Prestare attenzione al fatto che
si tratta di libri piuttosto impegnativi (pensate al libro di
algoritmi e strutture dati, in cui però gli algoritmi e le
strutture dati sono paralleli).
-
Joseph Jàjà, An Introduction to Parallel Algorithms, Addison-Wesley, 1992, ISBN 978-0201548563
Descrive algoritmi paralleli per vari tipi di
problemi usando modello PRAM. È uno
dei testi classici sull'argomento, purtroppo fuori catalogo e di
difficile reperibilità, oltre che di non facile
lettura.
-
Selim G. Akl, The Design and Analysis of Parallel Algorithms, Prentice-Hall, 1989, ISBN 978-0132000567
Un ottimo testo sugli algoritmi per il modello
PRAM. Un po'
più semplice rispetto al precedente libro di
Jàjà; purtroppo anche questo è fuori catalogo
e difficile da trovare.
Orario delle lezioni
Le lezioni si svolgeranno in parte online e in parte presso il
nuovo campus universitario di Cesena. Le lezioni in aula
saranno comunque trasmesse in diretta streaming, in modo che sia
possibile seguirle anche da remoto.
Alcune lezioni potrebbero subire delle variazioni rispetto
all'orario; si prega di fare riferimento al calendario delle lezioni che verrà
aggiornato di volta in volta.
Orario High Performance Computing, AA 2022/2023
Lunedì |
9:00—12:00, aula 2.4 |
Mercoledì |
15:00—18:00, lab 2.2 |
Torna in cima alla pagina.
Salta ai lucidi delle lezioni
Le specifiche sono disponibili sulla piattaforma Virtuale.
Modalità d'esame
- L'esame consiste in una prova scritta, della durata di 60
minuti, e un progetto di programmazione su specifiche fornite dal
docente alla fine del corso.
- Le due prove (scritto e progetto) sono
indipendenti e possono essere sostenute in
ordine qualsiasi. Ciascuna prova viene superata se si
ottiene un punteggio maggiore o uguale a 18/30.
- La prova scritta è costituita da quattro domande e/o
semplici esercizi, e ha lo scopo di verificare la conoscenza degli
aspetti teorici/metodologici del corso e delle basi della
programmazione parallela. Il voto della prova scritta è
espresso in trentesimi (massimo 30).
- Sono disponibili alcuni esempi di prove d'esame: primo esempio; secondo esempio; terzo esempio.
- Il progetto, da svolgere individualmente, ha lo
scopo di verificare la padronanza delle tecniche di programmazione
parallela illustrate a lezione. Il voto del progetto è
espresso in trentesimi (massimo 30).
- Il progetto dovrà essere accompagnato da una relazione
che descriva e giustifichi le scelte implementative, e illustri le
prestazioni e la scalabilità della soluzione proposta.
- I voti restano validi fino all'ultima sessione d'esame
dell'edizione corrente del corso, quindi fino al 30
settembre 2023. Dopo tale data, tutti i voti in sospeso
vengono persi e si ricomincia da capo con la nuova edizione del
corso. Quindi, il progetto va tassativamente consegnato
entro le 23:59 del 30 settembre 2023.
- Il voto finale si calcola come:
VotoFinale = VotoScritto × 0.4 + VotoProgetto × 0.6
arrotondando il risultato all'intero più vicino (xxx.49 viene arrotondato per difetto, xxx.5 viene arrotondato per eccesso). La lode può
essere assegnata, a discrezione del docente, in casi di prova scritta e progetto di qualità particolarmente elevata.
Per sostenere la prova scritta è obbligatorio iscriversi
tramite AlmaEsami. Le liste di
iscrizione chiudono alcuni giorni prima per consentire la gestione
degli aspetti logistici dell'esame, per cui è necessario
iscriversi per tempo. Le date delle prove scritte sono riportate nella
tabella seguente:
Torna in cima alla pagina.
HPC-2022-2023.zip: esempi di
programmazione illustrati durante il corso.
Lucidi e altro materiale
I lucidi non sostituiscono né i testi di riferimento
né la frequenza delle lezioni e dei laboratori, che
costituiscono importanti elementi per una buona preparazione
dell'esame; i lucidi rappresentano uno schema di parte delle
lezioni. Ringrazio chi mi segnalerà eventuali
errori.
I lucidi al momento disponibili sono quelli usati nel precedente
anno accademico; saranno possibili modifiche durante il corso,
specialmente prima delle lezioni.
Salvo dove diversamente indicato, i lucidi delle lezioni sono
distribuiti con licenza Creative
Commons Attribution-Share Alike 4.0 International (CC BY-SA 4.0).
- 19/9/2022 ore 09:00 aula 2.4
- Introduzione al corso (Pacheco cap. 1)
[ODP] [PDF]
- 21/9/2022 ore 15:00 lab 2.2
- Parallel architectures
(Pacheco cap. 2 escluso 2.3.3)
[ODP] [PDF]
- 26/9/2022
- Lezione annullata causa sospensione della didattica
- 28/9/2022 ore 15:00 lab 2.2
- Parallel Programming Patterns (McCool et al. cap 3)
[ODP] [PDF]
- 3/10/2022 ore 9:00 aula 2.4
- Parallel programming patterns (cont.)
Performance Evaluation of Parallel Programs (Pacheco cap. 2.6)
[ODP] [PDF]
- 5/10/2022 ore 15:00 lab 2.2
- Performance Evaluation of Parallel Programs (cont.)
Parallelizing Loops
[ODP] [PDF]
Per approfondire
- Lealie Lamport, The
Parallel Execution of DO Loops, Communications of the ACM 17,
vol 2, feb 1974, pp. 83—93. Questo è l'articolo in cui viene
introdotto il metodo degli iperpiani per l'allineamento dei
loop, ammesso che tale allineamento esista.
- Giacomo Aloisi, OPoly: an OpenMP polyhedral compiler. In questa
tesi di laurea che ho seguito tempo fa viene presentato un software
in grado di allineare automaticamente dei cicli annidati utilizzando
il metodo degli iperpiani di Lamport.
- 10/10/2022 ore 9:00 aula 2.4
- Shared-Memory Programming with OpenMP (Pacheco cap. 5)
[ODP] [PDF]
- 12/10/2022 ore 15:00 lab 2.2
- Lab OpenMP
Per l'accesso al server fare riferimento alle istruzioni
sulla piattaforma Virtuale.
Nota: vengono proposti più esercizi di quanti realisticamente possano essere svolti nelle ore di laboratorio; quello che non si riesce a fare durante il laboratorio viene lasciato per casa.
- Decifrare un messaggio cifrato [Soluzione]
- Prodotto scalare [Soluzione]
- Calcolo del valore approssimato di π [Soluzione]
- Frequenze dei caratteri in un documento [Soluzione]
- Crivello di Eratostene [Soluzione]
- 17/10/2022 ore 9:00 aula 2.4
- Shared-Memory Programming with OpenMP (part 2)
- 19/10/2022 ore 15:00 lab 2.2
- Lab OpenMP
- Simulare la clausola schedule(dynamic) [Soluzione]
- Ray tracing [Soluzione]
- La mappa del gatto di Arnold [Soluzione]
- Merge Sort [Soluzione]
- Loop-carried dependences [Soluzione]
- 24/10/2022 ore 9:00 aula 2.4
- Distributed-Memory Programming with MPI (Pacheco cap. 3)
[ODP] [PDF]
- 27/10/2022 ore 15:00 lab 2.2
- Lab MPI
- Comunicazione ad anello [Soluzione]
- Comunicazione broadcast [Soluzione]
- Calcolo del valore approssimato di π [Soluzione]
- Somma del contenuto di un array [Soluzione]
- 31/10/2022
- Lezione annullata causa sospensione della didattica
- 2/11/2022 ore 15:00 lab 2.2
- Lab MPI
- Insieme di Mandelbrot [Soluzione]
- Prodotto scalare [Soluzione]
- Calcolo dell'area dell'unione di cerchi [Soluzione]
- 7/11/2022 ore 9:00 aula 2.4
- MPI
- 9/11/2022 ore 15:00 lab 2.2
- Lab MPI
- Automa cellulare della
regola 30
[Soluzione]
- MPI Datatype [Soluzione]
- Bounding Box [Soluzione]
- Ricerca parallela su array [Soluzione]
- 14/11/2022 ore 9:00 aula 2.4
- CUDA Programming
[ODP] [PDF]
- 16/11/2022 ore 15:00 lab 2.2
- Lab CUDA
- Prodotto scalare [Soluzione]
- Inversione di array [Soluzione]
- Odd-Even Transposition Sort [Soluzione]
- Oscillatori accoppiati [Soluzione]
- 21/11/2022 ore 9:00 aula 2.4
- CUDA Programming
- 23/11/2022 ore 15:00 lab 2.2
- Lab CUDA
- Somma di matrici [Soluzione]
- Automa cellulare della
regola 30
[Soluzione]
- L'automa cellulare
ANNEAL
[Soluzione]
- (Esercizio extra) La mappa del gatto di Arnold [Soluzione]
- 28/11/2022 ore 9:00 aula 2.4
- Seminario prof. Bartolini [slide]
(a seguire) SIMD Programming
[ODP] [PDF]
- 30/11/2022 ore 15:00 lab 2.2
- Ultima lezione del corso
Lab SIMD
- Prodotto scalare [Soluzione]
- Prodotto matrice-matrice [Soluzione]
- Mappatura livelli di grigio di una immagine [Soluzione]
- La mappa del gatto di Arnold [Soluzione]
Torna in cima alla pagina.