PROGRAMMAZIONE AVANZATA E PARALLELA

[270SM]
a.a. 2025/2026

3° Anno - Secondo Semestre

Frequenza Non obbligatoria

  • 9 CFU
  • 72 ore
  • ITALIANO
  • Sede di Trieste
  • Opzionale
  • Convenzionale
  • Orale
  • SSD ING-INF/05
Curricula: Curr. Didattico
Syllabus

[Knowledge and understanding] Lo studente saprà riconoscere i principali fattori che influenzano le prestazioni sulle architetture dei calcolatori moderne. Lo studente sarà inoltre in grado di comprendere i principi del paradigma di programmazione ad oggetti.
[Applying knowledge and understanding] Lo studente sarà in grado di e scrivere codice e valutarne l’efficienza su architetture moderne. Lo studente sarà inoltre in grado di strutturare programmi complessi seguendo il paradigma ad oggetti.
[Making judgments] Lo studente sarà scegliere tra più approcci in termini di strutturazione del codice, valutando nella scelta sia i vantaggi che gli svantaggi.
[Communication skills] Lo studente sarà in grado di spiegare e motivare le sue scelte implementative in termini di leggibilità, struttura e prestazioni.
[Learning skills] Lo studente sarà in grado di approfondire in autonomia gli argomenti trattati e di mantenersi aggiornato sugli sviluppi in termini di linguaggi di programmazione e di efficienza delle diverse scelte implementative

È necessaria una conoscenza dei linguaggi C e Python, dei concetti di thread e lock, delle strutture dati più comuni (pile, code, alberi binari, tabelle hash) e delle loro implementazioni.
Linguaggio C: funzioni, puntatori, array, allocazione dinamica della memoria, pthread (inclusi lock)
Linguaggio Python: conoscenza di base di un utilizzo non orientato agli oggetti, quindi con solo l’utilizzo di funzioni
Architetture: ciclo di esecuzione delle istruzioni, architettura di Von Neumann e componenti di base di un calcolare elettronico
Algoritmi e strutture dati: strutture dati di base (pile, code, stack, alberi binari, tabelle hash), nozione di complessità di un algoritmo.

Il corso tratterà gli argomenti riguardanti le tecniche di programmazione necessarie per la scrittura di codice ad alte prestazioni e le funzionalità dei linguaggi che permettono di scrivere codice ben strutturato e mantenibile.
In particolare si tratteranno i seguenti argomenti:
Come l’architettura dei calcolatori moderni influenzi le prestazioni, con riferimenti alle nozioni di cache, località di memoria, branch prediction e i loro effetti sulla velocità di esecuzione del codice.
Algoritmi e strutture dati efficienti su architetture moderne e come valutarne le prestazioni
Meccanismi per la programmazione parallela, in particolare OpenMP.
Utilizzo di librerie ad alte prestazioni in Python, in particolare la libreria numpy.
Ripasso del paradigma di programmazione a oggetti in Python. Si vedranno inoltre caratteristiche specifiche del linguaggio come i decoratori.
Cenni di altri paradigmi di programmazione esistenti, e.g., il paradigma funzionale.

Dato l’ampio spettro degli argomenti coperti dal corso, si forniranno indicazioni di seguire singoli capitoli o articoli scientifici, prestando attenzione affinché questi stiano liberamente disponibili per la fruizione da parte degli studenti.

Gerarchie di memoria e funzionamento delle cache dei processori moderni, come esempi di processori esistenti
Concetto di località di memoria e la sua influenza sulle performances
Pipeline e branch prediction. Effetto sulle prestazioni della branch misprediction
Misurazione delle performances dei programmi
Strutture dati e algoritmi che fanno uso dei concetti di località di memoria, con esempi e comparazioni
Parallelismo e performances: OpenMP
Misura delle performance di programmi paralleli multithread
Design di strutture dati e meccanismi di locking
Utilizzo di codice esterno in Python: motivazioni ed esempi di librerie
La libreria numpy in Python
Programmazione ad oggetti in Python (ripasso)
Decoratori in Python
Introduzione ai concetti di programmazione funzionale e la loro applicazione in Python

Il corso consisterà di una parte di lezioni frontali consistente di circa il 50% del monte ore totale. Una componente di circa il 25% sarà utilizzata per implementazione e commento di esempi. La parte rimanente (25%) consisterà di esercizi guidati in aula in cui gli studenti metteranno in pratica quanto appreso nelle lezioni frontali.

Il materiale didattico e altre informazioni verranno rese disponibili tramite il Teams dell’insegnamento

L'esame consisterà in tre parti: un progetto (50% del voto finale), una prova scritta e un esame orale (insieme 50% del voto finale).
1. Il progetto si compone di due parti, che richiedono l'uso sia di C che di Python per implementarle.
2. I requisiti del progetto sono gli stessi per tutti gli studenti.
3. Il progetto deve essere eseguito individualmente. Copiare un progetto o una parte significativa di esso da altri studenti o da altre fonti ha come conseguenza un voto negativo per lo studente.
4. I requisiti del progetto includono le modalità di presentazione del progetto e una scadenza rigorosa per la presentazione.
5. Il voto del progetto è valido per un anno.
6. La prova scritta consiste in domande su tutti gli argomenti del corso.
7. Per accedere alla prova orale è necessario avere una valutazione positiva sia sulla prova scritta che sul progetto.
8. L'esame orale conterrà sia domande sul progetto che su tutti gli argomenti del corso.
Il voto massimo è 30. La lode verrà assegnata agli studenti che dimostreranno una qualità eccezionale sia nel progetto presentato chenell'esame orale.
Per il voto finale vengono valutati:
- Qualità, struttura, chiarezza, efficienza e commenti del codice nel progetto.
- Conoscenza e comprensione dei diversi argomenti studiati durante il corso



icona 9