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

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

Message Passing Interface (MPI)
Agenda Sitzung 2 für den Programmaufbau
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
Strukturierter Text.
10. Grundlagen imperativer Programmiersprachen
Lösung 5.1Schleifen 1.while (x < 5)if (x < 5) thenwhile Bif B then { do {{do { x = x + 1; x = x + 1; A A }}}} while (x < 5) while B do {x = x + 1;do {A.
Fakultät für informatik informatik 12 technische universität dortmund Universität Dortmund Middleware Peter Marwedel TU Dortmund, Informatik 12 Germany.
2.4 Kommunikationsdienste des Betriebssystems
der Universität Oldenburg
der Universität Oldenburg
Intelligente Dateisysteme Einführende Bemerkungen Manfred Thaller, Universität zu Köln Köln 17. Oktober 2013.
Verteilte Software - Java - Prozedurale Programmierung 1
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java -
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Java: Dynamische Datentypen
Java: Grundlagen der Sprache
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
Konstruktoren.
Objekte und Arbeitsspeicher
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Zusammenfassung Vorwoche
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Modulare Programmierung
DVG Felder1 Felder. DVG Felder 2 Was sind Felder? Felder sind Reihungen aus endlich vielen Elementen gleichen Typs. Z.B.: Vektoren : (x.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
Einführung in die Programmierung Anweisungen und Datentypen
RelationentheorieObjektorientierte Datenbanken AIFB SS Das ODMG-Objektmodell vs. relationales Modell (1/9) ODMG-Objektmodell Literal_type Atomic_literal.
© Alexander Schwing, 2010Institute of Visual Computing Informatik I for D-MAVT Exercise Session 2.
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan
Programmierung paralleler Algorithmen mit MPI
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Eine Einführung Oswald Haan
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Allgemeine Datentypen Oswald Haan
GWDG – Kurs Parallelrechner-Programmierung mit MPI – Oswald Haan
Einführung in die Programmiersprache C 4
Algorithmen und Datenstrukturen Übungsmodul 6
Equals, Hashcode und CompareTo Micha Kessler
Travelling Salesman Problem (TSP)
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Kollektive Operationen Oswald Haan
Objectives Verstehen was unterDelegate verstanden wird
Datentypen Überblick Datentypen Einfache / fundamentale Datentypen
Programmieren in C Grundlagen C 2
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Grundlagen C 2
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Kollektive Operationen Oswald Haan
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Kollektive Operationen Oswald Haan
C. Boehme, O. Haan, U. Schwardmann GWDG Übungen II Programmierung von Parallelrechnern.
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Eine Einführung
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Einführung Oswald Haan
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Punkt-zu-Punkt-Kommunikation Oswald Haan
Extended Pascal ( Erweitreung von Pascal) Name: Mehmet CELIK Matr :
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Kollektive Operationen Oswald Haan
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan
Variablen und Operatoren. C++ Teil 2: Grundstrukturen Variablen Operatoren Kontrollstrukturen Funktionen Header-Dateien Pointer und Referenzen.
Java Programme nur ein bisschen objektorientiert.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Konstruktoren.
Datentypen: integer, char, string, boolean
Aufgaben zu Rückgabewerten
Variable: typ varName = Wert Kiste: Art Aufschrift  Inhalt
Polymorphie Überladen
Schleifen Datenfelder (Arrays) Verzweigungen
 Präsentation transkript:

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

Nachrichten- Inhalt : 07. – Parallelrechner-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:

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 MPI307. –

Blockierendes Senden mit mpi4py comm.Send(buf, dest = 0, tag = 0) IN comm communicator (MPI comm) IN buf object to be sent (numpy array) IN dest rank of destination (integer) IN tag message tag (integer) comm.send(buf, dest = 0, tag = 0) IN comm communicator (MPI comm) IN buf object to be sent (python object) IN dest rank of destination (integer) IN tag message tag (integer) Parallelrechner-Programmierung mit MPI407. –

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 MPI507. –

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 MPI607. –

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 MPI707. –

MPI-eigene Datentypen: mpi4py (Auswahl) MPI datatype mpi4py datatype MPI.INT signed int MPI.LONG signed long int MPI.FLOAT float MPI.DOUBLE double MPI.LONG_DOUBLE long double MPI.CHAR char Parallelrechner-Programmierung mit MPI807. –

MPI_SEND: Nachrichten-Umschlag Parallelrechner-Programmierung mit MPI907. –

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 MPI1007. –

Blockierendes Empfangen mit mpi4py comm.Recv(buf, source = 0, tag = 0, status = None) IN comm communicator (MPI comm) OUT buf object to be received (numpy array) IN source rank of source (integer) or MPI.ANY_SOURCE IN tag message tag (integer) or MPI.ANY_TAG OUT status status information (Status) buf = comm.recv(source = 0, tag = 0, status = None) IN comm communicator (MPI comm) OUT buf object to be received (python object) IN source rank of source (integer) or MPI.ANY_SOURCE IN tag message tag (integer) or MPI.ANY_TAG OUT status status information (Status) Parallelrechner-Programmierung mit MPI1107. –

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_RECV Aufruf verwendet werden, z.B. um einen genügend großen Empfangsbereich bereitzustellen Parallelrechner-Programmierung mit MPI1207. –

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. In mpi4py ist dieses Verhalten voreingestellt, wenn die Variable status nicht gesetzt wird. Parallelrechner-Programmierung mit MPI1307. –

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 MPI1407. –

Das Argument status in mpi4py mpi4py: status ist Struktur vom Typ Status status = MPI.Status() source = status.Get_source() tag = status.Get_tag() error = status.Get_error() count = status.Get_elements(mpi_datentyp) size = status.Get_count() count: Anzahl empfangener Elemente vom Typ mpi_datentyp size: Größe des empfangenen Objekts in Byte Parallelrechner-Programmierung mit MPI1507. –

Nachricht vor Empfangen prüfen MPI_PROBE(MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status) mpi4py: comm.Probe(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG, status=status) Parallelrechner-Programmierung mit MPI1607. –

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 MPI1707. –

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 MPI1807. –

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 MPI1907. –

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 MPI2007. –

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 MPI2107. –

MPI_SENDRECV : kein Deadlock Parallelrechner-Programmierung mit MPI2207. – 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)

Sendrecv mit mpi4py Parallelrechner-Programmierung mit MPI2307. – comm.Sendrecv (sendbuf, dest=0, sendtag=0, recvbuf=None, source=0, recvtag=0, status=None) IN comm communicator (MPI comm) IN sendbuf object to be sent (numpy array) IN dest rank of destination (integer) IN sendtag send tag (integer) OUT recvbuf object to be received (numpy array) IN source rank of source (integer) or MPI.ANY_SOURCE IN recvtag receive tag (integer) or MPI.ANY_TAG OUT status status information (Status)