paralleles rechnen: mpi · mpi request speichert den status einer kommunikation, wie unsere...

26
Paralleles Rechnen: MPI Christian Engwer 11.12.2015 wissen leben WWU M¨ unster Westf¨ alische Wilhelms-Universit¨ at unster

Upload: others

Post on 19-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

Paralleles Rechnen: MPI

Christian Engwer 11.12.2015wissen lebenWWU Munster

WestfalischeWilhelms-UniversitatMunster

Page 2: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 2 /23

Top 500

I 32 Großrechner in Deutschland unter den Top 500I davon 5 Systeme unter den Top 50

I 8? Hazel Hen (HLRS Stuttgart)I 11? JUQUEEN (FZ Julich)I 23? SuperMUC (LRZ Munchen)I 24? SuperMUC Phase 2 (LRZ Munchen)I 50? JURECA (FZ Julich)

,,

Christian Engwer

Page 3: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 3 /23

SuperMUC

SuperMUC, Das Leibniz-Rechenzentrum, Munchen

I 6.8 Petaflop/s (= 1015 Floating Point Operations per second)I 233.472 CoresI Xeon E5 Prozessoren + Xeon PHII Infiniband Netzwerk

,,

Christian Engwer

Page 4: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 4 /23

Konzepte fur Parallelrechner

P

C

Verbindungsnetzwerk

Speicher M

P

C

P

C

I Gemeinsamer Speicher (bisher betrachtet)I Verteilter Speicher

,,

Christian Engwer

Page 5: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 4 /23

Konzepte fur Parallelrechner

Verbindungsnetzwerk

P C M P C M

I Gemeinsamer Speicher (bisher betrachtet)I Verteilter Speicher

,,

Christian Engwer

Page 6: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 5 /23

MPI: Message Passing Interface

I Portable Bibliothek zum NachrichtenaustauschI Wurde 1993-94 durch ein intern. Gremium entwickeltI 1997 wurde der Standard uberarbeitet (MPI2)I Open-Source Implementieren gibt beispielweise von:

MPICH1 und OpenMPI2

I Eigenschaften von MPI:I Direkte Anbindung an C, C++ und FortranI verschiedene Arten von Punkt-zu-Punkt KommunikationI globale KommunikationI Daten Umwandlung in heterogenen SystemenI Virtuelle Netze & Topologien moglich

1http://www.mpich.org/2http://www.open-mpi.org/

,,

Christian Engwer

Page 7: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 6 /23

Hello World

1 #include <mpi.h>2 #include <iostream >3 #include <unistd.h>4

5 int main(int argc , char **argv)6 {7 int *buf , i, rank , nints , len;8 char hostname [256];9

10 MPI_Init (&argc ,&argv);11 MPI_Comm_rank(MPI_COMM_WORLD , &rank);12 gethostname(hostname ,255);13 std::cout << "Hello world! I am process number: " << rank14 << " on host " << hostname << std::endl;15 MPI_Finalize ();16 return 0;17 }

,,

Christian Engwer

Page 8: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 7 /23

Kompilieren eines Programms

I Das Beispiel ist im SPMD-Stil geschrieben; der MPI Standard legtdies nicht fest und man kann auch andere Paradigmen verwenden.

I Kompilieren eines MPI C-Programmes und starten mit 8 Prozessen:

mpicc -o hello hello.c

mpirun -machinefile machines -np 8 hello

Die Liste der Computer steht in der Datei machines.

Fur C++ Programme heisst der Compiler

mpicxx -o hello hello.cc

,,

Christian Engwer

Page 9: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 8 /23

Initialisierung und Beenden

Bevor irgend ein MPI Befehl aufgerufen werden darf, muss MPI mitMPI_Init initialisiert werden, damit MPI das parallele Programm startenkann.

1 int MPI_Init(int *argc , char *** argv)

Nach dem letzten MPI Aufruf wird MPI_Finalize ausgefuhrt, um allesProzesse ordentlich zu beenden.

1 int MPI_Finalize(void)

,,

Christian Engwer

