Programmazione e Ottimizzazione HPC

Anno accademico 2026/2027 - Docente: EVA SCIACCA

Risultati di apprendimento attesi

Conoscenza e capacità di comprensione (knowledge and understanding): Lo studente approfondirà le tecniche avanzate di programmazione parallela per sistemi ad alte prestazioni a memoria condivisa e distribuita, con particolare riferimento ai costrutti avanzati di OpenMP (task parallelism, direttive SIMD, gestione dell'affinità su architetture NUMA) e di MPI (comunicazioni non bloccanti, tipi di dati derivati, comunicazioni one-sided, I/O parallelo), nonché ai modelli di programmazione ibrida MPI+OpenMP. Saranno inoltre trattati i principali strumenti e metodologie per l'analisi delle prestazioni, il profiling e l'ottimizzazione del codice su architetture HPC moderne.

Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): Lo studente sarà in grado di progettare, implementare e ottimizzare applicazioni parallele complesse su architetture a memoria condivisa, distribuita e ibrida, utilizzando strumenti di profiling per identificare colli di bottiglia e applicare strategie di ottimizzazione mirate al miglioramento della scalabilità e dell'efficienza computazionale.

Autonomia di giudizio (making judgements): Lo studente acquisirà la capacità di valutare criticamente le diverse strategie di parallelizzazione e ottimizzazione disponibili per un dato problema computazionale, scegliendo autonomamente l'approccio più adeguato in funzione dell'architettura target, dei vincoli prestazionali e delle caratteristiche dell'applicazione.

Abilità comunicative (communication skills): Lo studente sarà in grado di descrivere e argomentare, con proprietà di linguaggio tecnico, le scelte progettuali adottate nella parallelizzazione e ottimizzazione di un'applicazione, presentando i risultati delle analisi prestazionali in modo chiaro e strutturato anche a interlocutori con competenze diverse.

Capacità di apprendimento (learning skills): Lo studente svilupperà l'autonomia necessaria per approfondire in modo continuativo le tecniche di programmazione e ottimizzazione per sistemi HPC, restando aggiornato rispetto all'evoluzione delle architetture di calcolo, degli standard di programmazione parallela e degli strumenti di analisi delle prestazioni.

Modalità di svolgimento dell'insegnamento

L'insegnamento si svolge attraverso lezioni frontali e attività di laboratorio. Le lezioni introdurranno i concetti teorici relativi alle tecniche avanzate di programmazione e ottimizzazione per sistemi HPC, mentre il laboratorio ne permetterà l'applicazione pratica tramite esercitazioni e casi di studio su cluster di calcolo ad alte prestazioni.

Qualora l'insegnamento venisse impartito in modalità mista o a distanza potranno essere introdotte le necessarie variazioni rispetto a quanto dichiarato in precedenza, al fine di rispettare il programma previsto e riportato nel syllabus.

Prerequisiti richiesti

Conoscenza dei concetti fondamentali della programmazione parallela e delle architetture di calcolo ad alte prestazioni, dei modelli di programmazione su memoria condivisa e su memoria distribuita, incluse le direttive per il parallelismo strutturato e le primitive di base per la comunicazione tra processi, nonché una solida padronanza dei linguaggi C e/o C++.

Frequenza lezioni

Per una comprensione approfondita degli argomenti trattati e delle metodologie presentate, si raccomanda vivamente la regolare partecipazione alle lezioni.

Contenuti del corso

Il corso Programmazione e Ottimizzazione HPC approfondisce, in continuità con le conoscenze di base sulla programmazione parallela, le tecniche avanzate per lo sviluppo e l'ottimizzazione di applicazioni destinate a sistemi di calcolo ad alte prestazioni a memoria condivisa e distribuita. Vengono trattati in maniera approfondita i costrutti avanzati degli standard OpenMP e MPI, con particolare attenzione al task parallelism, alla vettorizzazione, alla gestione dell'affinità dei thread su architetture NUMA, alle comunicazioni non bloccanti e one-sided, ai tipi di dati derivati e all'I/O parallelo, nonché ai modelli di programmazione ibrida che combinano memoria condivisa e distribuita. Ampio spazio è dedicato alle metodologie e agli strumenti per l'analisi delle prestazioni, il profiling e il debugging di applicazioni parallele, con l'obiettivo di sviluppare la capacità di identificare colli di bottiglia computazionali e applicare strategie di ottimizzazione mirate, quali il miglioramento dei pattern di comunicazione, il load balancing dinamico e l'ottimizzazione della gerarchia di memoria, valutando scalabilità ed efficienza su architetture HPC reali. Le attività di laboratorio consentono di sperimentare direttamente le tecniche presentate su casi di studio rappresentativi e su cluster di calcolo ad alte prestazioni.

Testi di riferimento

[1] Hager, Georg, and Gerhard Wellein. Introduction to High Performance Computing for Scientists and Engineers. CRC Press, 2010.

[2] Multi-platform Shared-memory Parallel Programming in C/C++ and Fortran - https://www.openmp.org/

[3] Message Passing Interface Forum. MPI: A Message-Passing Interface Standard - https://www.mpi-forum.org/

[4] Pacheco, Peter S., and Matthew Malensek. An Introduction to Parallel Programming, 2nd Edition. Morgan Kaufmann, 2021.

[5] Dispense e materiale didattico forniti dal docente, distribuiti tramite la piattaforma Studium.

Programmazione del corso

 ArgomentiRiferimenti testi
