gwdg – kurs parallelrechner-programmierung mit mpi mpi kollektive operationen oswald haan...
TRANSCRIPT
GWDG – KursParallelrechner-Programmierung mit MPI
MPIKollektive Operationen
Oswald [email protected]
Parallelrechner-Programmierung mit MPI 2
Kollektive Operationen - Überblick
Kollektive Operationen werden von allen Tasks eines Kommunikators (z.B. MPI_COMM_WORLD) aufgerufenIntra-Kommunikator: alle Tasks gehören zu einer GruppeInter-Kommunikator: die Tasks bilden zwei getrennte GruppenMPI_COMM_WORLD ist ein Intra-Kommunikator
Kollektive Operationen können blockierend sein (z.B. MPI_BARRIER) oder je nach Implementierung blockierend oder nichtblockierend
07. – 09. 04. 2014
Parallelrechner-Programmierung mit MPI 3
Klassifizierung der Kollektive Operationen
MPI_BARRIER: SynchronisationMPI_BCAST: Senden von einer Task zu allen anderen Tasks (Broadcast)MPI_GATHER, MPI_GATHERV: Sammeln von Daten von allen Tasks auf einer Task MPI_SCATTER, MPI_SCATTERV: Verteilen von Daten einer Task auf alle TasksMPI_ALLGATHER, MPI_ALLGATHERV: Sammeln von Daten von allen Tasks auf allen Tasks MPI_ALLTOALL, MPI_ALLTOALLV, MPI_ALLTOALLW:
Austauschen von Daten zwischen allen TasksMPI_ALLREDUCE, MPI_REDUCE: Globale Reduktions-Operation wie SUM, MAX über alle Tasks, das Resultat geht an alle Tasks oder nur eine TaskMPI_REDUCE_SCATTER: Kombination von Reduktion und Verteilen MPI_SCAN, MPI_EXSCAN: Task i erhält das Ergebnis der Reduktion der Daten aller Tasks j mit j bzw. i
einer → alle alle → einen alle → alle07. – 09. 04. 2014
Parallelrechner-Programmierung mit MPI 4
Kollektive Operationen: Datenfluss
07. – 09. 04. 2014
Parallelrechner-Programmierung mit MPI 5
Kollektive Operationen: Datenfluss
07. – 09. 04. 2014
alltoall
Parallelrechner-Programmierung mit MPI 6
MPI_BARRIER: Synchronisation
07. – 09. 04. 2014
MPI_BARRIER( comm )IN comm communicator (handle)
MPI_BARRIER muss von allen Tasks des Kommunikators comm aufgerufen werden.
Der Aufruf von MPI_BARRIER endet erst, wenn alle Tasks den Aufruf abgesetzt haben.
Parallelrechner-Programmierung mit MPI 7
MPI_BCAST: Broadcast
07. – 09. 04. 2014
MPI_BCAST( buffer, count, datatype, root, comm )
INOUT buffer starting address of buffer (choice)IN count number of entries in buffer (non-negative integer)IN datatype data type of buffer (handle)IN root rank of broadcast root (integer)IN comm communicator (handle)
• Alle Tasks müssen die gleichen Werte für root und comm angeben,
• die durch count und datatype festgelegte Datenmenge muss bei allen Tasks übereinstimmen
Parallelrechner-Programmierung mit MPI 8
MPI_GATHER: Sammeln auf root
07. – 09. 04. 2014
MPI_GATHER( sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm)
IN sendbuf starting address of send buffer (choice)IN sendcount number of elements in send buffer (non-negative
integer)IN sendtype data type of send buffer elements (handle)OUT recvbuf address of receive buffer
(choice, significant only at root)IN recvcount number of elements for any single receive
(non-negative integer, significant only at root)IN recvtype data type of recv buffer elements
(handle,significant only at root) IN root rank of receiving process (integer)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 9
MPI_GATHER: Sammeln auf root
07. – 09. 04. 2014
• Alle Tasks müssen die gleichen Werte für root und comm
angeben • die durch sendcount und sendype festgelegte
Datenmenge muss bei allen Tasks mit der auf dem root-Task durch recvcount und recvtype festgelegten Datenmenge übereinstimmen
• Der recv-Buffer wird auf allen nicht-root Tasks ignoriert
Task 0
Task 1 (root)
Task 2
sendbuf recvbufbuf sendbuf recvbufbuf
Vor MPI_GATHER Nach MPI_GATHER
Parallelrechner-Programmierung mit MPI 10
MPI_GATHER: mit MPI_IN_PLACE auf root
07. – 09. 04. 2014
nicht-root-TaskMPI_GATHER( sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, root, comm)root-TaskMPI_GATHER(MPI_IN_PLACE, sendcount, sendtype, recvbuf, recvcount,
recvtype, root, comm)
Task 0
Task 1 (root)
Task 2
sendbuf recvbufbuf
Vor MPI_GATHER Nach MPI_GATHER
sendbuf recvbufbuf
Parallelrechner-Programmierung mit MPI 11
MPI_GATHERV: Sammeln auf root
07. – 09. 04. 2014
MPI_GATHERV( sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root,comm)
IN sendbuf starting address of send buffer (choice)IN sendcount number of elements in send buffer (non-negative
integer)IN sendtype data type of send buffer elements (handle)OUT recvbuf address of receive buffer (choice, significant only at root)IN recvcounts non-negative integer array (of length group size)
containing the number of elements that are received from each process (significant only at root)
IN displs integer array (of length group size). Entry i specifiesthe displacement relative to recvbuf at which to placethe incoming data from process i (significant only at root)
IN recvtype data type of recv buffer elements (handle,significant only at root)
IN root rank of receiving process (integer)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 12
MPI_GATHERV : Sammeln auf root
07. – 09. 04. 2014
• die durch sendcount und sendype festgelegte Datenmenge auf Task i muss mit der auf dem root-Task durch recvcounts(i) und recvtype festgelegten Datenmenge übereinstimmen
• Die Daten von Task i werden mit dem Abstand displs(i) Elemente vom Typ recvtype von der Adresse recvbuf gespeichert
• Der recv-Buffer wird auf allen nicht-root Tasks ignoriert
Task 0
Task 1 (root)
Task 2
sendbuf recvbufbuf sendbuf recvbufbuf
Vor MPI_GATHERV Nach MPI_GATHERV
Parallelrechner-Programmierung mit MPI 13
MPI_SCATTER: Verteilen von root
07. – 09. 04. 2014
MPI_SCATTER( sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm)
IN sendbuf address of send buffer (choice, significant only at root)IN sendcount number of elements sent to each process
(non-negative integer, significant only at root)IN sendtype data type of send buffer elements
(handle, significant only at root)OUT recvbuf address of receive buffer (choice)IN recvcount number of elements in receive buffer
(non-negative integer)IN recvtype data type of receive buffer elements (handle)IN root rank of sending process (integer)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 14
MPI_SCATTER: Verteilen von root
07. – 09. 04. 2014
• Alle Tasks müssen die gleichen Werte für root und comm
angeben • die durch recvcount und recvtype festgelegte
Datenmenge muss bei allen Tasks mit der auf dem root-Task durch sendcount und sendtype festgelegten Datenmenge übereinstimmen
• Der send-Buffer wird auf allen nicht-root Tasks ignoriert
Task 0
Task 1 (root)
Task 2
sendbuf recvbufbufsendbuf recvbufbuf
Vor MPI_SCATTER Nach MPI_SCATTER
Parallelrechner-Programmierung mit MPI 15
MPI_ALLGATHER: Sammeln auf alle Tasks
07. – 09. 04. 2014
MPI_ALLGATHER( sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)
IN sendbuf starting address of send buffer (choice)IN sendcount number of elements in send buffer
(non-negative integer)IN sendtype data type of send buffer elements (handle)OUT recvbuf address of receive buffer (choice)IN recvcount number of elements received from any process
(nonnegative integer)IN recvtype data type of receive buffer elements (handle)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 16
MPI_ALLGATHER: Sammeln auf root
07. – 09. 04. 2014
• Alle Tasks müssen die gleichen Werte für comm angeben • die durch sendcount und sendype festgelegte
Datenmenge muss bei allen Tasks mit der durch recvcount und recvtype festgelegten Datenmenge übereinstimmen
Task 0
Task 1
Task 2
sendbuf recvbufbuf sendbuf recvbufbuf
Vor MPI_ALLGATHER Nach MPI_ALLGATHER
Parallelrechner-Programmierung mit MPI 17
MPI_ALLGATHER mit MPI_IN_PLACE
07. – 09. 04. 2014
MPI_ALLGATHER(MPI_IN_PLACE, sendcount, sendtype,
recvbuf, recvcount,recvtype, comm)
Task 0
Task 1
Task 2
sendbuf recvbufbuf sendbuf recvbufbuf
Vor MPI_ALLGATHER Nach MPI_ALLGATHER
Parallelrechner-Programmierung mit MPI 18
MPI_ALLGATHERV: Sammeln auf alle Tasks
07. – 09. 04. 2014
MPI_ALLGATHERV( sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs,recvtype, comm)
IN sendbuf starting address of send buffer (choice)IN sendcount number of elements in send buffer
(non-negative integer)IN sendtype data type of send buffer elements (handle)OUT recvbuf address of receive buffer (choice)IN recvcounts non-negative integer array (of length group size)
containing the number of elements that arereceived from each process (significant only at root)
IN displs integer array (of length group size). Entry i specifies the displacement relative to recvbuf at which to place the incoming data from process i
IN recvtype data type of receive buffer elements (handle)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 19
MPI_ALLTOALL: Sammeln und Verteilen
07. – 09. 04. 2014
MPI_ALLTOALL(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)
IN sendbuf starting address of send buffer (choice)IN sendcount number of elements sent to each process
(non-negative integer)IN sendtype data type of send buffer elements (handle)OUT recvbuf address of receive buffer (choice)IN recvcount number of elements received from any process
(nonnegative integer)IN recvtype data type of receive buffer elements (handle)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 20
0
MPI_ALLTOALL: Sammeln und Verteilen
07. – 09. 04. 2014
• Alle Tasks müssen die gleichen Werte für comm angeben • die durch sendcount und sendype festgelegte
Datenmenge muss bei allen Tasks gleich sein und mit der durch recvcount und recvtype festgelegten Datenmenge übereinstimmen
0 1 2
Task 0
Task 1
Task 2
sendbuf
1 1 1
recvbufbuf
Vor MPI_ALLTOALL Nach MPI_ALLTOALL
0 1 2
1 2
2 2 2
0 0 0
Parallelrechner-Programmierung mit MPI 21
Reduktions-Operationen
07. – 09. 04. 2014
Operationen, die Daten von allen Tasks zu einem einzigen
Ergebnis verarbeiten, wie Summe, Minimum etc. Vordefinierte oder eigene Operationen möglich
MPI_REDUCE:Ergebnis wird auf root gespeichert
MPI_ALLREDUCE:Ergebnis wird auf allen Tasks gespeichert
MPI_REDUCE_SCATTER, MPI_REDUCE_SCATTER_BLOCK:n Ergebnisse werden auf n Tasks verteilt
MPI_SCAN, MPI_EXSCAN:Partielle Ergebnisse werden auf die Tasks verteilt
Parallelrechner-Programmierung mit MPI 22
Vordefinierte Reduktions-Operationen
07. – 09. 04. 2014
Name Meaning
MPI_MAX maximumMPI_MIN minimumMPI_SUM sumMPI_PROD productMPI_LAND logical andMPI_BAND bit-wise andMPI_LOR logical orMPI_BOR bit-wise orMPI_LXOR logical exclusive or (xor)MPI_BXOR bit-wise exclusive or (xor)MPI_MAXLOC max value and locationMPI_MINLOC min value and location
Parallelrechner-Programmierung mit MPI 23
A0 op A0 op A0 A1 op A1 op A1
Reduktions-Operationen
07. – 09. 04. 2014
MPI_REDUCE( sendbuf, recvbuf, count, datatype, op, root, comm)IN sendbuf address of send buffer (choice)OUT recvbuf address of receive buffer
(choice, significant only at root)IN count number of elements in send buffer
(non-negative integer)IN datatype data type of elements of send buffer (handle)IN op reduce operation (handle)IN root rank of root process (integer)IN comm communicator (handle)
Task 0
Task 1 (root)
Task 2
sendbuf recvbufbuf
A0 A1
A0 A1
A0 A1
Parallelrechner-Programmierung mit MPI 24
A0 op A0 op A0 A1 op A1 op A1
Reduktions-Operationen
07. – 09. 04. 2014
MPI_ALLREDUCE( sendbuf, recvbuf, count, datatype, op, comm)
Task 0
Task 1
Task 2
sendbuf recvbufbuf
A0 A1
A0 A1
A0 A1
A0 op A0 op A0 A1 op A1 op A1
A0 op A0 op A0 A1 op A1 op A1
Parallelrechner-Programmierung mit MPI 25
Reduktions-Operationen
07. – 09. 04. 2014
MPI_REDUCE_SCATTER( sendbuf, recvbuf, recvcounts, datatype, op, comm)
IN sendbuf starting address of send buffer (choice)OUT recvbuf starting address of receive buffer (choice)IN recvcounts non-negative integer array (of length group size)
specifying the number of elements of the result distributed to each process.
IN datatype data type of elements of send and receive buffers (handle)
IN op operation (handle)IN comm communicator (handle)
Parallelrechner-Programmierung mit MPI 26
A0 A1 A2 A3 A4 A5
Max(A2, A2,A2 ) Max(A3, A3,A3)
Reduktions-Operationen
07. – 09. 04. 2014
MPI_REDUCE_SCATTER_BLOCK( sendbuf, recvbuf, recvcount, datatype, op, comm)z.B. recvcount = 2, op = MPI_MAX
Task 0
Task 1
Task 2
sendbuf recvbufbuf
Max(A0, A0,A0) Max(A1, A1,A1)
Max(A4, A4,A4) Max(A5, A5,A5) A0 A1 A2 A3 A4 A5
A0 A1 A2 A3 A4 A5
Parallelrechner-Programmierung mit MPI 27
A0 op A0 A1 op A1
Reduktions-Operationen
07. – 09. 04. 2014
MPI_SCAN( sendbuf, recvbuf, count, datatype, op, comm)
Task 0
Task 1
Task 2
sendbuf recvbufbuf
A0 A1
A0 A1
A0 A1
A0 A1
A0 op A0 op A0 A1 op A1 op A1