Upload
stefanoricchiuti
View
219
Download
0
Embed Size (px)
Citation preview
7/25/2019 Parallel computation - N Body Problem
1/16
Programmazione concorrente e parallela
Stefano Ricchiuti
[email protected] 2014
N-body problem
Calcolo Parallelo
Analisi soluzione proposta
7/25/2019 Parallel computation - N Body Problem
2/16
Outline
Codice sorgente
Modalit di test
Risultati
7/25/2019 Parallel computation - N Body Problem
3/16
Codice sorgente
driver.c
Main, interfaccia,
MPI
NBody.c
Funzioni, back-end
NBody.h
Include, define,strutture dati
view view view
http://1drv.ms/1g7EShfhttp://1drv.ms/1g7EMWGhttp://1drv.ms/1g7EJdB7/25/2019 Parallel computation - N Body Problem
4/16
Codice sorgente
Struttura principale
- MPI Init
Inizializzazione parametri MPI (rank processo, n. processi), datatype aggiuntivi
- N-Body Init
Caricamento da file, allocazione statica strutture dati, assegnazione
responsabilit processi
- N-Body
Calcolo dellinterazione gravitazionale e dellenergia complessiva,
aggiornamento velocit e posizione
- Sync
Scambio delle informazioni tra i processi
dowhile:
steps>
7/25/2019 Parallel computation - N Body Problem
5/16
Codice sorgente
MPI Init
DOF = degrees of freedom
per 3 dimensioni, DOF = 6
(posizione e velocit)
Datatype Body :
6 * MPI_DOUBLE
7/25/2019 Parallel computation - N Body Problem
6/16
Codice sorgente
N-Body init
7/25/2019 Parallel computation - N Body Problem
7/16
Codice sorgente
Responsabilit processi
0 1 2
x
y
Esempio
N=7, m=3, q=2, r=1
3 4 5 6
z
proc.
#0
proc.
#1
proc.
#2
vettorivelocit
(posizione)
intfirst = {0,3,4}
intoffset = {3,2,2}
Per il processo i
se i < r
first : i (q+1)
offset : q + 1
altrimenti
first : i q + r
offset : q
7/25/2019 Parallel computation - N Body Problem
8/16
Codice sorgente
N-Body
7/25/2019 Parallel computation - N Body Problem
9/16
Codice sorgente
N-Body - Sincronizzazione
Send / Receive
Global comm - Gather
7/25/2019 Parallel computation - N Body Problem
10/16
Codice sorgente
N-Body - Sincronizzazione
Start address
esempio per N = 7 m = 3
0 1 2 3 4 5 6
bodies data struct
doubleposVel [N*6]
#0 #1 #2 // proc. resp.
intfirst = {0,3,4}
intoffset = {3,2,2}
vel zpos x pos y pos z vel x vel y6 * double
Per il processo # 1 :
send_start_addr = &posVel[first[ 1 ] * 6]
7/25/2019 Parallel computation - N Body Problem
11/16
Codice sorgente
Verifica correttezza
Conservazione dellenergia
- Per ogni corpo, la somma tra energia potenziale gravitazionale ed energia cinetica deve
essere costante
- Errore legato allapprossimazione introdotta dal moto rettilineo uniformemente
accelerato e dalla risoluzione temporale
Verifica funzionale
- Riproduzione di un sistema solare e
verifica del comportamento dei corpi
7/25/2019 Parallel computation - N Body Problem
12/16
Test
- File di input
Sistema pseudo-solare collision-free, generato da script
- Misura delle prestazioni
Confronto prestazionale tra esecuzione a singolo processo ed esecuzione
parallela con pi processi.
Risultato: media aritmeticadei tempi di esecuzionedei processi
1) 100 oggetti - 100 steps (x10)
Singolo processo VS send/receive VS comunicazione globale
2) 1000 oggetti - 10 steps (x10)
Singolo processo VS comunicazione globale
3) 10000 oggetti - 2 steps (x10)
Singolo processo VS comunicazione globale
Modalit di test
risultati
http://1drv.ms/1g8i80A7/25/2019 Parallel computation - N Body Problem
13/16
Test
pi processi meno operazioni per processo pi messaggi
maggior overhead di comunicazione
7/25/2019 Parallel computation - N Body Problem
14/16
2
49.74%
Test
4
49.39%
16
46.88%
8
47.63%
Speed-up
progressivo:
7/25/2019 Parallel computation - N Body Problem
15/16
Test
7/25/2019 Parallel computation - N Body Problem
16/16
(ovvie) Conclusioni
Send/Receive
- comunicazione point-to-point
- numero di messaggi per end-point limitato
- NBody: necessit di strategie o protocollo
Global comm.
- routine ottimizzate per traffico elevato
- meno codice -> minor probabilit di errore
- gestione strutture dati complesse