Page 10: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 9 /23

Kommunikator

MPI erlaubt es Kommunikation auf einem Subset der gestarten Prozessedurchzufuhren, indem virtuelle Netzwerke, sogenannteKommunikatoren, angelegt werden.

I MPI Comm beschreibt einen Kommunikator, eine Menge von Prozessen{0, . . . , P − 1}.

I Des vordefinierte Netzwerk MPI COMM WORLD enthalt alle gestarten Prozesse.

I Virtuelle Topologien: Ein Kommunikator kann zusatzlich eine spezielle Strukturerhalten, z.B. ein mehrdimensionales Feld, oder ein allgemeiner Graph.

I Kontext: Jeder Kommunikator definiert seinen eigenen Kommunikationskontext.

,,

Christian Engwer

Page 11: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 10 /23

Rank und Size

Die Anzahl der Prozesse in einem Kommunikator wird mit MPI_Comm_size bestimmt:

1 int MPI_Comm_size(MPI_Comm comm , int *size)

Innerhalb eines Kommunikators hat jeder Prozess eine eindeutige Nummer, diese wird mitMPI_Comm_rank bestimmt:

1 int MPI_Comm_rank(MPI_Comm comm , int *rank)

,,

Christian Engwer

Page 12: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 11 /23

Beispiel (I)

1 #include <stdio.h>2 #include <string.h>3 #include <mpi.h> // provides MPI macros and functions4 #include <unistd.h>5

