Primo modulo (SC1)
1. Nozioni di base sui sistemi di calcolo a singolo nodo e sulla loro gestione:
- Descrizione schematica delle componenti fondamentali di una moderna CPU (es. Intel Core i7), discutendo ad alto livello le varie unità presenti (core, controllo, ALU, cache L1 ed L2, ecc.), bus (es. PCI), gerarchie di memoria.
- Sistema operativo come gestore di risorse: CPU, memoria, I/O, ecc. Nozioni di multiprogrammazione, time-sharing, processo, thread, condivisione di risorse, sincronizzazione, protezione.
- Layout di memoria di un processo Linux e relazione con le unità di un programma C (variabili locali, globali, oggetti allocati dinamicamente, e codice)
- Concetto di Application Programming Interface (API) come astrazione di servizi che un sistema di calcolo fornisce a un'applicazione. Esempi: POSIX (panoramica delle funzionalità offerte).
- Allocazione dinamica delle memoria: funzionamento dell'allocatore di memoria malloc/free.
- Gestione di I/O e interrupt dal punto di vista del programmatore: trattazione introduttiva, non approfondita nei dettagli e nei casi di studio, volta a comprendere il meccanismo con cui vengono gestiti gli eventi asincroni nei sistemi di calcolo a singolo nodo. Segnali in UNIX. Esempio di gestione mediante la funzione di libreria signal.
2. Application Binary Interface:
- Application binary interface (ABI) e Instruction Set Architecture (ISA) come esempio di astrazione per il programmatore. Panoramica della ISA IA32.
- Modi di indirizzamento usando come caso di studio la ISA IA32 (sintassi AT&T)
- Istruzioni più comuni del set IA32 (sintassi AT&T). Escluso l'I/O.
- Calling convention x86: stack frame, passaggio dei parametri, prologo, epilogo, valore di ritorno di una funzione, registri caller-save e callee-save.
- Traduzione strutture di controllo condizionali e iterative, espressioni e assegnamenti, funzioni e chiamate a funzione C in assembly x86
- Comprensione di programmi scritti in assembly x86. Tool objdump e traduzione di codice C in codice assembly mediante gcc.
- Rappresentazione in memoria di oggetti di tipo struct in C, considerando aspetti come allineamento e padding.
- Cenni ai formati delle istruzioni macchina, volta a comprendere l'output di programmi come objdump
- Cenni al pipelining per comprendere gli aspetti prestazionali dovuti agli stalli o allo svuotamento della pipeline (es. per accessi a memoria o branch misprediction).
3. Analisi delle prestazioni:
- Scala degli eventi di un sistema di calcolo e tempi di latenza tipici delle operazioni
- Trattazione del CPI (clocks per instruction) e dell'IPC (instructions per cycle), con esempi basati sul tool di profiling perf con lo scopo è comprendere se un programma sta utilizzando in modo efficiente le risorse di calcolo.
- Performance counter hardware (tool perf) e tool/chiamate a sistema per la misurazione del tempo (time, gettimeofday, ecc.), profiler gprof.
- Legge di Amdahl nel calcolo sequenziale: l'obiettivo è comprendere l'effetto che l'ottimizzazione di una singola porzione di codice ha sulle prestazioni dell'intero programma.
- Introduzione diverse metriche di costo come tempo, spazio, energia consumata
- Metodi per l'analisi delle prestazioni dei programmi e scelta dei workload rappresentativi
4. Introduzione alle programmazione concorrente e parallela:
- Definizione dei vari modelli di macchina (SIMD, MIMD, ecc.) secondo la tassonomia di Flynn
- Programmazione concorrente e parallela usando pthread
- Legge di Amdahl nel calcolo parallelo, speedup
- Errori connessi con la programmazione concorrente: race condition, deadlock, starvation. Uso del tool helgrind per il race detection.
Secondo modulo (SC2)
TBA