Principi della Programmazione Parallela

Anno accademico 2025/2026 - Docente: FABIO ROBERTO VITELLO

Risultati di apprendimento attesi

Conoscenza e capacità di comprensione (knowledge and understanding):

Lo studente acquisirà le conoscenze fondamentali relative alle metodologie per la progettazione di algoritmi paralleli e per l’utilizzo delle architetture di calcolo ad alte prestazioni (HPC). In particolare, saranno approfonditi i concetti alla base della parallelizzazione di un codice, i principali paradigmi di programmazione parallela e le relative implicazioni architetturali. Verranno inoltre fornite le competenze teoriche necessarie alla comprensione delle tecniche per la programmazione su memoria condivisa e distribuita, utilizzando linguaggi e modelli di programmazione dedicati come OpenMP e MPI.


Capacità di applicare conoscenza e comprensione (applying knowledge and understanding):

Saranno acquisite le capacità di risolvere semplici problemi che richiedono la progettazione e l'analisi di soluzioni algoritmiche nel campo della programmazione parallela.


Autonomia di giudizio (making judgements):

Lo studente sarà in grado di applicare le conoscenze acquisite per risolvere problemi computazionali che richiedono la progettazione, l’implementazione e la valutazione di soluzioni algoritmiche in ambito parallelo. Sarà in grado di sviluppare semplici applicazioni parallele mediante l’utilizzo di paradigmi e modelli di programmazione specifici, identificando le scelte architetturali più appropriate in base al contesto (memoria condivisa o distribuita) e valutandone le prestazioni.


Abilità comunicative (communication skills): 

Lo studente acquisirà adeguate abilità comunicative e proprietà di linguaggio per descrivere in modo chiaro e coerente problematiche legate alla progettazione e all’analisi di algoritmi paralleli. Sarà in grado di presentare le principali soluzioni tecniche e concettuali relative alla programmazione parallela anche a interlocutori non specialisti, utilizzando un registro comunicativo adeguato al contesto.


Capacità di apprendimento (learning skills):

Lo studente svilupperà la capacità di aggiornare e ampliare in autonomia le conoscenze acquisite, anche in relazione a nuovi contesti applicativi o tecnologici nel campo della programmazione parallela. Sarà in grado di consultare e comprendere in modo critico la letteratura scientifica e tecnica di riferimento, mantenendo un approccio flessibile e consapevole all’evoluzione delle metodologie e dei paradigmi del settore.

Modalità di svolgimento dell'insegnamento

Le lezioni si svolgeranno in presenza, con modalità frontale. È prevista l’esposizione dei contenuti teorici da parte del docente, con il supporto di slide e lavagna. La partecipazione attiva degli studenti sarà incoraggiata attraverso domande e momenti di discussione in aula.


L’insegnamento si svolgerà  anche attraverso  attività di laboratorio. Le lezioni introdurranno i concetti teorici, mentre il laboratorio ne permetterà l’applicazione pratica tramite esercitazioni e casi studio.

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 di base di architettura degli elaboratori, sistemi operativi, algoritmi, conoscenza di base del C e/o del C++.

Frequenza lezioni

La frequenza ai corsi non è obbligatoria ma è fortemente consigliata.

Contenuti del corso

Il corso Principi della Programmazione Parallela fornisce un’introduzione strutturata alle principali metodologie per la progettazione e l’implementazione di algoritmi paralleli, con un’impostazione orientata all’informatica e alla programmazione. È pensato per studenti che abbiano già una conoscenza di base della programmazione e dei principi dell’architettura degli elaboratori. Il percorso formativo approfondisce i concetti fondamentali del calcolo ad alte prestazioni (HPC), illustrando le strategie per ottimizzare l’esecuzione di codice su architetture moderne.

Particolare attenzione viene riservata all’analisi di modelli di parallelismo, all’identificazione dei colli di bottiglia computazionali e all’applicazione delle tecniche di programmazione su memoria condivisa e distribuita. Gli studenti imparano a sviluppare programmi paralleli utilizzando gli standard OpenMP e MPI, e a valutare le prestazioni su sistemi reali. L’approccio bilancia aspetti teorici e sperimentazione pratica, mantenendo accessibili i riferimenti formali e valorizzando l’intuizione algoritmica.


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] OpenMPI implementation of the Message passing interface - https://www.open-mpi.org/

Programmazione del corso

 ArgomentiRiferimenti testi
1Introduzione al calcolo ad alte prestazioni (HPC)Dispense del docente
2Architetture moderne per il calcolo parallelo moderni processori e architetture HPCCap. 1 + 4 di [1]
3Il software stack nei sistemi HPCCap. 4 di [1] / dispense del docente
4Modelli di parallelismo e scalabilitàCap 5 di [1]
5Ottimizzazione del codice: introduzione e concetti baseCap. 2 + 3 di [1]
6Linee guida per l’ottimizzazione e gestione della memoriaCap. 3 di [1]
7Tecniche di compilazione ottimizzata e profilingCap. 2 di [1]
8Programmazione parallela su memoria condivisa: concetti baseCap. 6 di [1]
9OpenMP: direttive per il parallelismo strutturatoCap. 6 di [1] e documentazione di [2]
10OpenMP: sincronizzazione, sezioni e workload balancingCap. 6 di [1] e documentazione di [2]
11OpenMP: variabili condivise e private, schedulingCap. 6 di [1] e documentazione di [2]
12Programmazione parallela su memoria distribuita: concetti baseCap. 9 di [1]
13Introduzione a MPI e modello di comunicazioneCap. 9 di [1] 
14Comunicazione point-to-point in MPICap. 9 di [1] e documentazione di [3]
15Comunicazioni collettive e sincronizzazione in MPICap. 9 di [1] e documentazione di [3]
16Concetti di topologia e comunicazione efficiente in MPICap. 9 di [1] e documentazione di [3]
17Programmazione ibrida con MPI e OpenMP: principiCap. 11 di [1]
18MPI/OpenMP: gestione dei contesti e delle gerarchieDispense del docente

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

La prova di esame del corso è suddivisa in due parti: una prima prova scritta e la successiva valutazione di un progetto.


Tali prove potranno avere luogo per via telematica, qualora le condizioni lo dovessero richiedere. 


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

  1. Qual è la strategia raccomandata per implementare una somma globale su tutti i processi in MPI minimizzando l’overhead di sincronizzazione, e in quali casi sarebbe preferibile una variante non bloccante?
  2. Spiega la differenza tra comunicazione punto-punto bloccante e non bloccante in MPI, e descrivi un pattern comune per evitare deadlock.
  3. Qual è il metodo raccomandato in OpenMP per parallelizzare la somma su un array evitando condizioni di race e minimizzando la contesa?
  4. Nei sistemi di memoria condivisa, qual è la differenza tra UMA e NUMA?

Le domande riportate sopra sono soltanto degli esempi. La prova potrà includere altre domande ed esercizi pratici su altri argomenti del programma.


ENGLISH VERSION