Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Algoritmi Avanzati--modulo 2
Introduction
Algoritmi Avanzati--modulo 2
What MPI is
No shared variables
Subroutines for
Communication
Synchronization
Pairwise or point-to-point
Collectives involving multiple processors
Barrier
No locks because there are no shared variables to protect
Queries
Algoritmi Avanzati--modulo 2
Hello, world!
/* mpi_hello.c */
#include "mpi.h"
#include <stdio.h>
int main( int argc, char *argv[] )
{
int rank, size;
MPI_Init( &argc, &argv ); /* no MPI calls before this line */
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
printf( Greetings from process %d of %d\n", rank, size );
MPI_Finalize(); /* no MPI calls after this line */
return 0;
}
Algoritmi Avanzati--modulo 2
Hello, world!
Compilation:
mpicc -Wall mpi_hello.c -o mpi_hello
10
Hello, world!
$ mpirun -n 8 ./mpi_hello
Greetings from process 7 of 8
Greetings from process 5 of 8
Greetings from process 0 of 8
Greetings from process 3 of 8
Greetings from process 6 of 8
Greetings from process 4 of 8
Greetings from process 1 of 8
Greetings from process 2 of 8
Algoritmi Avanzati--modulo 2
11
Hostfile
$ cat myhostfile
aa slots=4
bb slots=4
cc slots=4
12
MPI_Finalize();
return 0;
Algoritmi Avanzati--modulo 2
13
14
15
Algoritmi Avanzati--modulo 2
16
MPI datatypes
Algoritmi Avanzati--modulo 2
18
MPI Tags
Messages are sent with an accompanying userdefined integer tag, to assist the receiving process in
identifying the message
Messages can be screened at the receiving end by
specifying a specific tag, or not screened by specifying
MPI_ANY_TAG as the tag in a receive
Algoritmi Avanzati--modulo 2
19
Algoritmi Avanzati--modulo 2
20
See trap_serial.c
21
Algoritmi Avanzati--modulo 2
22
Algoritmi Avanzati--modulo 2
23
Collective Communication
Algoritmi Avanzati--modulo 2
24
MPI_Reduce
MPI_Reduce(
&partial_result,
&result,
1,
MPI_DOUBLE,
MPI_SUM,
0,
MPI_COMM_WORLD
);
P0
/*
/*
/*
/*
/*
/*
/*
send buffer */
receive buffer, used only at root */
number of items to send */
data type of elements */
reduction operator */
rank of root (who performs reduction) */
communicator */
P1
P2
Pn-1
P0
Algoritmi Avanzati--modulo 2
25
Algoritmi Avanzati--modulo 2
26
Algoritmi Avanzati--modulo 2
27
Parallel trapezoid
(with reduction primitive)
Algoritmi Avanzati--modulo 2
28
Source: https://computing.llnl.gov/tutorials/mpi/
Algoritmi Avanzati--modulo 2
29
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
30
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
31
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
32
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
33
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
34
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
37
Algoritmi Avanzati--modulo 2
Source: https://computing.llnl.gov/tutorials/mpi/
38
Contiguous data
Uniform message size
Proc 0
Proc 0
Proc 1
Proc 2
Proc 3
Algoritmi Avanzati--modulo 2
45
MPI_Scatterv / MPI_Gatherv
Proc 0
Proc 1
Proc 2
Proc 3
Algoritmi Avanzati--modulo 2
46
MPI_Scatterv
sendbuf
sendcnts[0]
sendcnts[1] sendcnts[3]
sendcnts[2]
Proc 0
displs[0]
displs[1]
displs[2]
recvbuf
Proc 0
Proc 1
Proc 2
Proc 3
displs[3]
recvcnt
int MPI_Scatterv (
void *sendbuf,
int *sendcnts,
int *displs,
Number of
MPI_Datatype sendtype,
array elements,
void *recvbuf,
NOT bytes!
int recvcnt,
MPI_Datatype recvtype,
int root,
Algoritmi Avanzati--modulo 2
47
MPI_Comm comm )
Algoritmi Avanzati--modulo 2
48
Algoritmi Avanzati--modulo 2
49
Compare and
exchange
v[2]
v[3]
v[4]
v[5]
v[6]
Time
Algoritmi Avanzati--modulo 2
50
Algoritmi Avanzati--modulo 2
51
Choosing Granularity
Algoritmi Avanzati--modulo 2
52
Odd-Even Sort
Algoritmi Avanzati--modulo 2
53
Proc 0
Proc 1
Proc 2
Proc 3
Proc 0
Proc 1
Proc 2
Proc 3
Proc 0
Proc 1
Proc 2
Proc 3
Proc 0
Proc 1
Proc 2
Proc 3
Algoritmi Avanzati--modulo 2
54
Odd-Even Sort
10 7 12 33 9
13 52 14 97 31
sort
sort
7 9 10 12 33
13 14 31 52 97
Send to neighbor
7 9 10 12 33 13 14 31 52 97
7 9 10 12 33 13 14 31 52 97
merge
merge
7 9 10 12 13 14 31 33 52 97
7 9 10 12 13 14 31 33 52 97
7 9 10 12 13
14 31 33 52 97
Algoritmi Avanzati--modulo 2
55
Algoritmi Avanzati--modulo 2
56
Solution 1 (bad):
restructure communication
Algoritmi Avanzati--modulo 2
57
Solution 2 (better):
use MPI_Sendrecv
Algoritmi Avanzati--modulo 2
58
Algoritmi Avanzati--modulo 2
59
Concluding Remarks
Algoritmi Avanzati--modulo 2
60