Abstract
Il corso, organizzato dall’Istituto nazionale di Astrofisica in collaborazione con il Centro Nazionale ICSC, si svolgerà dal 12 ottobre 2026 al 9 aprile 2027 presso l’Università dell’Insubria, Chiostro di Sant’Abbondio in Via Sant’Abbondio 12, Como (Moduli A e B) e l’Area tecnologia CNR di Bologna in Via Gobetti 101 (Modulo C).
Dettagli del corso
Pensato per:
- Studenti undergraduate e graduate che vogliono acquisire competenze di calcolo parallelo non coperte dai curricula standard;
- Dottorandi e post-doc in fase iniziale di carriera nelle scienze computazionali (fisica, astrofisica, scienza dei materiali, ingegneria, life sciences, data science), che hanno bisogno di portare i propri codici su sistemi HPC;
- Professionisti già affermati (ricercatori, ingegneri, Research Software Engineer) che vogliono approfondire o aggiornare le proprie competenze in HPC e programmazione parallela.
Il corso fornisce una competenza completa e operativa nel calcolo ad alte prestazioni e nella programmazione parallela, dal funzionamento delle architetture di calcolo moderne fino allo sviluppo, all’ottimizzazione, al debugging e al profiling di codice parallelo su sistemi multi-core, multi-nodo e accelerati da GPU.
Moduli Didattici e Programma
MODULO A — Architetture moderne, codice seriale e memoria condivisa (dal 19 al 23 ottobre – 40h)
Contenuti didattici
- Architetture moderne (CPU): gerarchia di memoria e cache, branching e branch prediction, instruction-level parallelism — esecuzione out-of-order, super-scalarità, pipelining.
- Ottimizzazione del codice seriale: scrittura di codice efficiente su CPU moderne; vettorizzazione/SIMD (report del compilatore, dipendenze nei loop, gather/scatter, masking, allineamento); località dei dati e ottimizzazione della cache.
- Architettura del nodo e NUMA: organizzazione del singolo nodo, effetti NUMA su accesso e allocazione della memoria.
- Multithreading con OpenMP: dalle basi (parallel regions, work-sharing, scheduling) al task parallelism; OpenMP memory model e sincronizzazione tra thread (barriere, critical/atomic, flush).
- Debugging & Profiling I (seriale): flag sanitizer di gcc, gdb, profiling basato su PMU (perf, PAPI), valgrind.
MODULO B – Memoria distribuita (MPI) e architetture dei cluster di calcolo (dal 30 novembre al 4 dicembre – 40h)
Contenuti didattici
- Architetture dei cluster: interconnessioni ad alte prestazioni (InfiniBand, Omni-Path, Ethernet HPC), topologie di rete (fat-tree, dragonfly, torus), modello a memoria distribuita e gerarchia nodo/rack/cluster con implicazioni sulla località delle comunicazioni.
- MPI – base: modello a processi e comunicatori; comunicazioni point-to-point bloccanti; comunicazioni collettive (broadcast, scatter/gather, reduce); comunicazioni non-blocking; derived datatypes.
- MPI – intermedio: gestione avanzata di comunicatori e gruppi; sovrapposizione calcolo-comunicazione con pattern non bloccanti in casi reali; topologie virtuali (cartesiane e a grafo) e mapping dei processi.
- MPI – avanzato: comunicazioni collettive non bloccanti e persistenti; one-sided communication (RMA, put/get) e relativi modelli di sincronizzazione; MPI-IO e I/O parallelo su file system distribuiti; pattern di comunicazione complessi per applicazioni a larga scala; cenni al modello ibrido MPI+OpenMP.
- Debugging & Profiling II (parallelo): gdb con processi MPI e thread (the hard way); strumentazione e tracing con lo stack Score-P (ed Extrae); analisi di scalabilità e individuazione dei colli di bottiglia di comunicazione.
- Containerizzazione per HPC: uso di container con Apptainer/Singularity; esecuzione di applicazioni MPI e GPU-aware all’interno dei container; riproducibilità, portabilità e preservazione del codice e dell’esperimento.
MODULO C – GPU, algoritmi e deployment (dal 5 al 9 aprile 2027 – 40h)
Contenuti didattici
- GPU I: architettura GPU e confronto con la CPU (lato HW e SW); modello di programmazione; CUDA di base; offloading direttivo (OpenMP/OpenACC); memory model – coalescing, shared memory, latency hiding.
- GPU II (avanzata e distribuita): esecuzione asincrona e programmazione multi-stream; programmazione multi-GPU; HIP e performance portability; introduzione alle GPU AMD e differenze con NVIDIA; nuove architetture (riduzione FP32/FP64, crescita FP16/FP8, mixed-precision); memoria distribuita su GPU – GPU-aware MPI, NCCL/RCCL, NVSHMEM; approccio ibrido MPI+GPU su cluster multi-nodo.
- Profiling su larga scala: NVIDIA Nsight family (Systems e Compute), compute-sanitizer; profiling di applicazioni massicciamente parallele e analisi delle prestazioni alla scala di produzione.
Competenze in uscita
MODULO A
Il partecipante saprà analizzare e ottimizzare codice seriale guidato da misure, e sa scrivere codice OpenMP corretto ed efficiente su architetture NUMA.
MODULO B
Il partecipante saprà parallelizzare un’applicazione su più nodi con MPI e sa progettare e ottimizzare applicazioni parallele complete su sistemi HPC eterogenei e su larga scala, scegliendo pattern algoritmici e di comunicazione adeguati, e sa renderne riproducibile l’esecuzione. Inoltre sa profilare e debuggare i propri codici su piattaforme parallele.
MODULO C
Il partecipante saprà scrivere e ottimizzare kernel di base e portarli su GPU ottimizzandone gli accessi in memoria, misurandone le prestazioni con strumenti di profiling avanzato. Sa utilizzare cluster multi nodo e multi GPU programmando i propri codici in modo da utilizzare un approccio misto MPI+GPU
Presequisiti
Prerequisiti generali (tutti i moduli)
- Familiarità con l’ambiente Linux e l’uso della riga di comando (shell, editor, compilazione, gestione dei file).
- Familiarità con il linguaggio C/C++ (compilazione, puntatori, gestione della memoria, strutture dati di base).
- È utile, ma non indispensabile, una conoscenza di base di analisi numerica e algebra lineare.
Prerequisiti per-modulo (per chi si iscrive ai singoli moduli)
- Modulo A: solo i prerequisiti generali.
- Modulo B: contenuti del Modulo A o competenze equivalenti (paradigma a memoria condivisa, nozioni di architettura del nodo).
- Modulo C: contenuti dei Moduli A e B o competenze equivalenti (MPI di base/intermedio e programmazione GPU di base).
Profili docenti
Il corso è tenuto da un team di docenti con esperienza diretta di ricerca e sviluppo in ambito HPC e calcolo scientifico, attivi nello sviluppo e nell’ottimizzazione di codici di simulazione su sistemi di classe pre-exascale ed exascale.
- Valentina Cesare — Tecnologo presso INAF Catania, Expertise: GPU
- David Goz — Ricercatore presso INAF Trieste, Expertise: OpenMP/MPI/GPU, memory model, profiling
- Giovanni Lacopo — Ricercatore Tecnologo presso INAF Trieste, Expertise: MPI, GPU AMD, nuove architetture, comunicazione distribuita su GPU
- Antonio Ragagnin — Ricercatore presso INAF Trieste, Expertise: OpenMP/MPI/GPU/algoritmi
- Giuliano Taffoni — Developement Scientist presso INAF Trieste, Expertise: OpenMP, GPU offloading, containerizzazione
- Luca Tornatore — Astrofisico ed esperto di HPC presso INAF (Trieste); Expertise: architetture, MPI, profiling, algoritmi
Modalità didattiche
Formazione in presenza, con forte componente pratica su risorse HPC reali. Ogni giornata alterna lezione frontale e hands-on (4+4 ore).
Cerificazione
Al termine di ciascun modulo viene rilasciato un attestato di frequenza del singolo modulo.
Registrazione
I posti disponibili sono 40 e l’ammissione in aula avverrà secondo l’ordine di registrazione. Qualora il numero di iscrizioni superi i posti disponibili, alla chiusura delle registrazioni avranno priorità dottorandi/e e giovani ricercatori/trici, sempre nel rispetto dell’ordine temporale di iscrizione
La fee di iscrizione è di 100€ a persona per ogni modulo, i tre moduli sono pensati per essere fruibili anche separatamente. La quota di partecipazione non comprende le spese di viaggio e di alloggio, che restano interamente a carico dei partecipanti. Sono invece inclusi nella quota il pranzo e i coffee break previsti durante tutte le giornate di lezione.