Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan

Ähnliche Präsentationen


Präsentation zum Thema: "GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan"—  Präsentation transkript:

1 GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan ohaan@gwdg.de

2 Nachrichten- Inhalt : 23. – 25. 09. 2013Parallelrechner-Programmierung mit MPI2 Nachrichtenaustausch Daten : Aus lokalen Speicherzellen Absender Empfänger Identifikation Größe : 3 kB Absender Empfänger Identifikation Größe : 3 kB Daten : In lokale Speicherzellen Proz. 1 Netz Proz. 2 Umschlag : Lokaler Speicher:

3 Blockierendes Senden: MPI_SEND MPI_SEND(buf, count, datatype, dest, tag, comm) IN buf initial address of send buffer (choice) IN countnumber of elements in send buffer (non-negative integer) IN datatype datatype of each send buffer element (handle) IN dest rank of destination (integer) IN tag message tag (integer) IN comm communicator (handle) Parallelrechner-Programmierung mit MPI323. – 25. 09. 2013

4 MPI_SEND: Nachricht Die gesendete Nachricht besteht aus count aufeinanderfolgenden Speicherzellen, die jeweils ein Element vom Typ datatype enthalten, beginnend bei der durch buf gegebenen Speicheradresse. Die Länge der Nachricht in Byte ist deshalb: count * Länge in Byte eines Elementes vom Typ datatype MPI Datentypen entsprechen den Standard-Datentypen von Fortran und C Zusätzliche Datentypen: MPI_BYTEein Byte (uninterprätiert) MPI_PACKED mit MPI_PACK generiertes Datenpaket Implementationsabhängig können weitere Datentypen definiert sein Parallelrechner-Programmierung mit MPI423. – 25. 09. 2013

5 MPI-eigene Datentypen: Fortran MPI datatype Fortran datatype MPI_INTEGER INTEGER MPI_REAL REAL MPI_DOUBLE_PRECISION DOUBLE PRECISION MPI_LOGICAL LOGICAL MPI_CHARACTER CHARACTER MPI_COMPLEX COMPLEX Parallelrechner-Programmierung mit MPI523. – 25. 09. 2013

6 MPI-eigene Datentypen: C (Auswahl) MPI datatype C datatype MPI_INT signed int MPI_LONG signed long int MPI_FLOAT float MPI_DOUBLE double MPI_LONG_DOUBLE long double MPI_CHAR char MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED_CHAR unsigned char Parallelrechner-Programmierung mit MPI623. – 25. 09. 2013

7 MPI_SENT: Nachrichten-Umschlag Parallelrechner-Programmierung mit MPI723. – 25. 09. 2013

8 Blockierendes Empfangen: MPI_RECV MPI_RECV (buf, count, datatype, source, tag, comm, status) OUT buf initial address of receive buffer (choice) IN count number of elements in receive buffer (non-negative integer) IN datatype datatype of each receive buffer element (handle) IN source rank of source or MPI_ANY_SOURCE (integer) IN tag message tag or MPI_ANY_TAG (integer) IN comm communicator (handle) OUT status status object (Status) Parallelrechner-Programmierung mit MPI823. – 25. 09. 2013

9 MPI_RECV: Nachricht Die empfangene Nachricht wird abgespeichert auf count aufeinanderfolgenden Speicherzellen, die jeweils ein Element vom Typ datatype erhalten, beginnend bei der durch buf gegebenen Speicheradresse. Die Länge der empfangenen Nachricht in Byte ist deshalb: count * Länge in Byte eines Elementes vom Typ datatype Die Länge der mit MPI_SEND gesendeten Nachricht darf die in MPI_RECV spezifizierte Länge der empfangenen Nachricht nicht überschreiten, sie kann aber kürzer sein. MPI_PROBE(source, tag, comm, status) mit identischen Argumenten wie MPI_RCV liefert über status Information über die zu empfangende Nachricht. Diese Information kann dann im eigentlichen MPI_RCV Aufruf verwendet werden, z.B. um einen genügend großen Empfangsbereich bereitzustellen Parallelrechner-Programmierung mit MPI923. – 25. 09. 2013

10 Das Argument status in MPI_RECV Eigenschaften der empfangenen Nachricht können unbekannt sein, wenn MPI_ANY_SOURCE als Wert für source MPI_ANY_TAG als Wert für taggewählt wird und wenn die Länge der gesendeten Nachricht beim Empfänger nicht bekannt ist. Das Argument status stellt eine Struktur zur Verfügung, in der diese Eigenschaften hinterlegt sind. Die Abfrage des Status und der damit verbundene Aufwand wird vermieden, wenn als Argument für status MPI_STATUS_IGNORE verwendet wird. Parallelrechner-Programmierung mit MPI1023. – 25. 09. 2013