1Richiami sui modelli di programmazione parallela e sulle architetture di calcolo ad alte prestazioni.
2Metodologie di analisi delle prestazioni: roofline model e leggi di scalabilità (Amdahl, Gustafson).
3Strumenti di profiling e analisi delle prestazioni (perf, Intel VTune, Score-P)
4Tecniche di vettorizzazione e programmazione SIMD.
5OpenMP avanzato: task parallelism e gestione delle dipendenze tra task.
6OpenMP avanzato: direttive SIMD e vettorizzazione esplicita.
7OpenMP avanzato: affinità dei thread e gestione di sistemi NUMA.
8OpenMP avanzato: sincronizzazione avanzata e gestione delle race condition.
9Ottimizzazione di applicazioni a memoria condivisa: casi di studio.
10MPI avanzato: comunicazioni non bloccanti e overlapping tra calcolo e comunicazione.
11MPI avanzato: tipi di dati derivati.
12MPI avanzato: comunicazioni collettive avanzate e loro ottimizzazione.
13MPI avanzato: comunicazioni one-sided (Remote Memory Access).
14MPI avanzato: I/O parallelo.
15MPI avanzato: topologie di comunicazione e gestione dei gruppi di processi.
16Programmazione ibrida MPI+OpenMP: strategie di progettazione.
17Programmazione ibrida MPI+OpenMP: livelli di thread safety e loro gestione.
18Programmazione ibrida MPI+OpenMP: mapping dei processi e dei thread sull'architettura.
19Load balancing dinamico in applicazioni parallele.
20Ottimizzazione dei pattern di comunicazione in applicazioni a memoria distribuita.
21Debugging di applicazioni parallele.
22Scalabilità e benchmarking di applicazioni HPC.
23Gestione di job e scheduling su cluster HPC (SLURM).
24Casi di studio: parallelizzazione e ottimizzazione di applicazioni scientifiche.
25Tendenze e prospettive future nel calcolo ad alte prestazioni.

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

La prova di esame del corso è suddivisa in due parti: una prima prova scritta, incentrata sui fondamenti teorici e sulle tecniche avanzate di programmazione e ottimizzazione presentate a lezione, e la successiva valutazione di un progetto individuale, riguardante la progettazione, implementazione e ottimizzazione di un'applicazione parallela.

Tali prove potranno avere luogo per via telematica, qualora le condizioni lo dovessero richiedere. La prova orale potrà svolgersi il giorno stesso in cui è stata svolta la prova scritta o a distanza di pochi giorni da esso.

La prova d'esame è finalizzata a valutare in modo approfondito la preparazione dello studente, la capacità di analisi e di ragionamento sugli argomenti trattati durante il corso, nonché l'adeguatezza del linguaggio tecnico utilizzato.

La valutazione del progetto ha valore integrativo rispetto alla prova scritta e concorre alla determinazione del voto finale in modo inscindibile. Essa non rappresenta un'opportunità di incremento del punteggio, ma un completamento necessario per la valutazione complessiva della preparazione dello studente.

Per l'attribuzione del voto finale si seguiranno di norma i seguenti criteri:

●      non approvato: lo studente non ha acquisito i concetti di base e non è in grado di svolgere gli esercizi.

●      18-23: lo studente dimostra una padronanza minima dei concetti di base, le sue capacità di esposizione e di collegamento dei contenuti sono modeste, riesce a risolvere semplici esercizi.

●      24-27: lo studente dimostra una buona padronanza dei contenuti del corso, le sue capacità di esposizione e di collegamento dei contenuti sono buone, risolve gli esercizi con pochi errori.

●      28-30 e lode: lo studente ha acquisito tutti i contenuti del corso ed è in grado di esporli compiutamente e di collegarli con spirito critico; risolve gli esercizi in modo completo e senza errori.

Gli studenti con disabilità e/o DSA dovranno contattare con sufficiente anticipo rispetto alla data dell'esame il docente, il referente CInAP del DMI (prof.ssa Daniele) e il CInAP per comunicare che intendono sostenere l'esame fruendo delle opportune misure compensative.

Per partecipare all'esame finale è necessario avere effettuato la prenotazione sul portale SmartEdu. Per eventuali problemi tecnici relativi alla prenotazione occorre rivolgersi alla Segreteria didattica.

Esempi di domande e/o esercizi frequenti

  • Descrivi le principali strategie per implementare il task parallelism in OpenMP e discuti come vengono gestite le dipendenze tra task.
  • Quali sono i vantaggi delle comunicazioni non bloccanti in MPI rispetto a quelle bloccanti, e in quali scenari è opportuno utilizzarle?
  • Spiega il concetto di comunicazione one-sided in MPI e confrontalo con il modello di comunicazione point-to-point tradizionale.
  • Come si affronta il problema del load balancing dinamico in un'applicazione parallela ibrida MPI+OpenMP?
  • Illustra il roofline model e spiega come può essere utilizzato per guidare le scelte di ottimizzazione di un'applicazione.
  • Quali sono le principali criticità nella gestione dell'affinità dei thread su architetture NUMA e come possono essere affrontate in OpenMP?

Si precisa che tali domande hanno carattere puramente indicativo: le domande effettivamente proposte in sede d'esame potranno divergere, anche in modo significativo, da quelle riportate in questa lista.

Durante le lezioni verranno svolti degli esercizi simili a quelli che gli studenti dovranno affrontare nel loro esame finale. Ulteriori esercizi verranno resi disponibili nel corso delle lezioni.