+ All Categories
Home > Documents > GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan...

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

Date post: 06-Apr-2015
Category:
Upload: abelard-zeilinger
View: 111 times
Download: 2 times
Share this document with a friend
27
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan [email protected]
Transcript
Page 1: GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan ohaan@gwdg.de.

GWDG – KursParallelrechner-Programmierung mit MPI

MPIKollektive Operationen

Oswald [email protected]

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

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

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

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

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

Parallelrechner-Programmierung mit MPI 4

Kollektive Operationen: Datenfluss

07. – 09. 04. 2014

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

Parallelrechner-Programmierung mit MPI 5

Kollektive Operationen: Datenfluss

07. – 09. 04. 2014

alltoall

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

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.

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

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

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

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)

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

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

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

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

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

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)

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

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

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

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)

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

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

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

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)

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

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

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

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

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

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)

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

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)

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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

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


Recommended