11 Das Argument status in MPI_RECV C: StrukturFORTRAN: Feld MPI_Status statusinteger status(MPI_STATUS_SIZE) status.MPI_SOURCEstatus(MPI_SOURCE) status.MPI_TAG status(MPI_TAG) status.MPI_ERROR status(MPI_ERROR) MPI_GET_COUNT(status, datatype, count) Berechnet aus den Anzahl der empfangenen Bytes die Zahl count der empfangenen Elemente vom Typ datatype Parallelrechner-Programmierung mit MPI1123. – 25. 09. 2013

12 Verschiedene Modi für blockierendes Senden Gepuffertes Senden: MPI_BSEND(sbuf,... Puffer-Initialisierung: MPI_BUFFER_ATTACH(temp,size) endet, wenn sbuf nach temp kopiert ist: lokale Operation Synchrones Senden: MPI_SSEND(sbuf,... Endet, wenn sbuf nach rbuf kopiert ist: nichlokale Operation Sofortiges Senden: MPI_RSEND(sbuf,... Nur erlaubt, wenn MPI_RECV bereits gestartet ist Standard Implementierung: MPI_SEND(sbuf,... Kurze Nachrichten : in Puffer auf Empfängerseite Lange Nachrichten: synchrones Senden Aufruf von MPI_xSEND endet, wenn sbuf wieder verwendet werden kann Aufruf von MPI_RECV endet, wenn die Nachricht in rbuf abgespeichert ist. Parallelrechner-Programmierung mit MPI1223. – 25. 09. 2013

13 Reihenfolge von Senden und Empfangen Mehrere Nachrichten werden in der Reihenfolge des Sendens empfangen: CALL MPI_COMM_RANK(comm, rank, ierr) IF (rank.EQ.0) THEN CALL MPI_SEND(buf1, count, MPI_INTEGER, 1, tag, comm, ierr) CALL MPI_SEND(buf2, count, MPI_REAL, 1, tag, comm, ierr) ELSE IF (rank.EQ.1) THEN CALL MPI_RECV(buf1, count, MPI_INTEGER, 0, tag, comm, status, ierr) CALL MPI_RECV(buf2, count, MPI_REAL, 0, tag, comm, status, ierr) END IF Parallelrechner-Programmierung mit MPI1323. – 25. 09. 2013

14 Reihenfolge: garantierter Deadlock CALL MPI_COMM_RANK(comm, rank, ierr) IF (rank.EQ.0) THEN CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr) CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr) ELSE IF (rank.EQ.1) THEN CALL MPI_RECV(recvbuf, count, MPI_REAL, 0, tag, comm, status, ierr) CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr) END IF Parallelrechner-Programmierung mit MPI1423. – 25. 09. 2013

15 Reihenfolge: möglicher Deadlock CALL MPI_COMM_RANK(comm, rank, ierr) IF (rank.EQ.0) THEN CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr) CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr) ELSE IF (rank.EQ.1) THEN CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr) CALL MPI_RECV(recvbuf, count, MPI_REAL, 0, tag, comm, status, ierr) END IF Deadlock, wenn die Nachricht auf Senderseite nicht gepuffert wird Parallelrechner-Programmierung mit MPI1523. – 25. 09. 2013

16 Reihenfolge: garantiert kein Deadlock CALL MPI_COMM_RANK(comm, rank, ierr) IF (rank.EQ.0) THEN CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr) CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr) ELSE IF (rank.EQ.1) THEN CALL MPI_RECV(recvbuf, count, MPI_REAL, 0, tag, comm, status, ierr) CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr) END IF Zuerst: NachrichtTask 0 Task 1 Dann:Nachricht Task 1 Task 0 Parallelrechner-Programmierung mit MPI1623. – 25. 09. 2013

17 MPI_SENDRECV : kein Deadlock Parallelrechner-Programmierung mit MPI1723. – 25. 09. 2013 MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype,source, recvtag, comm, status) IN sendbuf initial address of send buffer (choice) IN sendcount number of elements in send buffer (non-negative integer) IN sendtype type of elements in send buffer (handle) IN dest rank of destination (integer) IN sendtag send tag (integer) OUT recvbuf initial address of receive buffer (choice) IN recvcount number of elements in receive buffer (non-negative integer) IN recvtype type of elements in receive buffer (handle) IN source rank of source or MPI_ANY_SOURCE (integer) IN recvtag receive tag or MPI_ANY_TAG (integer) IN comm communicator (handle) OUT status status object (Status)


Herunterladen ppt "GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan"

Ähnliche Präsentationen


Google-Anzeigen