Docente: Irene Finocchi![]() Ricevimento: mercoledì 9:30-10:30 (oppure in altri giorni/orari da concordare via e-mail) durante il corso; per appuntamento al termine del corso. Ufficio: Dipartimento di Scienze Statistiche, Città Universitaria, quarto piano, stanza 21. Tel: 06-49910384. E-mail: irene.finocchi AT uniroma1.it
|
|||||||||
Orario delle lezioni
|
<!--
Martedì 25 settembre 2018 - Speedup ed efficienza. Limiti teorici e pratici del parallelismo: legge di Amdahl, legge di Gustafson, overhead di comunicazione e sincronizzazione.
Esercizi di riepilogo (A) Prova intermedia del 3 novembre 2015. Traccia A: domanda 1, domanda 2 punti 1 e 2. Traccia B: domanda 2 punto 1 Appello gennaio 2016. Domanda 1 punti a) e c) Appello febbraio 2016. Domanda 1 Prova intermedia novembre 2016. Domanda 1, parte A
Lunedì 1 ottobre 2018 - Sistemi paralleli: tassonomia di Flynn, modello di comunicazione (sistemi distribuiti o a memoria condivisa, NUMA vs UMA). Parallelizzazione automatica: storie di successo (vettorizzazione), difficoltà, data dependency. Modelli di programmazione: memoria condivisa con thread espliciti. Java.lang.Thread: nozioni fondamentali, parallel hello world.
Martedì 2 ottobre 2018 - Cenni ad altri modelli di programmazione: scambio di messaggi, dataflow e data parallelism (vedere slide del 1 ottobre). Parallelismo fork/join in Java. Un primo esempio: somma degli elementi in un array. Esperimenti al calcolatore. 1) Alcuni problemi pratici: come aumentare la dimensione dell'heap, perché iterare un esperimento, come misurare i tempi di esecuzione real, user e system con il comando time. 2) Un primo esperimento: cosa accade all'aumentare del numero dei thread? Analisi dello speedup ottenuto in pratica: perché all'aumentare del numero di thread i tempi di esecuzione non diminuiscono considerevolmente (anzi, se aumentiamo di molto i thread potrebbero anche aumentare)? Memory bottleneck. 3) Un secondo esperimento: computazioni memory- o CPU-bounded, differenze ottenute in termini di speedup (nel codice per la somma degli elementi di un array, decommentate la linea ans += (long)... nel metodo run).
Lunedì 8 ottobre 2018 - Scelta del numero di thread: portabilità del codice, thread vs processori: è una buona idea usare tanti thread quanti sono i processori disponibili all'inizio dell'esecuzione? Load balancing. Una diversa soluzione: divide-and-conquer parallelism. Implementazione ricorsiva della somma in un array tramite fork di un nuovo thread per ciascuna chiamata ricorsiva. Quanti thread nell'implementazione ricorsiva? Un semplice conteggio su alberi binari. Due importanti ottimizzazioni: cutoff sequenziale e dimezzamento del numero di thread.
<!-- <font color="#AF0F0F"> Martedì 9 ottobre 2018 </font> - -->
Martedì 16 ottobre 2018 - Analisi di algoritmi paralleli: il DAG di esecuzione, work e span, ovvero T1 (numero di nodi) e T∞ (lunghezza del cammino critico). Generalizzazione delle analisi ad un numero arbitrario P di processori. Lower bound: TP ≥ max{T1/P, T∞}. Come ottenere un'esecuzione che richiede tempo O(T1/P+T∞): l'importanza dello scheduling, gli scheduler greedy funzionano bene! Analisi 2-approssimazione, cenni al work stealing.
Esercizi di riepilogo (B) Prova intermedia del 3 novembre 2015. Traccia A: domanda 3, domanda 2 punto 3. Traccia B: domanda 1, domanda 2 punto 2, domanda 3 Appello gennaio 2016. Domanda 1 punto b), domanda 2 Appello febbraio 2016. Domanda 2 Prova intermedia novembre 2016. Domanda 1, parte B, domanda 2, domanda 4
Lunedì 22 ottobre 2018 - Somme prefisse: definizione del problema, work e span dell'algoritmo sequenziale, due algoritmi paralleli con span O(log n). Un'applicazione delle somme prefisse: array packing. Un'applicazione del packing: partitioning. Un'applicazione del partitioning: parallel quicksort. Analisi del quicksort nel caso migliore, equazioni di ricorrenza per work e span.
Martedì 23 ottobre 2018 - Calcolo della più lunga sottosequenza iniziale di 1 in un array di bit (esercizio): soluzione basata su ForkJoin esplicito, soluzione basata sul calcolo del minimo, tecnica delle coppie. Parallel mergesort. Analisi della parallelizzazione naive (con merge sequenziale). Fusione (ricorsiva) di due array in parallelo: analisi di work e span dell'algoritmo merge. Integrazione nel mergesort ed analisi.
Esercizi di riepilogo (C) Prova intermedia del 3 novembre 2015. Traccia A: domanda 4. Traccia B: domanda 4. Appello gennaio 2016. Domanda 3. Appello febbraio 2016. Domanda 3. Prova intermedia novembre 2016. Domanda 3. Appello 28 giugno 2017. Tutta la parte 1. Appello 10 gennaio 2017. Tutta la parte 1.
Lunedì 29 ottobre 2018 - sospensione attività didattica causa maltempo
Martedì 6 novembre 2018 - Svolgimento di esercizi di preparazione all'esonero.
Lunedì 19 novembre 2018 - Concorrenza in Java: la keyword synchronized. Race condition: bad interleaving vs. data race. Metodi reader e metodi writer, possibili interleaving tra le istruzioni (quali istruzioni? A che livello di astrazione? Il ruolo del compilatore), uso di synchronized, stati intermedi inconsistenti. La keyword volatile: quando è corretto usarla? Una distinzione fondamentale: memoria thread-local, immutable e synchronized.
Martedì 20 novembre 2018 - Linee guida per usare i lock correttamente. Locking consistente, granularità dei lock (fine vs coarse grained locking), granularità della sezione critica e il problema A-B-A. Deadlock: tecniche di deadlock avoidance (acquisizione ordinata dei lock). Lock in pratica: un esempio basato su liste concorrenti. Coarse-grained locking. Fine-grained hand-over-hand locking: perchè serve prendere il lock su elementi consecutivi della lista, esempio relativo alla rimozione di un nodo della lista.
Lunedì 26 novembre 2018 - lezione annullata
Lunedì 3 dicembre 2018 - Heterogeneous computing: CPU vs GPU, genesi di OpenCL. Architettura di una GPU, platform model, execution model e memory model in OpenCL. Concetti fondamentali: host, compute device, compute unit, processing element, contesto, programma, kernel, work item, work group, coda dei comandi, tipi di memoria (host, private, local, global). API OpenCL: ottenere informazioni sui dispositivi, creazione del contesto e della coda dei comandi.
Martedì 4 dicembre 2018 - Ancora API OpenCL: memory objects, program objects, kernel objects, gestione delle code dei comandi. Un primo esempio, con discussione dettagliata del codice host: OpenCL Hello World. Discussione dettagliata del layout di memoria: quali dati risiedono in memoria host, globale, privata? Task parallelism e data parallelism in OpenCL: le funzioni clEnqueueTask e clEnqueueNDRangeKernel.
Lunedì 10 dicembre 2018 - Data parallelism: global e local size, work group ids. Esempi al calcolatore. 1) Calcolo parallelo dei quadrati dei valori contenuti in un array (square). Parallelismo su dati di input ad una dimensione: numero di work items e dimensione dei work group. 2) Moltiplicazione di matrici (quadrate) come esempio di parallelismo su dati di input a due dimensioni. Implementazione naive in cui ciascun work item calcola uno degli n2 elementi di output come prodotto scalare di una riga e una colonna delle matrici di input.
Martedì 11 dicembre 2018 - La tecnica del blocking: moltiplicare due matrici tramite molteplici moltiplicazioni di matrici più piccole (blocchi). Implementazione basata su blocking tramite uso di memoria locale e barriere. Confronto prestazionale sul calcolatore.
Lunedì 17 dicembre 2018 - didattica sospesa per IT meeting. Sono disponibile dalle 9:00 alle 11:00 nel mio studio in Via Salaria per chiarimenti su esercizi ed esoneri.
L'homework richiede di implementare ed analizzare sperimentalmente un software parallelo e può essere svolto in gruppi costituiti da al più 3 persone.
![]() |
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica ![]() |
|
![]() |
![]() |