Introduction to parallel programming

Informazioni generali sull'insegnamento

Nome dell'insegnamento: Introduction to parallel programming
Docente: Paolo Burgio
Corso di Studio: Scuola di Dottorato
Periodo Didattico: Primo Ciclo Semestrale

Obiettivi dell'insegnamento

    Negli ultimi vent'anni si è assistito a una vera e propria rivoluzione nel modo di costruire computer. Ad oggi, l'unico modo per continuare a sfruttare la legge di Moore e aumentare le performance di un sistema è quello di aumentare il numero di unità computazionali dell'hardware. I multi- e many-core moderni tuttavia, necessitano di particolare attenzione da parte del programamtore, che deve essere in grado orchestrare la concorrenza fra i thread disponibili, suddividere efficacemente il lavoro, e progettare la comunicazione in modo da evitare dei colli di bottiglia che vanificherebbero tutto il potenziale speedup ottenibile.

    • Nella prima parte del corso, verranno illustrate le principali architetture parallele presenti e future, con i rispettivi pro e contro;
    • Nella seconda parte, si mostreranno i principali linguaggi di programmazione, pattern e framework usati nel processo di sviluppo di software parallelo, ad oggi e nel prossimo futuro
    • Infine, si spenderanno alcune parole come i sistemi paralleli (basati su GPU, ma non solo) vengano usati nei sistemi di Machine Learning attuali, e come apriranno le porte a Internet 5.0

    Il corso è aperto a chiunque sia interessato a sapere "dove" l'informatica sta andando; per questa ragione sarà fruibile anche da chi non ha esperienza con la programmazione. Una conoscenza di base dei linguaggi con interfacce funzionali (es. C, C++, Java o C#) sarà sicuramente d'aiuto, ma in generale sarà possibile seguirlo anche se se ne è a digiuno. In ogni caso, durante le prime lezioni verranno fornite le poche nozioni di base necessarie

Programma dell'insegnamento

  • Architetture parallele e progettazione di codice parallelo
    • Cache e protocolli di coerenza
    • Sistemi a memoria distribuita o condivisa
    • Architetture omogenee vs. eterogenee
    • Protocolli di sincronizzazione
    • Modelli di parallelismo
    • Programmazione concorrente
    • Design patterns paralleli
    • Analisi e profiling del software
  • Linguaggi di programmazione parallela
    • Programmazione su sistemi distribuiti in MPI
    • Programmazione su sistemi a memoria condivisa in OpenMP
    • Programmazione su GPUs e sistemi eterogenei: CUDA/OpenCL

Orario

Date e orari delle lezioni

  • Giovedì 12 aprile 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 19 aprile 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 26 aprile 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 4 maggio 2018, ore 16-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 10 maggio 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 17 maggio 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 24 maggio 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)
  • Giovedì 31 maggio 2018, ore 15-18, Lab Zironi (Via Campi - Matematica)

Orario di ricevimento

Materiale didattico

Testi di riferimento

  • A. Grama, G. Karypis, V. Kumar, A. Gupta: An introduction to Parallel Computing, Addison-Wesley, 2003
  • M. Quinn: Parallel Programming in C with MPI and OpenMP, McGraw-Hill, 2004
  • D.B. Kirk, W.W. Hwu: Programming Massively Parallel Processors: A Hands-on Approach Morgan-Kaufmann, 2012
  • T.G. Mattson, B.A. Sanders, B.L. Massingill, Patterns for Parallel Programming, Addison-Wesley, 2005

Lucidi delle lezioni

Esercitazioni e Codice

  • #usefultools - Bash for Windows: cygwin - link | native bash - link
  • PI computation with Montecarlo method - slides - code