high performance computing - moreno.marzolla.name · attività didattica presente e passata ... –...
TRANSCRIPT
High Performance High Performance ComputingComputing
Moreno MarzollaDip. di Informatica—Scienza e Ingegneria (DISI)Università di Bologna
http://www.moreno.marzolla.name/
High Performance Computing 2
Copyright © 2013—2018Moreno Marzolla, Università di Bologna, Italyhttp://www.moreno.marzolla.name/teaching/HPC/
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA 4.0). To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
High Performance Computing 3
Credits
● prof. Salvatore Orlando, Univ. Ca' Foscari di Veneziahttp://www.dsi.unive.it/~orlando/
● prof. Mary Hall, University of Utahhttps://www.cs.utah.edu/~mhall/
● Tim Mattson, Intel
High Performance Computing 4
Presentiamoci
● Chi sono– Moreno Marzolla– prof. associato di Informatica @ DISI– http://www.moreno.marzolla.name/
● Attività didattica presente e passata– High Performance Computing @ ISI– Fondamenti di Informatica A @ Ing. Biomedica/Elettronica– In passato: Algoritmi e Strutture Dati; Sistemi Complessi;
Ingegneria del Software● Di cosa mi occupo
– Programmazione parallela– Modellazione e simulazione di sistemi
High Performance Computing 5
High Performance Computing
● Pagina del corso– http://www.moreno.marzolla.name/teaching/HPC/
● Orario– Martedì 9:00—11:00 Lab 3.3– Giovedì 9:00—12:00 Aula 2.4– Fare riferimento alla pagina del corso e al calendario sul sito
del CdS per variazioni dell'orario● Giovedì 27 settembre no lezione; verrà recuperata venerdì 5
ottobre dalle 11 alle 13 in aula 2.6● Ricevimento
– In qualunque momento, da concordare via mail
High Performance Computing 6
Scopo del corso
● Aspetti teorici e pratici della programmazione parallela– Teoria: dato un problema, progettare un algoritmo parallelo
che lo risolva; valutare l'efficienza di un programma parallelo– Pratica: dato un algoritmo parallelo, implementarlo
utilizzando gli strumenti più appropriati● 6 CFU (~ 60 ore di lezione) così divisi
– Lezioni in aula ~40 ore– Esercitazioni in laboratorio ~20 ore
High Performance Computing 7
Alla fine di questo corso...
● ...saprete come è organizzato un calcolatore parallelo● ...sarete in grado di progettare e realizzare programmi
efficienti su diversi tipi di architetture parallele● ...sarete in grado di valutare le prestazioni dei
programmi paralleli● ...e vi sarete divertiti (spero)!
High Performance Computing 9
Bibliografia● Peter S. Pacheco, An Introduction to
Parallel Programming, Morgan Kaufmann 2011, ISBN 9780123742605– Teoria + programmazione OpenMP e
MPI● CUDA C programming guide
http://docs.nvidia.com/cuda/cuda-c-programming-guide/
– Programmazione CUDA/C ● Lucidi e altro materiale sulla pagina
del corso
Sui lucidi delle lezioni
https://biblioklept.org/2010/06/11/the-british-library-acquires-j-g-ballard-archive/
I lucidi delle lezioni visti da voi I lucidi delle lezioni visti da me
High Performance Computing 11
Prerequisiti
ProgrammazioneAlgoritmi e
Strutture Dati
Architettura dei Calcolatori
Sistemi Operativi
High PerformanceComputing
High Performance Computing 12
Programma del corso
● Teoria (prime 3/4 settimane)– Architetture parallele– Pattern per la programmazione parallela– Valutazione delle prestazioni di programmi paralleli
● Programmazione (resto del corso)– Programmazione di architetture a memoria condivisa in
C/OpenMP– Programmazione di architetture a memoria distribuita in
C/MPI– Programmazione di GPU con CUDA/C– Programmazione SIMD con estensioni SSEx (se avanza
tempo)
High Performance Computing 13
Laboratorio
● Esercizi di programmazione parallela in ambiente Linux, per applicare i concetti visti a lezione
● Perché Linux?
Fonte: http://www.top500.org
High Performance Computing 14
I (potenti) mezzi a nostra disposizione
● disi-hpc– VM 16 core, 16 GB RAM, Debian/jessie– Esercitazioni OpenMP e MPI
● isi-raptor03– Dual core Xeon, 12 core, 64 GB RAM, Ubuntu 16.04– 3x NVidia GeForce GTX 1070 – Esercitazioni CUDA
● H/W vario– A disposizione per tesi
High Performance Computing 15
Modalità d'esame
● Prova scritta (peso 40%)– Domande su tutto il contenuto del corso (esempio sulla pagina del corso)– 6 appelli d'esame: 2 nella sessione invernale (gen/feb); 3 nella sessione estiva
(giu/lug); 1 nella sessione autunnale (set)– Si può rifiutare il voto quante volte si vuole
● Progetto individuale + relazione scritta (peso 60%)– Specifiche assegnate dal docente al termine del corso– Non è previsto un orale, ma mi riservo la facoltà di chiedere chiarimenti sui
progetti consegnati– In caso di rifiuto del voto, si consegna un NUOVO progetto su NUOVE specifiche
● Voto finale arrotondato all'intero più vicino● Le prove possono essere sostenute in modo indipendente● Il voto di ciascuna prova resta valido fino al 30 settembre 2019
– Ogni anno accademico si ricomincia da capo– Potrebbero cambiare le modalità d'esame, quindi occhio...
High Performance Computing 16
Valutazione del progetto
● Comprensibilità● Correttezza● Efficienza● Qualità della relazione
– Correttezza tecnica– Completezza dell'analisi– Qualità del testo scritto (grammatica, sintassi...)
High Performance Computing 20
High Performance Computing
● Molte applicazioni hanno bisogno di elevata potenza di calcolo – Meteorologia, fisica, ingegneria, animazione 3D, finanza...
● Perché?– Per risolvere problemi più complessi– Per risolvere lo stesso problema in modo più accurato– Per risolvere lo stesso problema in minor tempo– Per sfruttare al meglio le risorse disponibili
High Performance Computing 21
La legge di Moore
"Il numero di transistor in un circuito integrato raddoppia ogni 2 anni"
● Fino a poco tempo fa ciò significava un maggior numero di transistor più piccoli in ogni nuova generazione di processori
Moore, G.E., Cramming more components onto integrated circuits. Electronics, 38(8), April 1965 Gordon E.
Moore(1929– )
High Performance Computing 22By Wgsimon - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=15193542
High Performance Computing 23
La legge di Moore
Source: Hennessy, Patterson, Computer Architecture: A Quantitative Approach
High Performance Computing 24
Lezione di fisica
● Transistor più piccoli → processore più veloce● Processore più veloce → maggiore energia consumata● Maggiore energia consumata → maggiore calore prodotto● Maggiore calore prodotto → processore non affidabile
High Performance Computing 25
Potenza
● La potenza assorbita da un processore può essere espressa come
Power = C ´ V 2 ´ f
dove:– C è la capacitanza (abilità di un circuito di immagazzinare
energia)– V è il voltaggio– f è la frequenza a cui opera il processore
High Performance Computing 26
Potenza
ProcessorInput Output
f
Processor
Processor
Input Output
f / 2
f / 2
f
Slide credits: Tim Mattson, Intel
Capacitance CVoltage VFrequency fPower = C V 2 f
Capacitance 2.2 CVoltage 0.6 VFrequency 0.5 f Power = 0.396 C V 2 f
High Performance Computing 27
I trend dei microprocessori
Herb Sutter, The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software, Dr. Dobb's Journal, 30(3), March 2005, http://www.gotw.ca/publications/concurrency-ddj.htm
# Transistor
Clock speed
Power (W)
Perf/clock
High Performance Computing 28
Processor/Memory wall
Source: John L. Hennessy, David A. Patterson, Computer Architecture: a Quantitative Approach, Fifth Ed., Morgan Kaufman 2012, ISBN: 978-0-12-383872-8
High Performance Computing 29
Limiti
● There are limits to “automatic” improvement of scalar performance:– The Power Wall: Clock frequency cannot be increased
without exceeding air cooling– The Memory Wall: Access to data is a limiting factor– The ILP Wall: All the existing instruction-level parallelism
(ILP) is already being used● Conclusion:
– Explicit parallel mechanisms and explicit parallel programming are required for performance scaling
Slide credits: Hebenstreit, Reinders, Robison, McCool, SC13 tutorial
High Performance Computing 30
Che succede oggi?
● I progettisti HW creano processori con un numero elevato di core
● Risultato:– l'hardware parallelo è
ovunque– il software parallelo è
raro● La sfida
– Il software parallelo deve diventare diffuso come l'hardware parallelo
NVidia Tegra 4 SoC
High Performance Computing 31
La programmazione parallela in breve
● Decomporre il problema in sotto-problemi● Distribuire i sottoproblemi ai processori disponibili● Ciascun processore risolve il sottoproblema
assegnatogli● I processori possono cooperare per risolvere problemi
comuni● Obbiettivi
– Ridurre il tempo totale necessario per risolvere il problema– Bilanciare il carico tra i processori– Ridurre al minimo l'overhead dovuto alla comunicazione e
alla sincronizzazione tra processi
Slide credits: S. Orlando
High Performance Computing 32
Concorrenza vs Parallelismo
Slide credits: Tim Mattson, Intel
Task 1
Task 2
Task 3
Concorrenza senza parallelismo Parallelismo
High Performance Computing 33
La programmazione parallela in breve
● Fino a pochi anni fa, la programmazione parallela era un argomento di nicchia, dato che i calcolatori paralleli erano rari e costosi(ssimi)
● Oggi la programmazione parallela è essenziale dato che i processori paralleli sono ovunque
Apple iPhone 7 Quad-core 2.3 GHz ARMv8-A
Huawei P9Quad-core 2.5 GHz Cortex-A72
High Performance Computing 34
Quando la programmazione parallela è necessaria
● Paradigma scientifico tradizionale– Sviluppa una teoria, e poi effettua esperimenti per confermare la teoria
● Paradigma ingegneristico tradizionale– Prima sviluppa un progetto, poi costruisci un prototipo
● Entrambi questi paradigmi stanno venendo rimpiazzati da esperimenti e prototipazione numerica– Certi fenomeni reali sono troppo complessi per essere modellati (es.,
previsioni del tempo)– Certi tipi di esperimenti sono troppo complessi, costosi, o pericolosi per
essere condotti in laboratorio (es., simulazioni sismiche, gallerie del vento, progettazione di aerei, dinamica di ammassi stellari...)
● Computational science– Le simulazioni numeriche stanno diventando il nuovo modo per "fare
scienza"
Slide credits: S. Orlando
High Performance Computing 35
Numerical Wind Tunnel
Source: http://ecomodder.com/forum/showthread.php/random-wind-tunnel-smoke-pictures-thread-26678-12.html
High Performance Computing 36
Molecular dynamicsSource: http://bionano.physics.illinois.edu/node/109
High Performance Computing 37
Global Climate models
Source: Chapter 1 of Climate Change 2013: The Physical Science Basis https://www.ipcc.ch/report/ar5/wg1/
High Performance Computing 38
The Bolshoi Simulation
Bolshoi simulation https://vimeo.com/29769051
The Bolshoi Simulation recreates the large-scale structure of the universe; it required 6 million CPU hours on NASA's Pleiades Supercomputer
Source : https://www.nas.nasa.gov/hecc/resources/pleiades.html
High Performance Computing 39
Il “Santo Graal”
● Da anni gli informatici tentano di sviluppare linguaggi di programmazione che “parallelizzano da soli”– In casi molto particolari i risultati sono positivi– In generale i risultati sono mediocri (quando va bene), o
inesistenti (quando va male)● Occorre quindi usare strumenti specifici e sviluppare
algoritmi efficienti che traggano vantaggio dalle caratteristiche specifiche dell'architettura parallela sottostante Qui entriamo in gioco noi
High Performance Computing 40
Nessuno però dice che sia facile...
Versione sequenziale(~49 righe di codice C++)
http://www.moreno.marzolla.name/software/svmcell/
High Performance Computing 41
Nessuno però dice che sia facile...
Versione sequenziale(~49 righe di codice C++)
Versione parallela (PPU+SPU)(~1000 righe di codice C/C++15 fogli A4)
http://www.moreno.marzolla.name/software/svmcell/
High Performance Computing 42
Limiti della programmazione parallela
● Sviluppare un programma parallelo è in genere più difficile che svilupparne uno sequenziale
● La portabilità tra architetture diverse è limitata– Esistono alcuni standard de facto (OpenMP e MPI) che
facilitano la portabilità tra certe classi di architetture parallele● La fase di tuning necessaria per ottenere le
prestazioni migliori può risultare molto laboriosa
High Performance Computing 43
EsempioSomma degli elementi di un array
("Hello, world!" del calcolo parallelo)
High Performance Computing 44
Somma degli elementi di un array
● Consideriamo una architettura a memoria condivisa– Tutti i thread possono accedere ad una memoria condivisa
comune● Iniziamo con un algoritmo sequenziale, modificandolo
per l'esecuzione parallela– Questa non è necessariamente la strategia migliore: spesso
algoritmi paralleli efficienti non hanno nulla in comune con la loro controparte sequenziale!
– È comunque un approccio sensato, dato che siamo già abituati alla programmazione sequenziale
Slide credits: Mary Hall
High Performance Computing 45
Algoritmo sequenziale
● Calcola la somma dei valori contenuti in un array A di n elementi
float seq_sum(float* A, int n){
int i;float sum = 0.0;for (i=0; i<n; i++) {
sum += A[i];}return sum;
}
Slide credits: Mary Hall
High Performance Computing 46
Concetti base
● Decomposizione– Distribuire la computazione tra processori/threads– Distribuire i dati tra processori/threads
● Dipendenze– Assicurarsi che i valori delle variabili siano consistenti con
l'esecuzione sequenziale● Race Condition
– Si verifica una race condition quando il risultato di una computazione dipende dall'ordine relativo tra due o più eventi
● Sincronizzazione– Usata per gestire l'esecuzione concorrente di processi/threads
● Overhead
Slide credits: Mary Hall
High Performance Computing 47
Versione 1: PartitioningPrimo tentativo (sbagliato)
● Se ci sono P thread, ciascuno calcola la somma parziale di n / P elementi consecutivi
● Esempio: n = 15, P = 3
block_len = n/P; my_start = my_id * block_len; my_end = my_start + block_len; sum = 0.0;for (my_i=my_start; my_i<my_end; my_i++) { my_x = get_value(my_i); sum += my_x;}
Thread 0 Thread 1 Thread 2
ATTENZIONE...
Le variabili il cui nome inizia per my_ si considerano locali ad ogni thread; tutte le
altre si considerano globali
High Performance Computing 48
Problema
● Tutti i thread incrementano la variabile condivisa sum● Le operazioni di incremento devono essere effettuate
in modo atomico per preservare la correttezza del programma
● Soluzione: usare un mutex per fare in modo che un solo thread alla volta possa incrementare la variabile condivisa
High Performance Computing 49
Versione 1: PartitioningSecondo tentativo (meglio, ma ancora non corretto)
● Se ci sono P thread, ciascuno calcola la somma parziale di n / P elementi consecutivi
● Esempio: n = 15, P = 3
block_len = n/P; my_start = my_id * block_len; my_end = my_start + block_len; sum = 0.0; mutex m;for (my_i=my_start; my_i<my_end; my_i++) { my_x = get_value(my_i); mutex_lock(&m); sum += my_x; mutex_unlock(&m);}
Thread 0 Thread 1 Thread 2
ATTENZIONE...
High Performance Computing 50
Versione 1: PartitioningSecondo tentativo (meglio, ma ancora non corretto)
● Se ci sono P thread, ciascuno calcola la somma parziale di n / P elementi consecutivi
● Esempio: n = 17, P = 3
block_len = n/P; my_start = my_id * block_len; my_end = my_start + block_len; sum = 0.0; mutex m;for (my_i=my_start; my_i<my_end; my_i++) { my_x = get_value(my_i); mutex_lock(&m); sum += my_x; mutex_unlock(&m);}
Thread 0 Thread 1 Thread 2
ATTENZIONE...
?? ??
High Performance Computing 51
Versione 1: PartitioningTerzo tentativo (corretto, ma inefficiente)
● Se ci sono P thread, ciascuno calcola la somma parziale di n / P elementi consecutivi
● Esempio: n = 17, P = 3
Thread 0 Thread 1 Thread 2
my_start = n * my_id / P; my_end = n * (my_id + 1) / P;sum = 0.0; mutex m;for (my_i=my_start; my_i<my_end; my_i++) { my_x = get_value(my_i); mutex_lock(&m); sum += my_x; mutex_unlock(&m);}
High Performance Computing 52
Versione 2
● La versione 1 non è efficiente perché c'è eccessiva contesa sul mutex m– Ogni thread acquisisce e rilascia il mutex per ogni elementi dell'array!
● Soluzione: aumentare la granularità del mutex– Ogni thread accumula la somma parziale in una variabile privata (locale)– Il mutex viene usato alla fine per aggiornare la somma globale
my_start = n * my_id / P; my_end = n * (my_id + 1) / P;sum = 0.0; my_sum = 0.0; mutex m;for (my_i=my_start; my_i<my_end; my_i++) {
my_x = get_value(my_i);my_sum += my_x;
}mutex_lock(&m);sum += my_sum;mutex_unlock(&m);
High Performance Computing 53
Versione 3: Eliminiamo il mutex(sbagliato, in modo subdolo)
● Usiamo un array globale in cui ogni elemento contiene la somma locale di un thread diverso
● Il processo master calcola la somma globale
my_start = n * my_id / P; my_end = n * (my_id + 1) / P;psum[0..P-1] = 0.0; /* all elements set to 0.0 */for (my_i=my_start; my_i<my_end; my_i++) {
my_x = get_value(my_i);psum[my_id] += my_x;
}if ( 0 == my_id ) { /* only the master executes this */
sum = 0.0;for (my_i=0; my_i<P; my_i++)
sum += psum[my_i];}
ATTENZIONE...
High Performance Computing 54
Problema con la versione 3
● Il master potrebbe iniziare il calcolo della somma globale prima che tutti gli altri thread abbiano terminato il calcolo delle somme locali!
Calcolo somme locali
Calcolo somma globale
T0 T1 T2
High Performance Computing 55
Versione 4(corretta)
● Utilizziamo una barriera per sincronizzare i thread– Una barriera serve per impedire ad un thread di procedere
oltre fino a quando tutti i thread hanno raggiunto la barriera
my_start = n * my_id / P; my_end = n * (my_id + 1) / P;psum[0..P-1] = 0.0; for (my_i=my_start; my_i<my_end; my_i++) {
my_x = get_value(my_i);psum[my_id] += my_x;
}barrier();if ( 0 == my_id ) {
sum = 0.0;for (my_i=0; my_i<P; my_i++)
sum += psum[my_i];}
Calcolo somme locali
Calcolo somma globale
T0 T1 T2
barrier()
High Performance Computing 56
Versione 5Comunicazione tramite scambio di messaggi
● P << n processi● Ciascun processo
calcola la somma degli elementi di un sottovettore
● Ogni processo (tranne il master) invia la somma parziale al thread 0
...my_sum = 0.0;my_start = …, my_end = …;
for ( i = my_start; i < my_end; i++ ) {my_sum += get_value(i);
}if ( 0 == my_id ) {
for ( i=1; i<P; i++ ) {tmp = receive from proc i;my_sum += tmp;
}printf(“The sum is %f\n”, my_sum);
} else {send my_sum to thread 0;
}
High Performance Computing 57
Versione 5Proc 0
A[ ]
my_sum
Proc 1 Proc 2 Proc 3 Proc 4 Proc 5 Proc 6 Proc 7
1 3 -2 7 -6 5 3 4
15
4
2
9
3
8
11
High Performance Computing 58
Problema
● Il master è il collo di bottiglia, perché riceve P - 1 messaggi e deve eseguire P - 1 somme– Sbilanciamento del carico: nella seconda fase, l'operazione
di somma dei parziali viene svolta solo dal master● È possibile calcolare la somma globale, partendo dai
risultati parziali, in maniera più bilanciata?
High Performance Computing 59
Somma parallelaProc 0
A[ ]
my_sum
Proc 1 Proc 2 Proc 3 Proc 4 Proc 5 Proc 6 Proc 7
1 3 -2 7 -6 5 3 4
5 -1 7
6
15
4
9
● In tutto si eseguono P – 1 somme; il master (processo 0) riceve log
2 P messaggi ed effettua log
2 P somme.
High Performance Computing 60
Coordinazione
● I processi devono coordinare il loro lavoro● Comunicazione
– Uno o più processi inviano la propria somma parziale ad un altro processo
● Bilanciamento del carico– Dividere il lavoro tra i processi in maniera uniforme
● Sincronizzazione– Assicurarsi che il lavoro di ciascun processo sia “allineato” a
quello degli altri
High Performance Computing 61
Come scrivere applicazioni parallele?
● Task Parallelism– Distribuire i compiti da eseguire tra i processi/thread
● Data Parallelism– Distribuire i dati tra i processi/thread– I processi eseguono lo stesso programma
High Performance Computing 62
Esempio
● Supponiamo di raccogliere in un foglio di calcolo (spreadsheet) le temperature giornaliere misurate durante un anno (365 giorni) in una certa località
● La temperatura viene registrata una volta all'ora (24 misurazioni giornaliere)
● Vogliamo calcolare, per ogni giorno, la temperatura massima, minima e media
● Possiamo usare 3 processi (indipendenti)
High Performance Computing 63
Esempio
max min ave0 1 2 3 22 23
Hour (0—23)
0
1
2
364
Day
s (0
—36
4)
High Performance Computing 64
Approccio data parallel
max min ave0 1 2 3 22 23
Hour (0—23)
0
1
2
364
Day
s (0
—36
4)
Proc 0
Proc 1
Proc 2
High Performance Computing 65
Approccio task parallel
max min ave0 1 2 3 22 23
Hour (0—23)
0
1
2
364
Day
s (0
—36
4)
Pro
c 0
Pro
c 1
Pro
c 2
High Performance Computing 66
Concetti chiave
● Le leggi della fisica ci hanno condotto verso le architetture di calcolo parallele
● I programmi sequenziali generalmente non traggono vantaggio dalla presenza di più processori
● La parallelizzazione automatica (quando funziona) non sempre produce la soluzione migliore
● I programmi paralleli sono solitamente molto più complessi dei corrispondenti sequenziali