Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan

Ähnliche Präsentationen


Präsentation zum Thema: "GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan"—  Präsentation transkript:

1 GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan ohaan@gwdg.de

2 Kollektive Operationen - Überblick Kollektive Operationen werden von allen Tasks eines Kommunikators (z.B. MPI_COMM_WORLD) aufgerufen Intra-Kommunikator: alle Tasks gehören zu einer Gruppe Inter-Kommunikator: die Tasks bilden zwei getrennte Gruppen MPI_COMM_WORLD ist ein Intra-Kommunikator Kollektive Operationen können blockierend sein (z.B. MPI_BARRIER) oder je nach Implementierung blockierend oder nichtblockierend Parallelrechner-Programmierung mit MPI207. – 08. 10. 2014

3 Klassifizierung der Kollektive Operationen Parallelrechner-Programmierung mit MPI307. – 08. 10. 2014

4 Kollektive Operationen: Datenfluss Parallelrechner-Programmierung mit MPI407. – 08. 10. 2014

5 Kollektive Operationen: Datenfluss Parallelrechner-Programmierung mit MPI507. – 08. 10. 2014 alltoall

6 MPI_BARRIER: Synchronisation Parallelrechner-Programmierung mit MPI607. – 08. 10. 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.

7 Synchronisation mit mpi4py Parallelrechner-Programmierung mit MPI707. – 08. 10. 2014 comm.Barrier( ) IN comm communicator e.g. MPI.COMM_WORLD 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.

8 MPI_BCAST: Broadcast Parallelrechner-Programmierung mit MPI807. – 08. 10. 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

9 Broadcast mit mpi4py Parallelrechner-Programmierung mit MPI907. – 08. 10. 2014 robj = comm.bcast(sobj, root= 0) OUT robj python object to be received on all tasks IN comm communicator e.g MPI:COMM_WORLD IN sobj python object to be sent from root IN root rank of broadcast root (integer) comm.Bcast(ar, root= 0) IN comm communicator e.g MPI:COMM_WORLD INOUT ar numpy array to be sent from root and to be received on all tasks IN root rank of broadcast root (integer)

10 MPI_GATHER: Sammeln auf root Parallelrechner-Programmierung mit MPI1007. – 08. 10. 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) INcomm communicator (handle)

11 Sammeln auf root mit mpi4py Parallelrechner-Programmierung mit MPI1107. – 08. 10. 2014 robj = comm.gather(sendobj = sobj, recvobj=None, root= 0) INcomm communicator e.g. MPI:COMM_WORLD IN sobj python object to be sent OUT robj python object for gathered elements (significant only at root) IN root rank of receiving process (integer) comm.Gather(sar, rar, root= 0) INcomm communicator e.g. MPI:COMM_WORLD IN sar numpy array to be sent OUT rar numpy array for gathered elements (significant only at root) IN root rank of receiving process (integer)

12 MPI_GATHER: Sammeln auf root Parallelrechner-Programmierung mit MPI1207. – 08. 10. 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_GATHERNach MPI_GATHER

13 MPI_GATHER: mit MPI_IN_PLACE auf root Parallelrechner-Programmierung mit MPI1307. – 08. 10. 2014 nicht-root-Task MPI_GATHER( sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) root-Task MPI_GATHER(MPI_IN_PLACE, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) Task 0 Task 1 (root) Task 2 sendbuf recvbufbuf Vor MPI_GATHERNach MPI_GATHER sendbuf recvbufbuf

14 MPI_GATHERV: Sammeln auf root Parallelrechner-Programmierung mit MPI1407. – 08. 10. 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 specifies the displacement relative to recvbuf at which to place the 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)

15 MPI_GATHERV : Sammeln auf root Parallelrechner-Programmierung mit MPI1507. – 08. 10. 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_GATHERVNach MPI_GATHERV

16 MPI_SCATTER: Verteilen von root Parallelrechner-Programmierung mit MPI1607. – 08. 10. 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 rootrank of sending process (integer) IN comm communicator (handle)

17 Verteilen von root mit mpi4py Parallelrechner-Programmierung mit MPI1707. – 08. 10. 2014 robj = comm.scatter(sendobj = sobj, recvobj=None, root= 0) INcomm communicator e.g. MPI:COMM_WORLD IN sobj python object to be scattered from root (significant only at root) OUT robj python object for scattered parts of sobj IN root rank of receiving process (integer) comm.Scatter(sar, rar, root= 0) INcomm communicator e.g. MPI:COMM_WORLD IN sar numpy array to be scattered from root (significant only at root) OUT rar numpy array for receiving scattered parts of sar IN root rank of receiving process (integer)

18 MPI_SCATTER: Verteilen von root Parallelrechner-Programmierung mit MPI1807. – 08. 10. 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 sendbufrecvbufbufsendbufrecvbufbuf Vor MPI_SCATTERNach MPI_SCATTER