6 int main (int argc , char *argv [])7 {8 int my_rank;9 int P;

10 int dest;11 int source;12 int tag =50;13 char hostname [256];14 MPI_Status status;15

16 MPI_Init (&argc ,&argv); // begin of every MPI program17 MPI_Comm_size(MPI_COMM_WORLD ,&P); // number of processes18 MPI_Comm_rank(MPI_COMM_WORLD ,& my_rank ); // my process number19 gethostname(hostname ,255);

,,

Christian Engwer

Page 13: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 12 /23

Beispiel (II)

20

21 // number of current process always between 0 and P-122 if (my_rank !=0) {23 dest = 0;24 MPI_Send(hostname ,strlen(hostname )+1,MPI_CHAR , // Send data25 dest ,tag ,MPI_COMM_WORLD ); // (blocking)26 }27 else {28 for (source =1; source <P; source ++)29 {30 MPI_Recv(hostname ,256, MPI_CHAR ,source ,tag , // Receive data31 MPI_COMM_WORLD ,& status ); // (blocking)32 std::cout << "Reveived a message from process " << source33 << " on machine " << hostname << std::endl;34 }35 }36

37 MPI_Finalize (); // end of every MPI program38 return 0;39 }

,,

Christian Engwer

Page 14: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 13 /23

Ausgabe des Beispielprogramms (mit P=8)

> mpirun -machinefile machines -np 8 ./mpi-name

Reveived a message from process 1 on machine SCHAF03

Reveived a message from process 2 on machine SCHAF05

Reveived a message from process 3 on machine SCHAF07

Reveived a message from process 4 on machine SCHAF11

Reveived a message from process 5 on machine SCHAF13

Reveived a message from process 6 on machine SCHAF14

Reveived a message from process 7 on machine SCHAF15

,,

Christian Engwer

Page 15: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 14 /23

Blockierende Kommunikation

Die Entsprechung zu send und recv bieten

1 int MPI_Send(void *message , int count , MPI_Datatype dt ,

2 int dest , int tag , MPI_Comm comm);

3 int MPI_Recv(void *message , int count , MPI_Datatype dt ,

4 int src , int tag , MPI_Comm comm ,

5 MPI_Status *status );

Die ersten drei Parameter message, count und dt beschreiben die eigentlichen Daten.message ist ein Zeiger auf ein Feld mit count Elementen des Typs dt. Die Angabe desDatentyps erlaubt die automatische Umwandlung durch MPI. Die Parameter dest, tag undcomm beschreiben das Ziel bzw. die Quelle der Nachricht.

MPI bietet verschiedene Varianten von MPI Send (MPI BSend, MPI SSend, MPI RSend), diewir aber jetzt nicht weiter diskutieren wollen.

MPI ANY SOURCE und MPI ANY TAG konnen verwendet werden, um belibige Nachrichten zuempfangen. Damit enthalt MPI Recv die Funktionalitat von recv any.

,,

Christian Engwer

Page 16: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 14 /23

Blockierende Kommunikation

Die Entsprechung zu send und recv bieten

1 int MPI_Send(void *message , int count , MPI_Datatype dt ,

2 int dest , int tag , MPI_Comm comm);

3 int MPI_Recv(void *message , int count , MPI_Datatype dt ,

4 int src , int tag , MPI_Comm comm ,

5 MPI_Status *status );

Die ersten drei Parameter message, count und dt beschreiben die eigentlichen Daten.message ist ein Zeiger auf ein Feld mit count Elementen des Typs dt. Die Angabe desDatentyps erlaubt die automatische Umwandlung durch MPI. Die Parameter dest, tag undcomm beschreiben das Ziel bzw. die Quelle der Nachricht.

MPI bietet verschiedene Varianten von MPI Send (MPI BSend, MPI SSend, MPI RSend), diewir aber jetzt nicht weiter diskutieren wollen.

MPI ANY SOURCE und MPI ANY TAG konnen verwendet werden, um belibige Nachrichten zuempfangen. Damit enthalt MPI Recv die Funktionalitat von recv any.

,,

Christian Engwer

Page 17: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 14 /23

Blockierende Kommunikation

Die Entsprechung zu send und recv bieten

1 int MPI_Send(void *message , int count , MPI_Datatype dt ,

2 int dest , int tag , MPI_Comm comm);

3 int MPI_Recv(void *message , int count , MPI_Datatype dt ,

4 int src , int tag , MPI_Comm comm ,

5 MPI_Status *status );

Die ersten drei Parameter message, count und dt beschreiben die eigentlichen Daten.message ist ein Zeiger auf ein Feld mit count Elementen des Typs dt. Die Angabe desDatentyps erlaubt die automatische Umwandlung durch MPI. Die Parameter dest, tag undcomm beschreiben das Ziel bzw. die Quelle der Nachricht.

MPI bietet verschiedene Varianten von MPI Send (MPI BSend, MPI SSend, MPI RSend), diewir aber jetzt nicht weiter diskutieren wollen.

MPI ANY SOURCE und MPI ANY TAG konnen verwendet werden, um belibige Nachrichten zuempfangen. Damit enthalt MPI Recv die Funktionalitat von recv any.

,,

Christian Engwer

Page 18: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 15 /23

Datenumwandlung

MPI erlaubt die Verwendung in heterogenen Netzen. Hierbei ist es notigmanche Daten an die Darstellung auf der fremden Architekturanzupassen.

MPI definiert die architektur-unabhangigen Datentypen:

MPI CHAR, MPI UNSIGNED CHAR, MPI BYTEMPI SHORT, MPI INT, MPI LONG, MPI LONG LONG INT,MPI UNSIGNED, MPI UNSIGNED SHORT, MPI UNSIGNED LONG,MPI FLOAT, MPI DOUBLE and MPI LONG DOUBLE.

Der MPI Datentyp MPI BYTE wird nie konvertiert.

,,

Christian Engwer

Page 19: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 16 /23

Status

1 typedef struct {

2 int count;

3 int MPI_SOURCE;

4 int MPI_TAG;

5 int MPI_ERROR;

6 } MPI_Status;

MPI_Status ist ein zusammengesetzter Datentyp, der Informationenuber die Anzahl der empfangenen Objekte, den Quellprozess, das Tagund den Fehlerstatus enhalt.

,,

Christian Engwer

Page 20: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 17 /23

Guard Funktion

Die Guard Funktion rprobe liefert

1 int MPI_Iprobe(int source , int tag , MPI_Comm comm ,

2 int *flag , MPI_Status *status );

Es ist eine nicht-blockierende Funktion, die uberpruft, ob eine Nachrichtvorliegt. flag erhalt den Wert true (6= 0) wenn eine Nachricht mitpassendem source und tag empfangen werden kann. Auch hier konnenMPI ANY SOURCE und MPI ANY TAG verwendet werden.

,,

Christian Engwer

Page 21: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 18 /23

Non-blocking Communication

Die Funktionen asend und arecv bietet MPI als

1 int MPI_ISend(void *buf , int count , MPI_Datatype dt,

2 int dest , int tag , MPI_Comm comm ,

3 MPI_Request *req);

4 int MPI_IRecv(void *buf , int count , MPI_Datatype dt,

5 int src , int tag , MPI_Comm comm ,

6 MPI_Request *req);

MPI Request speichert den Status einer Kommunikation, wie unseremsgid.

,,

Christian Engwer

Page 22: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 19 /23

MPI Request-Objekte

Der Status einer Nachricht kann mit Hilfe der MPI Request-Objekte undfolgender Funktion gepruft werden:

1 int MPI_Test(MPI_Request *req , int *flag ,

2 MPI_Status *status );

flag wird auf true ( 6= 0) gesetzt, wenn die Kommunikation, die req

beschreibt abgeschlossen ist. In diesem Fall enthalt status weitereInformationen.

,,

Christian Engwer

Page 23: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 20 /23

Globale Kommunikation

MPI bietet ebenfalls Funktionen zur globalen Kommunikation, welchealle Prozesse eines Kommunikators einschließen.

1 int MPI_Barrier(MPI_Comm comm);

implementiert eine Barriere; alle Prozesse werden blockiert, bis derletzte Prozess die Funktion ausgefuhrt hat.

1 int MPI_Bcast(void *buf , int count , MPI_Datatype dt,

2 int root , MPI_Comm comm);

verteilt eine Nachricht an alle Prozesse eine Kommunikators(Einer-an-Alle Kommunikation).

,,

Christian Engwer

Page 24: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 21 /23

Einsammeln von Daten

MPI hat eine Reihe verschiedener Funktionen um Daten vonverschiedenen Prozessen einzusammeln. Z.B:

1 int MPI_Reduce(void *sbuf , void *rbuf , int count ,

2 MPI_Datatype dt , MPI_Op op, int root ,

3 MPI_Comm comm);

kombiniert die Daten im Sende-Puffer sbuf aller Prozesse durch dieassoziative Operation op (z.B. MPI SUM, MPI MAX oder MPI MIN). DasErgebnis erhalt der Prozesse root in seinen Empfang-Puffer rbuf.

,,

Christian Engwer

Page 25: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 22 /23

Zeitmessung

MPI bietet direkt Funktionen zur Zeitmessung:

1 double MPI_Wtime ();

Der Ruckgabewert sind Sekunden seit einem ,,beliebigen” Zeitpunkt inder Vergangenheit. Die Zeit fur eine spezielle Operation laßt sich also mit

1 double start = MPI_Wtime ();

2 expensive_funktion ();

3 std::cout << "elapsed time = "

4 << MPI_Wtime () - start << std::endl;

bestimmen.

,,

Christian Engwer

Page 26: Paralleles Rechnen: MPI · MPI Request speichert den Status einer Kommunikation, wie unsere msgid.,, Christian Engwer. sen ben WWU M ¨ er WestfWilhelms-UniversitM¨unster ¨alische

wis

sen

lebe

nW

WU

Mun

ster

WestfalischeWilhelms-UniversitatMunster Paralleles Rechnen: MPI 23 /23

Weitere Informationen

MPI: Dokumentation der verschiedenen Message-Passing InterfaceStandardshttp://www.mpi-forum.org/docs/

MPICH-A Portable Implementation of MPIhttp://www.mpich.org/

Open MPI: Open Source High Performance Computinghttp://www.open-mpi.org/

MPI Tutorialshttp://mpitutorial.com/

http://computing.llnl.gov/tutorials/mpi/

http://www.mcs.anl.gov/research/projects/mpi/tutorial/

,,

Christian Engwer