1 / 22

GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Eine Einführung

GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Eine Einführung. Oswald Haan ohaan@gwdg.de. MPI: Message passing interface. MPI : message passing library interface specification m essage passing : Message Passing Programmiermodell ( Datenaustausch zwischen zwei Prozessen )

glen
Download Presentation

GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Eine Einführung

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. GWDG – KursParallelrechner-Programmierung mit MPIMPIEine Einführung Oswald Haan ohaan@gwdg.de

  2. MPI: Message passing interface • MPI : message passing library interface specification • message passing: Message Passing Programmiermodell(DatenaustauschzwischenzweiProzessen) • Erweiterungen(Kollektive Operation,Zugriff auf entfernteSpeicher, DynamischeProzesskontrolle,ParalleleEin-Ausgabe) • library interface: MPI benutztFunktionen und Unterprogramme, die von Fortran oder C Programmenaufgerufenwerden, keineneueProgrammiersprache • specification: Beschreibung, keineImplementierung Parallelrechner-Programmierung mit MPI

  3. Programmiermodell: message passing Verbindungsnetz Verteilung von Daten und Instruktionen auf mehrere Prozessoren Objekte: Lokale Daten, Instruktionen, Lokale PZs, task-id Operationen: opcode op1, op2,...,re1,re2 send(ad,n,tid), recv(ad,n,tid) Reihenfolge: Synchronisation durch blockierendes recv Puffer Puffer Puffer Speicher Speicher Speicher I D I D I D PZ PZ PZ VE VE VE Parallelrechner-Programmierung mit MPI

  4. Programmiermodell: message passing An MPI program consists of autonomous processes, executing their own code, in an MIMD style. The codes executed by each process need not be identical. The processes communicate via calls to MPI communication primitives. Typically, each process executes in its own address space, although shared-memory implementations of MPI are possible. Mehrere Tasks bearbeiten gemeinsam ein paralleles Programm Jeder Task hat lokale task-id zur Identifikation lokalen Adress-Raum für lokale Daten für das lokale Programm für lokale Puffer Parallelrechner-Programmierung mit MPI

  5. MPI: Message passing interface • MPI beinhaltet die Spezifikation der Sprachelemente, die dieZusammenarbeit der Tasks ausder Sichtder lokalenTask beschreibensollen • Die wichtigstenSprachelemente: • sequentielleProgrammiersprachen Fortran und C • Information über Tasks : Task-id (rank) der eigenen und der fremden Tasks • PunktzuPunkt-Kommunikation: Datenaustauschmiteinerfremden Task • GlobaleKommunikation: Datenaustauschmitmehrerenoderallenfremden Tasks • Synchronisation Parallelrechner-Programmierung mit MPI

  6. Entwicklung von MPI 1980-1990 Vorläufer 1994 1996-2009 2012 Parallelrechner-Programmierung mit MPI

  7. MPI-Forum Das MPI-Forum, eine Gruppe von Hardware-Herstellern, Software-Entwicklern und Anwendern hat den Standardisierungsprozess ins Leben gerufen und steuert die Weiterentwicklung des Standards. http://www.mpi-forum.org/ Parallelrechner-Programmierung mit MPI

  8. MPI-Dokumentation Offizielle Dokumentation des Standards (MPI-2.2) durch das MPI-Forum: http://mpi-forum.org/docs/mpi-2.2/mpi22-report.pdf Inoffizielle HTML-Version dieses Dokuments: http://mpi-forum.org/docs/mpi22-report/mpi22-report.htm Open MPI v1.6.4 documentation (man pages)http://www.open-mpi.org/doc/current/ Parallelrechner-Programmierung mit MPI

  9. MPI-Implementierung • Das MPI-Forum legt den MPI-Standard für die Syntax der Schnittstellen und ihre Funktionen fest. Die Implementierung überlässt es anderen. • Aufgaben der Implementierung: • Übersetzung der standardisierten Sprachelemente in Maschinenbefehle, die die zugrundliegende Prozessor- und Verbindungsnetz-Hardware bedienen. • Bereitstellung von Prozeduren zur Erzeugung, Kontrolle und Beendigung von parallelen Tasks auf den Prozessoren • Bei der GWDG verfügbare Implementierungen • OpenMPI: OpenSource Implementierung des MPI-2 Standards • Intel-mpi: Proprietäre Implementierung des MPI-2 Standards Parallelrechner-Programmierung mit MPI

  10. MPI : Vorteile und Nachteile • Trennung von Spezifikation und Implementierung: • Standardisiertes Interface zu Bibliotheksroutinen erlaubt Portabilität • Hardwarespezifische Implementierungen erlauben die bestmögliche Ausnutzung von Hardwareeigenschaften • Nutzungsgerechte Funktionen vereinfachen Programmentwicklung und ermöglichen spezielle Implementierungen mit hoher Effizienz • Parallelisierung mit Message Passing erfordert Aufteilung und Austausch der Daten und Aufteilung der Rechenlast • Unterstützung von vielen Nutzungsformen und Implementierungsarten führt zu einer Vielzahl von z.T. komplexen Bibliotheksroutinen (mehr als 250 MPI-Funktionen) Parallelrechner-Programmierung mit MPI

  11. MPI : Funktionsgruppen Point-to-point communication Datatypes Collective operations Processgroups Communication contexts Processtopologies Environmental Management andinquiry The infoobject Processcreationandmanagement One-sidedcommunication Externalinterfaces Parallel file I/O Language BindingsforFortran, Cand C++ Profilinginterface Parallelrechner-Programmierung mit MPI

  12. MPI-Funktionen; Spezifikation • Beispiel Blockierendes Daten-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-negativeinteger) • IN datatypedatatypeof 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 commcommunicator(handle) • OUT status status object (Status) • IN, OUT, INOUT: Argument wirdalsEingabe, Ausgabeoderbeidesverwendet Parallelrechner-Programmierung mit MPI

  13. MPI: OpaqueObjekte und Handles • MPI verwaltet Speicherfür Puffer und für die interne • Darstellung von MPI-Objekten, wie Kommunikatoren, • Datentypen, usw. Dieser Speicher ist für den Benutzer nicht direkt, sondern nur über sog. Handlesim Zugriff • Ein opaques Objekt und sein Handle ist nur für den zugehörigen Prozess signifikant und kann nicht auf andere Prozesse übertragen werden. • OpaqueObjekte ermöglichen die Nutzung von • Datenobjekten über verschiedene Sprachen hinweg und erlauben eine flexible Verwaltung von Ressourcen. • In Fortran sind alle Handles vom Typ Integer, in C gibt es • unterschiedliche Typen für jede Kategorie. Parallelrechner-Programmierung mit MPI

  14. MPI-Funktionen: Syntax FORTRAN : MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR) <type> BUF(*) INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE),IERROR C : intMPI_Recv(void* buf, intcount, MPI_Datatypedatatype, intsource,int tag, MPI_Comm comm, MPI_Status *status) Fehlerstatus als Argument IERROR bei FORTRAN, als Rückgabewert bei C Parallelrechner-Programmierung mit MPI

  15. MPI: vordefinierteNamen MPI_COMM_WORLD Kommunikationsbereich mit allen beteiligten Prozessen MPI_ANY_TAG, MPI_ANY_SOURCE die Argumente tag bzw. source sind beliebig MPI_STATUS_SIZE Anzahl von Elementen für das Feld status MPI_INTEGER , MPI_REAL, MPI_DOUBLE_PRECISION, … MPI-Namen für Fortran-Datentypen MPI_INT, MPI_FLOAT, MPI_DOUBLE, … MPI-Namen für C-Datentypen Vordefinierte Namen brauchen nicht deklariert zu werden Parallelrechner-Programmierung mit MPI

  16. MPI Programmstruktur Fortran programmain include ´mpif.h´ integer ierror ... call MPI_INIT(ierror) ... Aufrufe von MPI-Routinen ... callMPI_FINALIZE(ierror) ... end C #include "mpi.h" intmain(intargc, char**argv) { ... MPI_Init(&argc, &argv); ... Aufrufe von MPI-Routinen ... MPI_Finalize(); ... } Parallelrechner-Programmierung mit MPI

  17. Start eines MPI-Programms Startmechanismus und Startbefehlssyntax wird von der Implementierung vorgegeben Einfachste Form: mpirun –n 4 ./a.out Startet auf 4 Prozessoren je einen Prozess (Task), der jeweils die gleiche Datei a.out ausführt. SPMD-Modell: Single Program, Multiple Data Jedem Task wird eine eindeutige Identifizierung zugeordnet, mit deren Hilfe die von a.out durchgeführten Befehle differenziert werden können. Parallelrechner-Programmierung mit MPI

  18. MPI-Bezeichnungen Communicator : Die von mpirun parallel gestarteten Tasks, die miteinander kommunizieren MPI_COMM_WORLD: vordefinierter Name des beim Start erzeugten communicators Communicator size Anzahl der im communicator versammelten Tasks Process rank eindeutige Identifizierung der einzelnen Task durch eine ganze Zahl zwischen 0 und size-1 Parallelrechner-Programmierung mit MPI

  19. Obligatotische MPI-Komponenten mpif.h, mpi.h Include-Dateien für Fortran und C mit Deklarationen der vordefinierten Namen und Konstanten MPI_INIT() MPI_FINALIZE() MPI_COMM_SIZE(comm, size) IN comm communicator (handle) OUT size number of processes in the group of comm (integer) MPI_COMM_RANK(comm, rank) IN comm communicator (handle) OUT rank rank of the calling process in group of comm (integer) Parallelrechner-Programmierung mit MPI

  20. Erstes MPI Programm (Fortran) programhello include´mpif.h´ integer ier, np, tid call MPI_INIT(ier) call MPI_COMM_SIZE(MPI_COMM_WORLD, np, ier) call MPI_COMM_RANK(MPI_COMM_WORLD, tid, ier) callMPI_FINALIZE(ier) write(6,*)‘hello on task‘, tid end Parallelrechner-Programmierung mit MPI

  21. Erstes MPI Programm (C) #include "mpi.h" #include<stdio.h> intmain(intargc,char **argv) { intnp, me; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&np); MPI_Comm_rank(MPI_COMM_WORLD,&me); printf("hello %i %i \n",np,me); MPI_Finalize(); return 0; } Parallelrechner-Programmierung mit MPI

  22. Weiterenützliche MPI-Routinen MPI_GET_PROCESSOR_NAME( name, resultlen ) OUT name A unique specifierfor the actual node (character). OUT resultlen Length (in printable characters) of the result returned in name (integer) MPI_WTIME() returns a floating-point number of seconds, representing elapsed wallclock time since some time in the past MPI_WTICK() MPI_WTICK returns the resolution of MPI_WTIME in seconds, i.e. as a double precision value the number of seconds between successive clock ticks. Parallelrechner-Programmierung mit MPI

More Related