19 MPI_ALLGATHER: Sammeln auf alle Tasks Parallelrechner-Programmierung mit MPI1907. – 08. 10. 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)

20 MPI_ALLGATHER: Sammeln auf root Parallelrechner-Programmierung mit MPI2007. – 08. 10. 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_ALLGATHERNach MPI_ALLGATHER

21 MPI_ALLGATHER mit MPI_IN_PLACE Parallelrechner-Programmierung mit MPI2107. – 08. 10. 2014 MPI_ALLGATHER(MPI_IN_PLACE, sendcount, sendtype, recvbuf, recvcount,recvtype, comm) Task 0 Task 1 Task 2 sendbuf recvbufbuf sendbuf recvbufbuf Vor MPI_ALLGATHERNach MPI_ALLGATHER

22 MPI_ALLGATHERV: Sammeln auf alle Tasks Parallelrechner-Programmierung mit MPI2207. – 08. 10. 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 are received from each process (significant only at root) IN displsinteger 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)

23 MPI_ALLTOALL: Sammeln und Verteilen Parallelrechner-Programmierung mit MPI2307. – 08. 10. 2014 MPI_ALLTOALL(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) IN sendbuf starting address of send buffer (choice) INsendcount number of elements sent to each process (non-negative integer) IN sendtype data type of send buffer elements (handle) OUTrecvbuf 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)

24 0 MPI_ALLTOALL: Sammeln und Verteilen Parallelrechner-Programmierung mit MPI2407. – 08. 10. 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 12 Task 0 Task 1 Task 2 sendbuf 1 11 recvbufbuf Vor MPI_ALLTOALLNach MPI_ALLTOALL 0 12 12 2 22 0 00

25 Reduktions-Operationen Parallelrechner-Programmierung mit MPI2507. – 08. 10. 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

26 Vordefinierte Reduktions-Operationen Parallelrechner-Programmierung mit MPI2607. – 08. 10. 2014 Name Meaning (fortran,c) (mpi4py) MPI_MAX MPI.MAXmaximum MPI_MIN MPI.MINminimum MPI_SUM MPI.SUMsum MPI_PROD MPI.PRODproduct MPI_LAND MPI.LANDlogical and MPI_BAND MPI.BANDbit-wise and MPI_LOR MPI.LORlogical or MPI_BOR MPI.BORbit-wise or MPI_LXOR MPI.LXORlogical exclusive or (xor) MPI_BXOR MPI.BXORbit-wise exclusive or (xor) MPI_MAXLOC MPI.MAXLOCmax value and location MPI_MINLOC MPI.MINLOCmin value and location

27 A0 op A0 op A0 A1 op A1 op A1 Reduktions-Operationen Parallelrechner-Programmierung mit MPI2707. – 08. 10. 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

28 Reduktions-Operationen mit mpi4py Parallelrechner-Programmierung mit MPI2807. – 08. 10. 2014 robj = comm.reduce(sendobj = sobj, recvobj=None, op=oper,root= 0) INcomm communicator e.g. MPI.COMM_WORLD IN sobj python object to be reduced OUT robj python object for result of reduction (significant only at root) INoperreduction operation, e.g. MPI.SUM IN root rank of receiving process (integer) comm.Reduce(sar, rar,op=oper root= 0) INcomm communicator e.g. MPI.COMM_WORLD IN sar numpy array to be reduced OUT rar numpy array for result of reduction (significant only at root) INoperreduction operation, e.g. MPI.SUM IN root rank of receiving process (integer)

29 A0 op A0 op A0 A1 op A1 op A1 Reduktions-Operationen Parallelrechner-Programmierung mit MPI2907. – 08. 10. 2014 MPI_ALLREDUCE( sendbuf, recvbuf, count, datatype, op, comm) Task 0 Task 1 Task 2 sendbuf recvbufbuf A0 A1 A0 op A0 op A0 A1 op A1 op A1

30 Reduktions-Operationen Parallelrechner-Programmierung mit MPI3007. – 08. 10. 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)

31 A0 A1 A2 A3 A4 A5 Max(A2, A2,A2 ) Max(A3, A3,A3) Reduktions-Operationen Parallelrechner-Programmierung mit MPI3107. – 08. 10. 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

32 A0 op A0 A1 op A1 Reduktions-Operationen Parallelrechner-Programmierung mit MPI3207. – 08. 10. 2014 MPI_SCAN( sendbuf, recvbuf, count, datatype, op, comm) Task 0 Task 1 Task 2 sendbuf recvbufbuf A0 A1 A0 op A0 op A0 A1 op A1 op A1


Herunterladen ppt "GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan"

Ähnliche Präsentationen


Google-Anzeigen