Plan prezentacji MPIicsr.agh.edu.pl/~polak/wyklady/TPR/MPI.pdfPlan prezentacji Wstęp Komunikacja...
Transcript of Plan prezentacji MPIicsr.agh.edu.pl/~polak/wyklady/TPR/MPI.pdfPlan prezentacji Wstęp Komunikacja...
MPI
MPIPrzedmiot: Techniki Programowania Równoległego
Dr inż. Stanisław Polak
Akademia Górniczo - Hutnicza w Krakowie, Katedra Informatyki
http://www.icsr.agh.edu.pl/~polak/
Dr inż. Stanisław Polak 1 Przedmiot: Techniki Programowania Równoległego
MPI
Plan prezentacji
Wstęp
Komunikacja punkt-punkt
Komunikacja kolektywna
Pochodne typy danych
MPE
Dr inż. Stanisław Polak 2 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Ogólna charakterystyka MPI
I Próba połączenia zalet istniejącychsystemów „message passingu”.
I Twórcy standardu: większość producentówmaszyn współbieżnych, naukowcyuniwersyteccy, przedstawiciele ośrodkówrządowych.
I Przenośność.I Udostępnia zbiór precyzyjnie
zdefiniowanych metod, które mogą byćefektywnie zaimplementowane. Punktwyjściowy do stworzenia praktycznego,przenośnego, elastycznego i efektywnegonarzędzia dla „message passingu”.
Dr inż. Stanisław Polak 3 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Główne założenia MPI
I Efektywna komunikacjaI Niska szczegółowośćI „Znajomy” interfejsI Komunikacja P-P oraz zbiorowaI Działanie na wielu platformachI Semantyka niezależna od językaI „Thread-safe”
Dr inż. Stanisław Polak 4 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Dalsze informacje
I MIMDI Własna przestrzeń adresowa.I WielowątkowośćI Rozłożenie obciążeniaI Nr ∈ [0 .. Rozmiar grupy – 1]I ≈ 400 funkcji
Dr inż. Stanisław Polak 5 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Integracja MPI z językiem C
I Deklaracje: ISO CI Implementacje mogą oferować obsługę MPI za pomocą obiektówI MPI Xxxx xxx()
I MPI XXXXXI MPI SUCCESS
Dr inż. Stanisław Polak 6 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Pierwszy program w MPI
1 #include "mpi.h"2 #include <s t d i o . h>3 int main ( int argc , char ∗∗argv )4 {5 MPI Init( &argc , &argv ) ;6 printf( "Hello world\n" ) ;7 MPI Finalize ( ) ;8 return 0 ;9 }
Dr inż. Stanisław Polak 7 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Kompilacja programu równoległegoImplementacja „MPICH2”
KompilacjaI Program w C
I mpicc -o program program.cI Program w C++
I mpic++ -o program program.cpp
Wybrane opcje kompilatoraI -profile=mpe mpilogI -cc=nazwa
Dr inż. Stanisław Polak 8 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Uruchomienie programu równoległegoImplementacja „MPICH2”
1 #Uruchomien ie jednakowego zestawu p ro c e s ów2 mpiexec −n <liczba uruchamianych procesów> . / program3 #Uruchomien ie r ó ż nego zestawu p ro c e s ów − obydwa programy d z i e l ą wspó l n y
komunikator MPI COMMWORLD4 mpiexec −n 1 −host vnode−01 . / master : −n 2 −host vnode−02 . / slave
Przydatne opcjeI -machinefileI -configfileI -l
Dr inż. Stanisław Polak 9 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Program „Jumpshot”
Dr inż. Stanisław Polak 10 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Mierzenie czasu
I double MPI Wtime()
1 #include "mpi.h"2 #include <s t d i o . h>34 int main ( int argc , char ∗argv [ ] )5 {6 double t1 , t2 ;78 MPI_Init ( 0 , 0 ) ;9 t1 = MPI Wtime ( ) ;
10 sleep ( 1 ) ;11 t2 = MPI Wtime ;12 printf ( "MPI_Wtime measured a 1 second sleep to be: %1.2f\n" , t2−t1 ) ;13 fflush ( stdout ) ;14 MPI_Finalize ( ) ;15 return 0 ;16 }
Na wyjściu
MPI_Wtime measured a 1 second sleep to be: 1.00
Dr inż. Stanisław Polak 11 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Komunikator
I MPI COMM WORLD
I Specyfikuje grupę procesówI Brak interferencji pomiędzy komunikatami należącymi do różnych
komunikatorówI Jeden proces ∈ kilka komunikatorów?I Komunikator = grupa + kontekst
Dr inż. Stanisław Polak 12 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Informacje o komunikatorze
1 #include "mpi.h"2 #include <s t d i o . h>3 int main ( int argc , char ∗argv [ ] )4 {5 int rank , numprocs ;67 MPI_Init(&argc ,&argv ) ;8 MPI Comm size( MPI_COMM_WORLD ,&numprocs ) ;9 MPI Comm rank( MPI_COMM_WORLD ,&rank ) ;
10 if ( rank == 0) /∗ code f o r p r o c e s s z e r o ∗/11 printf ( "Proces master\n" ) ;12 else13 printf ( "Hello , world. I am %d of %d\n" , rank , numprocs ) ;14 fflush ( stdout ) ;15 MPI_Finalize ( ) ;16 return 0 ;17 }
hello.c
Na wyjściu
mpiexec -n 4 ./helloProces masterHello, world. I am 1 of 4Hello, world. I am 2 of 4Hello, world. I am 3 of 4
Rank ∈ [0..Rozmiarkomunikator − 1]
Dr inż. Stanisław Polak 13 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Obsługa środowiska MPI
1 #include "mpi.h"2 #include <s t d i o . h>34 int main ( int argc , char ∗argv [ ] )5 {6 int numtasks , rank , rc ;78 MPI Init(&argc ,&argv ) ;9
10 // Zast ąp domyś l n y hand l e r obs ł ug i b ł ędów ’MPI ERRORS ARE FATAL ’ , handlerem ’MPI ERRORS RETURN ’
11 MPI Comm set errhandler( MPI_COMM_WORLD , MPI_ERRORS_RETURN ) ;1213 rc=MPI_Comm_size ( MPI_COMM_WORLD ,&numtasks ) ;14 if ( rc != MPI_SUCCESS ) {15 perror ( "Problem with communicator. Terminating .\n" ) ;16 MPI Abort( MPI_COMM_WORLD , rc ) ;17 /∗ No f u r t h e r code w i l l e x e cu t e ∗/18 }1920 MPI Finalize ( ) ;21 }
Dr inż. Stanisław Polak 14 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Obiekt info
1 . . .2 MPI Info create( &info1 ) ;3 MPI Info set( info1 , "host" , "myhost.myorg.org" ) ;4 MPI Info set( info1 , "file" , "runfile.txt" ) ;5 MPI Info set( info1 , "soft" , "2:1000:4 ,3:1000:7" ) ;6 MPI Info dup( info1 , &info2 ) ;7 MPI Info get nkeys( info2 , &nkeys2 ) ;8 MPI Info get nkeys( info1 , &nkeys1 ) ;9 if ( nkeys1 != nkeys2 ) {
10 printf ( "Dup’ed info has a different number of keys; is %d should be %d\n" ,nkeys2 , nkeys1 ) ;
11 fflush ( stdout ) ;12 }13 for ( i=0; i<nkeys1 ; i++) {14 /∗ MPI r e q u i r e s t ha t the keys a r e i n the same o r d e r a f t e r the dup ∗/15 MPI Info get nthkey( info1 , i , key1 ) ;16 MPI Info get nthkey( info2 , i , key2 ) ;17 if ( strcmp ( key1 , key2 ) ) {18 printf ( "keys do not match: %s should be %s\n" , key2 , key1 ) ;19 fflush ( stdout ) ;20 }21 }22 . . .23 MPI Info free( &info1 ) ;24 MPI Info free( &info2 ) ;25 . . .
Dr inż. Stanisław Polak 15 Przedmiot: Techniki Programowania Równoległego
Wstęp MPI
Komunikaty MPI
I Typy niezależne:I MPI CHAR,I MPI SHORT,I MPI INT,I MPI LONG,I MPI UNSIGNED CHAR,I MPI UNSIGNED SHORT,I MPI UNSIGNED,I MPI UNSIGNED LONG,I MPI FLOAT,I MPI LONG DOUBLE,I MPI BYTE,I MPI PACKED
I Zgodność typów
Dr inż. Stanisław Polak 16 Przedmiot: Techniki Programowania Równoległego
Komunikacja punkt-punkt MPI
Komunikacja „punkt-punkt”
0 12
3
4
wyślij(1,. . . ) odbierz(0,. . . )
wyślij(2,. . . )odbierz(0,. . . )
wyślij(3,. . . )
odbierz(0,. . . )
wyślij(4,. . . )
odbierz(0,. . . )
Dr inż. Stanisław Polak 17 Przedmiot: Techniki Programowania Równoległego
Komunikacja punkt-punkt MPI
Reguły komunikacji punkt-punkt
I Zachowanie kolejnościI PostępI Brak uczciwości
Dr inż. Stanisław Polak 18 Przedmiot: Techniki Programowania Równoległego
Komunikacja punkt-punkt MPI
Tryby nadawania i odbierania
I NadawanieI tryb blokującyI tryb nieblokujący
I OdbieranieI tryb blokującyI tryb nieblokujący
Dr inż. Stanisław Polak 19 Przedmiot: Techniki Programowania Równoległego
Komunikacja punkt-punkt MPI
Tryby komunikacji
I SynchronicznyI BuforowanyI PrzygotowanyI Standardowy
Dr inż. Stanisław Polak 20 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Nazwy procedur do wysyłki / odbierania danych
Nadawnie
Tryb Wywołanie MPIStandardowy MPI Send()Przygotowany MPI Rsend()Synchroniczny MPI Ssend()Buforowany MPI Bsend()
Odbieranie
Tryb Wywołanie MPIStandardowy MPI Recv()
Dr inż. Stanisław Polak 21 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Nadawanie w trybie synchronicznym
I int MPI Ssend(void *buf, int count, MPI Datatype datatype, int dest, inttag, MPI Comm comm)
Dr inż. Stanisław Polak 22 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Nadawanie w trybie buforowanym
I int MPI Buffer attach(void *buffer, int size)I int MPI Pack size(int incount,MPI Datatype datatype, MPI Comm comm,
int *size)I int MPI Buffer detach(void *buffer, int *size)
Dr inż. Stanisław Polak 23 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Nadawanie w trybie przygotowanym
1 . . .2 if ( rank == 0){3 for ( i=0; i<10; i++)4 buffer [ i ] = i ;56 MPI Rsend( buffer , 10 , MPI_INT , 1 , 123 , MPI_COMM_WORLD ) ;7 }8 . . .
Dr inż. Stanisław Polak 24 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Nadawanie w trybie standardowym
1 . . .2 if ( rank == 0){3 for ( i=0; i<10; i++)4 buffer [ i ] = i ;56 MPI Send( buffer , 10 , MPI_INT , 1 , 123 , MPI_COMM_WORLD ) ;7 }8 . . .
Dr inż. Stanisław Polak 25 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Standardowe blokujące odbieranie danych
I int MPI Recv(void *buf, int count, MPI Datatype datatype, int source, inttag, MPI Comm comm, MPI Status *status)
I MPI ANY SOURCEI MPI PROC NULLI MPI ANY TAGI status.MPI SOURCEI status.MPI TAG
I int MPI Probe(int source, int tag, MPI Comm comm, MPI Status *status)I int MPI Get count( MPI Status *status, MPI Datatype datatype, int
*count)
1 . . .2 for ( i=0; i<3; i++) {3 tag = i ;4 . . .5 MPI Probe( MPI_ANY_SOURCE , tag , MPI_COMM_WORLD , &status ) ;6 MPI Get count(&status , MPI_INT , &count ) ;7 buf=(int ∗) calloc ( count , sizeof ( int ) ) ;8 MPI Recv(buf, count, MPI INT, src, tag, comm, &status) ;9 }
10 . . .
Dr inż. Stanisław Polak 26 Przedmiot: Techniki Programowania Równoległego
Blokująca Komunikacja punkt-punkt MPI
Wymiana komunikatów bez zakleszczania
I int MPI Sendrecv( void *sendbuf, int sendcount, MPI Datatype sendtype,int dest, int sendtag, void *recvbuf, int recvcount, MPI Datatype recvtype,int source, int recvtag, MPI Comm comm, MPI Status *status )
1 . . .2 right = ( rank + 1) % numprocs ;3 left = rank − 1 ;4 if ( left < 0)5 left = numprocs − 1 ;6 MPI_Sendrecv ( buffer , 10 , MPI_INT , left , 123 , buffer2 , 10 , MPI_INT , right , 123 ,
MPI_COMM_WORLD , &status ) ;7 . . .
Dr inż. Stanisław Polak 27 Przedmiot: Techniki Programowania Równoległego
Nieblokująca Komunikacja punkt-punkt MPI
Nazwy procedur do wysyłki / odbierania danych
Nadawnie
Tryb Wywołanie MPIStandardowy MPI Isend()Przygotowany MPI Irsend()Synchroniczny MPI Issend()Buforowany MPI Ibsend()
I int MPI I[rsb]?send(void *buf, int count, MPI Datatype datatype, int dest,int tag, MPI Comm comm, MPI Request *request)
Odbieranie
Tryb Wywołanie MPIStandardowy MPI Irecv()
I int MPI Irecv(void *buf, int count, MPI Datatype datatype, int source, inttag, MPI Comm comm, MPI Request *request)
Dr inż. Stanisław Polak 28 Przedmiot: Techniki Programowania Równoległego
Nieblokująca Komunikacja punkt-punkt MPI
Wysyłanie i odbieranie danych
1 . . .2 right = ( rank + 1) % numprocs ;3 left = rank − 1 ;4 if ( left < 0)5 left = numprocs − 1 ;67 MPI Iprobe( MPI_ANY_SOURCE , MPI_ANY_TAG , MPI_COMM_WORLD , &flag , &status ) ;8 if ( flag )9 printf ( "Przybył komunikat od procesu o ranku %d\n" , status . MPI_SOURCE ) ;
10 MPI Irecv( buffer , 10 , MPI_INT , left , 123 , MPI_COMM_WORLD , &request ) ;11 . . .12 MPI_Wait(&request , &status ) ;13 MPI Isend( buffer2 , 10 , MPI_INT , right , 123 , MPI_COMM_WORLD , &request2 ) ;14 . . .15 MPI_Wait(&request2 , &status ) ;16 . . .
Dr inż. Stanisław Polak 29 Przedmiot: Techniki Programowania Równoległego
Nieblokująca Komunikacja punkt-punkt MPI
Testowanie zakończenia komunikacji
„Czekaj” „Test”MPI Wait() MPI Test()MPI Waitany() MPI Testany()MPI Waitall() MPI Testall()MPI Waitsome() MPI Testsome()
Dr inż. Stanisław Polak 30 Przedmiot: Techniki Programowania Równoległego
Nieblokująca Komunikacja punkt-punkt MPI
Przykład użycia funkcji typu „Czekaj”
1 . . .2 int index ;3 MPI_Request request [ 2 ] ;4 MPI_Status status [ 2 ] ;5 . . .6 if ( rank == 1)7 MPI_Send ( buffer1 , 4 , MPI_INT , 0 , 123 , MPI_COMM_WORLD ) ;8 if ( rank == 2)9 MPI_Send ( buffer2 , 4 , MPI_FLOAT , 0 , 123 , MPI_COMM_WORLD ) ;
1011 if ( rank == 0)12 {13 MPI_Irecv ( buffer1 , 4 , MPI_INT , MPI_ANY_SOURCE , 123 , MPI_COMM_WORLD , &request [ 0 ] ) ;14 MPI_Irecv ( buffer2 , 4 , MPI_FLOAT , MPI_ANY_SOURCE , 123 , MPI_COMM_WORLD , &request [ 1 ] ) ;15 printf ( "Czekam na zakończenie jednej z dwóch komunikacji\n" ) ;16 MPI Waitany ( 2 , request , &index , status ) ;17 printf ( "Zakończyła się komunikacja o indeksie %d, której nadawcą jest proces o ranku %d\n" ,
index , status [ index ] . MPI_SOURCE ) ;18 }19 . . .
Na wyjściu
Czekam na zakończenie jednej z dwóch komunikacjiZakończyła się komunikacja o indeksie 0, której nadawcą jest proces o ranku 1
Dr inż. Stanisław Polak 31 Przedmiot: Techniki Programowania Równoległego
Nieblokująca Komunikacja punkt-punkt MPI
Przykład użycia funkcji typu „Test”1 . . .2 MPI_Request request [ 4 ] ;3 MPI_Status status [ 4 ] ;4 int index [ 4 ] ;5 . . .6 if ( rank == 0) {7 int remaining = 3 ;8 for ( i=1; i < numprocs ; i++)9 MPI_Irecv(&buffer [ i ] , 1 , MPI_INT , MPI_ANY_SOURCE , 123 , MPI_COMM_WORLD , &request [ i−1]) ;
10 while ( remaining > 0) {11 printf ( "Sprawdzam czy zakończyła się, co najmniej , jedna z komunikacji\n" ) ;12 MPI Testsome( numprocs−1, request , &count , index , status ) ;13 if ( count > 0) {14 for ( i=0;i<count ; i++)15 printf ( "Zakończyła się komunikacja nr %d\n" , index [ i ] ) ;16 remaining −= count ;17 }18 else19 sleep ( 1 ) ;20 }21 }22 else23 MPI_Send ( buffer , 1 , MPI_INT , 0 , 123 , MPI_COMM_WORLD ) ;24 . . .
testsome.c
Na wyjściu
mpiexec -n 4 ./testsomeSprawdzam czy zakończyła się, co najmniej, jedna z komunikacjiZakończyła się komunikacja nr 0Sprawdzam czy zakończyła się, co najmniej, jedna z komunikacjiZakończyła się komunikacja nr 1Sprawdzam czy zakończyła się, co najmniej, jedna z komunikacjiZakończyła się komunikacja nr 2
Dr inż. Stanisław Polak 32 Przedmiot: Techniki Programowania Równoległego
Nieblokująca Komunikacja punkt-punkt MPI
Obsługa żądań trwałych
Komunikacja bez użycia żądań trwałych
1 . . .2 MPI_Request request ;3 MPI_Status status ;4 . . .5 if ( rank == 0){6 for ( i=0 ; i< 100 ; i++) {7 MPI_Isend ( buf , 10 , MPI_INT , 1 , 123 ,
MPI_COMM_WORLD , &request ) ;8 . . .9 MPI_Wait(&request , &status ) ;
10 . . .11 }12 . . .13 }14 if ( rank == 1){15 for ( i=0 ; i< 100 ; i++) {16 MPI_Irecv ( rbuf , 10 , MPI_INT , MPI_ANY_SOURCE
, 123 , MPI_COMM_WORLD , &request ) ;17 . . .18 do {19 MPI_Test(&request , &flag , &status ) ;20 . . .21 } while ( flag == 0) ;22 . . .23 }24 . . .25 }26 . . .
Komunikacja z użyciem żądań trwałych
1 . . .2 MPI_Request request ;3 MPI_Status status ;4 . . .5 if ( rank == 0){6 /∗ Utwó r z trwa ł e ż ą dan i a wys ł an i a danych ∗/7 MPI Send init( buf , 10 , MPI_INT , 1 , 123 ,
MPI_COMM_WORLD , &request ) ;8 for ( i=0 ; i< 100 ; i++) {9 MPI Start(&request ) ; /∗ Uż y j tego ż ą dan i a ∗/
10 . . .11 MPI_Wait(&request , &status ) ;12 . . .13 }14 MPI Request free(&request ) ;15 . . .16 }17 if ( rank == 1){18 /∗ Utwó r z trwa ł e ż ą dan i a odb i o ru danych ∗/19 MPI Recv init( rbuf , 10 , MPI_INT , MPI_ANY_SOURCE ,
123 , MPI_COMM_WORLD , &request ) ;20 for ( i=0 ; i< 100 ; i++) {21 MPI Start(&request ) ;22 . . .23 do {24 MPI_Test(&request , &flag , &status ) ;25 . . .26 } while ( flag == 0) ;27 . . .28 }29 MPI Request free(&request ) ;30 . . .31 }32 . . .
Dr inż. Stanisław Polak 33 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Komunikacja kolektywnaPrzykład zastosowania
Iloczyn skalarny
x · y =
N∑i=1
xiyi
x1 . . . xN/2 xN/2+1 . . . xN y1 . . . yN/2 yN/2+1 . . . yN’x’: ’y’:
x1 . . . xN/2 xN/2+1 . . . xN
Proces ’1’ Proces ’2’
y1 . . . yN/2 yN/2+1 . . . yN
* * * * * *∑ ∑
= =
il1 il2+=
il
Dr inż. Stanisław Polak 34 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Komunikacja kolektywnaWstęp
I Wszystkie procesy biorą udział w komunikacjiI Substytut P-PI Synchronizacja nadawcy z odbiorcą — zależy od implementacjiI Rozłączność (P-P)
PodobieństwaI Komunikat jest tablicą zawierającą
dane określonego typuI Zgodność typów po stronie
nadawcy i odbiorcyI Występuje w formie blokującej i
nieblokującej
RóżniceI Brak „etykiet”I Wysłana wiadomość musi wypełnić
wyspecyfikowany bufor odbiorczyI Rozłączność komunikacji
blokującej i nieblokującej
Dr inż. Stanisław Polak 35 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
SynchronizacjaI int MPI Barrier( MPI Commcomm )
I int MPI Ibarrier( MPI Commcomm, MPI Request *request )
1 . . .2 if ( rank == 1){3 printf ( "%d: Wykonuje sleep (1)\n" , rank ) ;4 fflush ( stdout ) ;5 sleep ( 1 ) ;6 }7 printf ( "%d: Przed MPI_Barrier\n" , rank ) ;8 fflush ( stdout ) ;9 MPI Barrier( MPI_COMM_WORLD ) ;
10 printf ( "%d: Po MPI_Barrier\n" , rank ) ;11 fflush ( stdout ) ;12 if ( rank == 0){13 printf ( "%d: Wykonuje sleep (1)\n" , rank ) ;14 fflush ( stdout ) ;15 sleep ( 1 ) ;16 }17 printf ( "%d: Przed MPI_Ibarrier\n" , rank ) ;18 fflush ( stdout ) ;19 MPI Ibarrier( MPI_COMM_WORLD ,&request ) ;20 printf ( "%d: Po MPI_Ibarrier\n" , rank ) ;21 fflush ( stdout ) ;22 printf ( "%d: Przed MPI_Wait\n" , rank ) ;23 fflush ( stdout ) ;24 MPI_Wait(&request ,&status ) ;25 printf ( "%d: Po MPI_Wait\n" , rank ) ;26 fflush ( stdout ) ;27 . . .
Na wyjściu
1: Wykonuje sleep(1)0: Przed MPI_Barrier2: Przed MPI_Barrier1: Przed MPI_Barrier0: Po MPI_Barrier0: Wykonuje sleep(1)1: Po MPI_Barrier1: Przed MPI_Ibarrier1: Po MPI_Ibarrier1: Przed MPI_Wait2: Po MPI_Barrier2: Przed MPI_Ibarrier2: Po MPI_Ibarrier2: Przed MPI_Wait0: Przed MPI_Ibarrier0: Po MPI_Ibarrier0: Przed MPI_Wait2: Po MPI_Wait0: Po MPI_Wait1: Po MPI_Wait
Dr inż. Stanisław Polak 36 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Rozgłaszanie
I int MPI Bcast( void *buffer, int count, MPI Datatypedatatype, int root, MPI Comm comm )
I int MPI Ibcast( void *buffer, int count, MPI Datatypedatatype, int root, MPI Comm comm, MPI Request *request )
1 . . .2 int buf [6]={−1,−1,−1,−1,−1,−1};3 . . .4 if ( rank == 1)5 for ( i=0 ; i<6 ; i++)6 buf [ i ]=i+1;7 MPI Bcast( buf , 6 , MPI_INT , 1 , MPI_COMM_WORLD ) ;8 for ( i=0 ; i<6 ; i++)9 printf ( "%d: buf[%d]=%d\n" , rank , i , buf [ i ] ) ;
10 . . .
-1 -1 -1 -1 -1 -1 1 2 3 4 5 6 -1 -1 -1 -1 -1 -1
1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6
Zawartość ’buf’ przed
rank=0 rank=1 rank=2
Zawartość ’buf’ po
Dr inż. Stanisław Polak 37 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
RozsiewanieI int MPI Scatter( void *sendbuf, int sendcnt, MPI Datatypesendtype, void *recvbuf, int recvcnt, MPI Datatype recvtype,int root, MPI Comm comm )
I int MPI Iscatter( ..., MPI Request *request )
1 . . .2 int sendbuf [6]={−1,−1,−1,−1,−1,−1};3 int recvbuf [2]={−1,−1};4 . . .5 if ( rank == 1)6 for ( i=0 ; i<6 ; i++)7 in [ i ]=i+1;8 MPI Scatter( sendbuf , 2 , MPI_INT , recvbuf , 2 , MPI_INT , 1 , MPI_COMM_WORLD ) ;9 for ( i=0 ; i<2 ; i++)
10 printf ( "%d: recvbuf [%d]=%d\n" , rank , i , recvbuf [ i ] ) ;11 . . .
-1 -1 -1 -1 -1 -1
1 2 3 4 5 6
-1 -1 -1 -1 -1 -1 1 2 3 4 5 6 -1 -1 -1 -1 -1 -1
Zawartość ’recvbuf’ przed
Zawartość ’sendbuf’ przed i po
rank=0 rank=1 rank=2
Zawartość ’recvbuf’ po
Dr inż. Stanisław Polak 38 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Rozsiewanie w częściach
I int MPI Scatterv(const void *sendbuf, const int *sendcounts,const int *displs, MPI Datatype sendtype, void *recvbuf, intrecvcount, MPI Datatype recvtype, int root, MPI Comm comm)
I int MPI Iscatterv( ..., MPI Request *request)
1 int sendbuf [7]={−1,−1,−1,−1,−1,−1,−1};2 int recvbuf [2]={−1,−1};3 int sendcounts [3]={2 ,2 ,2};4 int displs [3]={ 0 , 4 , 2 };5 . . .6 if ( rank == 1)7 for ( i=0 ; i<7 ; i++)8 in [ i ]=i+1;9 MPI Scatterv( sendbuf , sendcounts , displs , MPI_INT , recvbuf , 2 , MPI_INT , 1 , MPI_COMM_WORLD ) ;
10 for ( i=0 ; i<2 ; i++)11 printf ( "%d: recvbuf [%d]=%d\n" , rank , i , recvbuf [ i ] ) ;12 . . .
-1 -1 -1 -1 -1 -1
1 2 5 6 3 4
-1 -1 -1 -1 -1 -1 1 2 3 4 5 6 -1 -1 -1 -1 -1 -1
Zawartość ’recvbuf’ przed
Zawartość ’sendbuf’ przed i po
rank=0 rank=1 rank=2
Zawartość ’recvbuf’ po
Dr inż. Stanisław Polak 39 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Zbieranie przez pojedynczy proces
I int MPI Gather(void *sendbuf, int sendcnt, MPI Datatypesendtype, void *recvbuf, int recvcnt, MPI Datatype recvtype,int root, MPI Comm comm)
I int MPI Igather( ..., MPI Request *request)
1 . . .2 int sendbuf [2]={−1,−1};3 int recvbuf [6]={−1,−1,−1,−1,−1,−1};4 . . .5 for ( i=0 ; i<2 ; i++)6 sendbuf [ i ]=rank ;7 MPI Gather( sendbuf , 2 , MPI_INT , recvbuf , 2 , MPI_INT , 1 , MPI_COMM_WORLD ) ;8 if ( rank == 1)9 for ( i=0 ; i<6 ; i++)
10 printf ( "recvbuf [%d]=%d\n" ,i , recvbuf [ i ] ) ;11 . . .
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 0 0 1 1 2 2 -1 -1 -1 -1 -1 -1
0 0 1 1 2 2
Zawartość ’recvbuf’ przed
Zawartość ’sendbuf’ przed i po
Zawartość ’recvbuf’ po
Dr inż. Stanisław Polak 40 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Zbieranie przez pojedynczy proces do określonych lokalizacji
I int MPI Gatherv(void *sendbuf, int sendcount, MPI Datatypesendtype, void *recvbuf, int recvcounts, int *displs,MPI Datatype recvtype, int root, MPI Comm comm)
I int MPI Igatherv( ..., MPI Request *request)
1 . . .2 int sendbuf [2]={−1,−1};3 int recvbuf [7]={−1,−1,−1,−1,−1,−1,−1};4 int recvcounts [3]={2 ,2 ,2};5 int displs [3]={ 0 , 3 , 5 };6 . . .7 for ( i=0 ; i<2 ; i++)8 sendbuf [ i ]=rank ;9 MPI Gatherv( sendbuf , 2 , MPI_INT , recvbuf , recvcounts , displs , MPI_INT , 1 , MPI_COMM_WORLD ) ;
10 if ( rank == 1)11 for ( i=0 ; i<7 ; i++)12 printf ( "recvbuf [%d]=%d\n" ,i , recvbuf [ i ] ) ;
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 0 0 -1 1 1 2 2 -1 -1 -1 -1 -1 -1 -1
0 0 1 1 2 2
Zawartość ’recvbuf’ przed
Zawartość ’sendbuf’ przed i po
Zawartość ’recvbuf’ po
Dr inż. Stanisław Polak 41 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Zbieranie przez wszystkie procesyI int MPI Allgather ( void *sendbuf, int sendcount,MPI Datatype sendtype, void *recvbuf, int recvcount,MPI Datatype recvtype, MPI Comm comm)
I int MPI Allgatherv ( void *sendbuf, int sendcount,MPI Datatype sendtype, void *recvbuf, int *recvcounts, int*displs, MPI Datatype recvtype, MPI Comm comm)
1 . . .2 int sendbuf [2]={−1,−1};3 int recvbuf [6]={−1,−1,−1,−1,−1,−1};4 . . .5 for ( i=0 ; i<2 ; i++)6 sendbuf [ i ]=rank ;7 MPI Allgather( sendbuf , 2 , MPI_INT , recvbuf , 2 , MPI_INT , MPI_COMM_WORLD ) ;8 if ( rank == 1)9 for ( i=0 ; i<6 ; i++)
10 printf ( "recvbuf [%d]=%d\n" ,i , recvbuf [ i ] ) ;11 . . .
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
0 0 1 1 2 2 0 0 1 1 2 2 0 0 1 1 2 2
0 0 1 1 2 2
Zawartość ’recvbuf’ przed
Zawartość ’sendbuf’ przed i po
Zawartość ’recvbuf’ po
Dr inż. Stanisław Polak 42 Przedmiot: Techniki Programowania Równoległego
Komunikacja kolektywna MPI
Rozsiewanie i zbieranie przez wszystkie procesyI int MPI Alltoall( void *sendbuf, int sendcount, MPI Datatypesendtype, void *recvbuf, int recvcnt, MPI Datatype recvtype,MPI Comm comm )
I int MPI Alltoallv(const void *sendbuf, const int*sendcounts,const int *sdispls, MPI Datatype sendtype, void*recvbuf,const int *recvcounts, const int *rdispls,MPI Datatype recvtype, MPI Comm comm)
1 . . .2 int sendbuf [ 3 ] [ 2 ] ={1 , 2 , 3 , 4 , 5 , 6} ;3 int recvbuf [2]={−1,−1};4 . . .5 MPI Alltoall ( sendbuf , 2 , MPI_INT , recvbuf , 2 , MPI_INT , MPI_COMM_WORLD ) ;6 for ( i=0 ; i<2 ; i++)7 printf ( "%d: recvbuf [%d]=%d\n" , rank , i , recvbuf [ i ] ) ;8 . . .
Na wyjściu
2: recvbuf[0]=52: recvbuf[1]=60: recvbuf[0]=10: recvbuf[1]=21: recvbuf[0]=31: recvbuf[1]=4
Dr inż. Stanisław Polak 43 Przedmiot: Techniki Programowania Równoległego
Obliczenia globalne Komunikacja kolektywna MPI
Obliczenia globalneWstęp
I Suma, maksimum, itp.I Operacje — predefiniowane lub własneI Wyniki — jeden lub wszystkie procesy
Dr inż. Stanisław Polak 44 Przedmiot: Techniki Programowania Równoległego
Obliczenia globalne Komunikacja kolektywna MPI
Redukcja
I int MPI Reduce(void *sendbuf, void *recvbuf, int count,MPI Datatype data type, MPI Op op, int root, MPI Comm comm)
I int MPI Ireduce(..., MPI Request *request)
Dr inż. Stanisław Polak 45 Przedmiot: Techniki Programowania Równoległego
Obliczenia globalne Komunikacja kolektywna MPI
Wybrane warianty operacji redukcji
I int MPI Allreduce (void *sendbuf, void *recvbuf, int count,MPI Datatype datatype, MPI Op op, MPI Comm comm)
I int MPI Reduce scatter (void *sendbuf, void *recvbuf, int*recvcnts, MPI Datatype datatype, MPI Op op, MPI Comm comm)
I int MPI Scan (void *sendbuf, void *recvbuf, int count,MPI Datatype datatype, MPI Op op, MPI Comm comm)
Dr inż. Stanisław Polak 46 Przedmiot: Techniki Programowania Równoległego
Obliczenia globalne Komunikacja kolektywna MPI
Predefiniowane operatory
Operator Operator OperatorMPI MAX MPI MIN MPI SUMMPI PROD MPI LAND MPI BANDMPI LOR MPI BOR MPI LXORMPI BXOR MPI MAXLOC MPI MINLOC
Dr inż. Stanisław Polak 47 Przedmiot: Techniki Programowania Równoległego
Obliczenia globalne Komunikacja kolektywna MPI
Definiowanie własnych operatorów
1 . . .2 typedef struct {3 double real , imag ;4 } Complex ;56 void myAdd( Complex ∗in , Complex ∗inout , int ∗len , MPI_Datatype ∗dtype ){7 . . .8 for ( i=0; i< ∗len ; ++i ) { // Ob l i c z a n i e sumy l i c z b z e spo l onych9 z . real = in−>real + inout−>real ;
10 z . imag = in−>imag + inout−>imag ;11 ∗inout = z ;12 in++; inout++;13 }14 }1516 int main ( int argc , char ∗∗argv ){17 . . .18 Complex a [ 2 ] , answer [ 2 ] , complex ;19 . . .20 complex . real=0;21 complex . imag=2;22 a [0 ]= complex ;23 complex . real=0;24 complex . imag=3;25 a [1 ]= complex ;26 MPI_Type_contiguous ( 2 , MPI_DOUBLE , &ctype ) ;27 MPI_Type_commit ( &ctype ) ;28 MPI Op create ( ( MPI_User_function ∗)myAdd , 1 , &myOp ) ;29 MPI_Reduce ( a , answer , 2 , ctype , myOp , 1 , MPI_COMM_WORLD ) ;30 if ( rank==1)31 for ( i=0;i<2;i++)32 printf ( "%.1lf %.1lf\n" , answer [ i ] . real , answer [ i ] . imag ) ;33 . . .34 }
Dla trzechprocesów
Na wyjściu
0.0 6.00.0 9.0
Dr inż. Stanisław Polak 48 Przedmiot: Techniki Programowania Równoległego
Obliczenia globalne Komunikacja kolektywna MPI
Obliczanie iloczynu skalarnegoWersja równoległa
1 . . .2 if ( rank == 1) {3 printf ( "Podaj rozmiar wektorów: " ) ;4 scanf ( "%d" ,&n ) ;5 x = ( double ∗) calloc (n , sizeof ( double ) ) ;6 y = ( double ∗) calloc (n , sizeof ( double ) ) ;7 for ( i=0; i<n ; i++) {x [ i ] = 1 . 0 ; y [ i ] = 1 . 0 ;}8 n_bar = n/numprocs ; // ’ numprocs ’ − l i c z b a p r o c e s ów ( ro zm ia r komunikatora )9 }
10 MPI_Bcast(&n_bar , 1 , MPI_INT , 1 , MPI_COMM_WORLD ) ;11 local_x = ( double ∗) calloc ( n_bar , sizeof ( double ) ) ;12 local_y = ( double ∗) calloc ( n_bar , sizeof ( double ) ) ;13 MPI_Scatter (x , n_bar , MPI_DOUBLE , local_x , n_bar , MPI_DOUBLE , 1 ,
MPI_COMM_WORLD ) ;14 MPI_Scatter (y , n_bar , MPI_DOUBLE , local_y , n_bar , MPI_DOUBLE , 1 ,
MPI_COMM_WORLD ) ;15 /∗∗∗∗∗∗∗ o b l i c z a n i e l o k a l n e g o i l o c z y n u s k a l a r n e g o ∗/16 local_dot = 0 . 0 ;17 for ( i = 0 ; i < n_bar ; i++)18 local_dot += local_x [ i ] ∗ local_y [ i ] ;19 . . .20 /∗∗∗∗∗∗∗ o b l i c z a n i e ca ł kowi tego i l o c z y n u s k a l a r n e g o ∗/21 MPI_Reduce(&local_dot , &dot , 1 , MPI_DOUBLE , MPI_SUM , 1 , MPI_COMM_WORLD ) ;22 if ( rank == 1)23 //Zak ł adam , ż e z k l aw i a t u r y , j a ko warto ś ć ’ n ’ wprowadzono 624 printf ( "Iloczyn skalarny wynosi %f\n" , dot ) ; //Wypisze : I l o c z y n s k a l a r n y
wynos i 625 . . .
. . . . . .
. . . . . .
. . . . . .
* *
. . . . . .
∑ ∑+
=. . .
Dr inż. Stanisław Polak 49 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Pochodne typy danychWstęp
1 double tab [ IMAX ] [ JMAX ] ;2 /∗ Chcemy wys ł a ć : tab [ 0 ] [ 5 ] , tab [ 1 ] [ 5 ] , . . . , tab [ IMAX−1] [5 ] ∗/
Chcemy wysłać fragment macierzy
Elementy do wysłaniaIch umiejscowienie w pamięci
1 struct{2 int nWynikow ;3 double wyniki [ RMAX ] ;4 } spakowanyWynik ;
Chcemy wysłać dane różnych typów
Dr inż. Stanisław Polak 50 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Kreowanie typów pochodnych
I Utworzenie nowego typuI MPI Type contiguous()I MPI Type vector()I MPI Type create hvector()I MPI Type create indexed block()I MPI Type create hindexed block()I MPI Type indexed()I MPI Type create hindexed()I MPI Type create struct()I MPI Type create subarray()I MPI Type create darray()I MPI Type create resized()
I Zatwierdzenie nowego typuI MPI Type commit()
I Zwolnienie typu danychI MPI Type free()
Dr inż. Stanisław Polak 51 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Typ przyległy
int MPI Type contiguous(int count, MPI Datatype oldtype,MPI Datatype *newtype)
1 . . .2 MPI_Status status ;3 MPI_Datatype type ;4 int buffer [ 1 0 ] ;5 . . .6 MPI Type contiguous ( 5 , MPI_INT , &type ) ;7 MPI_Type_commit(&type ) ;8 if ( rank == 0){9 for ( i=0; i<10; i++)
10 buffer [ i ] = i ;11 MPI_Send ( buffer , 1 , type , 1 , 123 , MPI_COMM_WORLD ) ;12 }13 if ( rank == 1){14 for ( i=0; i<10; i++)15 buffer [ i ] = −1;16 MPI_Recv ( buffer , 10 , MPI_INT , 0 , 123 , MPI_COMM_WORLD , &status ) ;17 for ( i=0; i<10; i++)18 printf ( "buffer [%d] = %d\n" , i , buffer [ i ] ) ;19 fflush ( stdout ) ;20 }21 . . .
0 1 2 3 4 5 6 7 8 9count=5
Na wyjściu
buffer[0] = 0buffer[1] = 1buffer[2] = 2buffer[3] = 3buffer[4] = 4buffer[5] = -1buffer[6] = -1buffer[7] = -1buffer[8] = -1buffer[9] = -1
Dr inż. Stanisław Polak 52 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Typ wektorowy
I int MPI Type vector(int count, int blocklength, int stride,MPI Datatype old type, MPI Datatype *newtype p)
I int MPI Type create hvector(int count, int blocklength,MPI Aint stride, MPI Datatype old type, MPI Datatype*newtype p)
1 . . .2 MPI Type vector ( 2 , 3 , 5 , MPI_INT , &type ) ;3 MPI_Type_commit(&type ) ;45 if ( rank == 0){6 for ( i=0; i<10; i++)7 buffer [ i ] = i ;8 MPI_Send ( buffer , 1 , type , 1 , 123 , MPI_COMM_WORLD ) ;9 }
1011 if ( rank == 1){12 for ( i=0; i<10; i++)13 buffer [ i ] = −1;14 MPI_Recv ( buffer , 10 , MPI_INT , 0 , 123 , MPI_COMM_WORLD , &status ) ;15 for ( i=0; i<10; i++)16 printf ( "buffer [%d] = %d\n" , i , buffer [ i ] ) ;17 fflush ( stdout ) ;18 }19 . . .
Na wyjściu
buffer[0] = 0buffer[1] = 1buffer[2] = 2buffer[3] = 5buffer[4] = 6buffer[5] = 7buffer[6] = -1buffer[7] = -1buffer[8] = -1buffer[9] = -1
count=2 0 1 2 3 4 5 6 7 8 9stride = 5 blocklength = 3
Dr inż. Stanisław Polak 53 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Typ indeksowany z blokami stałego rozmiaru.
I int MPI Type create indexed block(int count, int blocklength, constint array of displacements[], MPI Datatype oldtype, MPI Datatype*newtype)
I int MPI Type create hindexed block(int count, int blocklength, constMPI Aint array of displacements [], MPI Datatype oldtype,MPI Datatype * newtype)
1 . . .2 int displacement [ 2 ] = { 0 , 3 };3 . . .4 MPI Type create indexed block ( 2 , 2 , displacement , MPI_INT , &type ) ;5 MPI_Type_commit(&type ) ;6 if ( rank == 0){7 for ( i=0; i<10; i++)8 buffer [ i ] = i ;9 MPI_Send ( buffer , 1 , type , 1 , 123 , MPI_COMM_WORLD ) ;
10 }11 if ( rank == 1){12 for ( i=0; i<10; i++)13 buffer [ i ] = −1;14 MPI_Recv ( buffer , 10 , MPI_INT , 0 , 123 , MPI_COMM_WORLD , &status ) ;15 for ( i=0; i<10; i++)16 printf ( "buffer [%d] = %d\n" , i , buffer [ i ] ) ;17 fflush ( stdout ) ;18 }19 . . .
0 1 2 3 4 5 6 7 8 9count=2blocklength = 2
Na wyjściu
buffer[0] = 0buffer[1] = 1buffer[2] = 3buffer[3] = 4buffer[4] = -1buffer[5] = -1buffer[6] = -1buffer[7] = -1buffer[8] = -1buffer[9] = -1
Dr inż. Stanisław Polak 54 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Typ indeksowany z blokami różnego rozmiaruI int MPI Type indexed(int count, int blocklens[], intarray of displacements[], MPI Datatype old type, MPI Datatype*newtype)
I int MPI Type create hindexed(int count, int blocklens[],MPI Aint array of displacements[], MPI Datatype old type,MPI Datatype *newtype)
1 . . .2 int blocklens [2]={ 1 , 2 };3 int displacement [ 2 ] = { 0 , 3 };4 . . .5 MPI Type indexed ( 2 , blocklens , displacement , MPI_INT , &type ) ;6 MPI_Type_commit(&type ) ;7 if ( rank == 0){8 for ( i=0; i<10; i++)9 buffer [ i ] = i ;
10 MPI_Send ( buffer , 1 , type , 1 , 123 , MPI_COMM_WORLD ) ;11 }12 if ( rank == 1){13 for ( i=0; i<10; i++)14 buffer [ i ] = −1;15 MPI_Recv ( buffer , 10 , MPI_INT , 0 , 123 , MPI_COMM_WORLD , &status ) ;16 for ( i=0; i<10; i++)17 printf ( "buffer [%d] = %d\n" , i , buffer [ i ] ) ;18 fflush ( stdout ) ;19 }20 . . .
0 1 2 3 4 5 6 7 8 9count=2
Na wyjściu
buffer[0] = 0buffer[1] = 3buffer[2] = 4buffer[3] = -1buffer[4] = -1buffer[5] = -1buffer[6] = -1buffer[7] = -1buffer[8] = -1buffer[9] = -1
Dr inż. Stanisław Polak 55 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Typ strukturalnyint MPI Type create struct(int count, int blocklens[], MPI Aintarray of displacements[], MPI Datatype old types[], MPI Datatype*newtype)
1 . . .2 int blocklen [2]={1 ,2} ;3 MPI_Aint displacement [ 2 ] = { 0 , 3∗4 }; //3∗4 , bo p r z e s u n i ę c i e wyra żamy w
ba j tach , a n i e w e lementach danego typu , a MPI INT ma 4 b a j t y4 int oldtypes [2]={ MPI_INT , MPI_INT};5 . . .6 MPI Type create struct ( 2 , blocklen , displacement , oldtypes , &type ) ;7 MPI_Type_commit(&type ) ;8 if ( rank == 0){9 for ( i=0; i<10; i++)
10 buffer [ i ] = i ;11 MPI_Send ( buffer , 1 , type , 1 , 123 , MPI_COMM_WORLD ) ;12 }13 if ( rank == 1){14 for ( i=0; i<10; i++)15 buffer [ i ] = −1;16 MPI_Recv ( buffer , 10 , MPI_INT , 0 , 123 , MPI_COMM_WORLD , &status ) ;17 for ( i=0; i<10; i++)18 printf ( "buffer [%d] = %d\n" , i , buffer [ i ] ) ;19 fflush ( stdout ) ;20 }21 . . .
Na wyjściu
buffer[0] = 0buffer[1] = 3buffer[2] = 4buffer[3] = -1buffer[4] = -1buffer[5] = -1buffer[6] = -1buffer[7] = -1buffer[8] = -1buffer[9] = -1
Dr inż. Stanisław Polak 56 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Tworzenie podtablicyint MPI Type create subarray(int ndims, const int array of sizes[],const int array of subsizes[], const int array of starts[], intorder, MPI Datatype oldtype, MPI Datatype *newtype)
1 . . .2 int array_of_sizes [ ] = {10};3 int array_of_subsizes [ ] = { 3 };4 int array_of_starts [ ] = { 2 };5 . . .6 MPI Type create subarray ( 1 , array_of_sizes , array_of_subsizes , array_of_starts ,
MPI_ORDER_C , MPI_INT , &type ) ;7 MPI_Type_commit(&type ) ;8 if ( rank == 0){9 for ( i=0; i<10; i++)
10 buffer [ i ] = i ;11 MPI_Send ( buffer , 1 , type , 1 , 123 , MPI_COMM_WORLD ) ;12 }13 if ( rank == 1){14 for ( i=0; i<10; i++)15 buffer [ i ] = −1;16 MPI_Recv ( buffer , 10 , MPI_INT , 0 , 123 , MPI_COMM_WORLD , &status ) ;17 for ( i=0; i<10; i++)18 printf ( "buffer [%d] = %d\n" , i , buffer [ i ] ) ;19 fflush ( stdout ) ;20 }21 . . .
Na wyjściu
buffer[0] = 2buffer[1] = 3buffer[2] = 4buffer[3] = -1buffer[4] = -1buffer[5] = -1buffer[6] = -1buffer[7] = -1buffer[8] = -1buffer[9] = -1
0 1 2 3 4 5 6 7 8 9
Dr inż. Stanisław Polak 57 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Rozpraszenie danych w stylu HPFint MPI Type create darray(int size, int rank, int ndims, constint array of gsizes[], const int array of distribs[], const intarray of dargs[], const int array of psizes[], int order,MPI Datatype oldtype, MPI Datatype *newtype)
1 /∗<o ld type> BUFFER(12 ,16)2 R e a l i z a c j a i n s t r u k c j i HPF3 !HPF$ PROCESSORS PROCESSES(3 , 2 )4 !HPF$ DISTRIBUTE BUFFER(BLOCK,BLOCK) ONTO PROCESSES ∗/5 . . .6 gsizes [ 0 ] = 1 2 ;7 gsizes [ 1 ] = 1 6 ;8 gdistr [ 0 ] = MPI_DISTRIBUTE_BLOCK ;9 gdistr [ 1 ] = MPI_DISTRIBUTE_BLOCK ;
10 gdargs [ 0 ] = MPI_DISTRIBUTE_DFLT_DARG ;11 gdargs [ 1 ] = MPI_DISTRIBUTE_DFLT_DARG ;12 psizes [ 0 ] = 3 ;13 psizes [ 1 ] = 2 ;14 MPI Type create darray ( 6 , rank , 2 , gsizes , gdistr , gdargs ,
psizes , MPI_ORDER_C , MPI_INT , &type ) ;15 MPI_Type_commit(&type ) ;16 MPI_File_open ( MPI_COMM_WORLD , fileName , MPI_MODE_RDONLY ,
MPI_INFO_NULL , &fh ) ;17 MPI_File_set_view ( fh , 0 , MPI_INT , type , "native" ,
MPI_INFO_NULL ) ;18 MPI_File_read ( fh , buffer , 32 , MPI_INT , &status ) ;19 . . .
Źródła: http://www.florian-rappl.de/download/57/homework-set-7 orazhttp://www.mcs.anl.gov/~itf/dbpp/text/node85.html
Dr inż. Stanisław Polak 58 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
PrzykładWysłanie kolumny macierzy
1 . . .2 #define IMAX 23 #define JMAX 64 . . .5 double wyniki [ IMAX ] [ JMAX ] ;6 MPI_Datatype nowytyp ;78 /∗ IMAX b lok ów, r o zm ia r ka ż dego z n i ch to 1 ( e l ement )9 ∗ Począ tek na s t ę pnego j e s t p r z e s u n i ę ty o JMAX e lement ów
10 ∗/11 . . .12 MPI_Type_vector ( IMAX , 1 , JMAX , MPI_DOUBLE , &nowytyp ) ;13 MPI_Type_Commit (&nowytyp ) ;
14 MPI_Ssend ( &wyniki[0][JMAX-1] , 1 , nowytyp , dest , tag , comm ) ;15 . . .
IMAX-1
JMAX-1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
stride = JMAX
blocklength = 1count=IMAX
Dr inż. Stanisław Polak 59 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
PrzykładWysłanie struktury języka C
1 . . .2 #define RESULT PACKET NBLOCKS 234 struct{5 int nWynikow ;6 double wyniki [ RMAX ] ;7 } spakowanyWynik ;89 int array_of_blocklengths [ RESULT_PACKET_NBLOCKS ]
= {1 , RMAX};10 MPI_Datatype array_of_types [
RESULT_PACKET_NBLOCKS ] = {MPI_INT ,MPI_DOUBLE};
11 MPI_Aint array_of_displacements [RESULT_PACKET_NBLOCKS ] ;
12 MPI_Datatype resultPacketType ;13 MPI_Type_get_extent ( MPI_INT , &lb , &extent ) ;14 array_of_displacements [ 0 ] = 0 ;15 array_of_displacements [ 1 ] = extent ;16 MPI_Type_create_struct ( 2 , array_of_blocklengths
, array_of_displacements , array_of_types ,&resultPacketType ) ;
17 MPI_Type_commit (&resultPacketType ) ;1819 MPI_Ssend (&spakowanyWynik , 1 , resultPacketType ,
dest , tag , comm ) ;20 . . .
Dr inż. Stanisław Polak 60 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Podstawowe pojęciaMapa typów
Typemap = {(typ0, przes0), . . . , (typn−1, przesn−1)}
SygnaturaTypesig = {typ0, . . . , typn−1}
Granica dolna
lb(Typemap) =
{minj(przesj) gdy brak markera lb markerminj({przesj takie, że typj = lb marker}) w przeciwnym razie
Granica górna
ub(Typemap) =
{maxj(przesj + sizeof (typj)) + ε) gdy brak markera ub markermaxj({przesj takie, że typj = ub marker}) w przeciwnym razie
Rozpiętość
extent(Typemap) = ub(Typemap)− lb(Typemap)
lb({(int, 0), (char , 4)}) =min(0, 4) = 0
ub({(int, 0), (char , 4)}) =max(0 + 4, 4 + 1) + ε = 5 + ε = 8
extent({(int, 0), (char , 4)}) = 8− 0 = 8
Dr inż. Stanisław Polak 61 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
Zmiana / odczyt granic oraz zasięguMarkery
I ub marker
I lb marker
-4 0 8 24
Rysunek: Typ — jedna dziura MPI INT + dwa elementy MPI INT + cztery dziuryMPI INT
1 . . .2 MPI_Type_contiguous ( 2 , MPI_INT , &contig ) ;3 MPI_Type_commit(&contig ) ;4 lb = −1 ∗ sizeof ( int ) ; // −45 extent = 7 ∗ sizeof ( int ) ; // 286 MPI Type create resized( contig , lb , extent , &filetype ) ;7 // l b = −48 //ub = l b + ex t e n t = −4 + 28 = 249 MPI_Type_commit(&filetype ) ;
10 MPI Type get extent( filetype , &lb , &extent ) ;11 printf ( "%d %d\n" , lb , extent ) ; // −4 2812 MPI Type get true extent( filetype , &lb , &extent ) ;13 printf ( "%d %d\n" , lb , extent ) ; //0 814 . . .
Typemapcontig ={(int, 0), (int, 8)}
Typemapfiletype ={(int, 0), (int, 8), (lb marker,−4), (ub marker, 24)}
Dr inż. Stanisław Polak 62 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
PrzykładWysłanie wierszy macierzy
1 int A [ 3 ] [ 3 ] ={1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9} ;2 int B [ 9 ] ;3 . . .4 MPI_Type_contiguous ( 3 , MPI_INT ,&typ ) ;56 //Wys ł a n i e t r z e c h w i e r s z y7 MPI_Send (A , 3 , typ , 1 , 1 , MPI_COMM_WORLD ) ;8 . . .9 MPI_Recv (B , 9 , MPI_INT , 0 , 1 , MPI_COMM_WORLD ,&status ) ;
10 // odebrano B = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9}
Typemap = {(int, 0), (int, 4), (int, 8)}extent(Typemap) = 0 + 8 + sizeof (int) = 12
1 2 34 5 67 8 9
12
Dr inż. Stanisław Polak 63 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
PrzykładWysłanie kolumn macierzy — wersja niepoprawna
1 int A [ 3 ] [ 3 ] ={1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9} ;2 int B [ 9 ] ;3 . . .4 MPI_Type_vector ( 3 , 1 , 3 , MPI_INT ,&typ ) ;56 //Wys ł a n i e t r z e c h kolumn7 MPI_Send (A , 3 , typ , 1 , 1 , MPI_COMM_WORLD ) ;8 . . .9 MPI_Recv (B , 9 , MPI_INT , 0 , 1 , MPI_COMM_WORLD ,&status ) ;
10 //B = {1 ,4 ,7 ,8 ,−1073859432 ,6791156 ,2 ,−1073859408 ,1}
Typemap = {(int, 0), (int, 12), (int, 24)}extent(Typemap) = 0 + 24 + sizeof (int) = 28
1 2 34 5 67 8 9
28
Dr inż. Stanisław Polak 64 Przedmiot: Techniki Programowania Równoległego
Pochodne typy danych MPI
PrzykładWysłanie kolumn macierzy — wersja poprawna
1 . . .2 MPI_Type_vector ( 3 , 1 , 3 , MPI_INT ,&typ ) ;3 . . .4 MPI_Type_get_extent ( MPI_INT , &lb , &extent ) ;5 MPI_Type_create_resized ( typ , 0 , extent , &nowy_typ ) ;6 MPI_Type_commit(&nowy_typ ) ;7 . . .8 MPI_Send (A , 3 , nowy_typ , 1 , 1 , MPI_COMM_WORLD ) ;9 . . .
lb(Typemap) =
{minj (przesj ) gdy brak markera lb markerminj ({przesj takie, że typj = lb marker}) w przeciwnym razie
ub(Typemap) =
{maxj (przesj + sizeof (typj )) + ε) gdy brak markera ub markermaxj ({przesj takie, że typj = ub marker}) w przeciwnym razie
extent(Typemap) = ub(Typemap)− lb(Typemap)
Typemap = {(int, 0), (int, 12), (int, 24), (lb marker , 0), (ub marker , 4)}extent(Typemap) = 0 + 4 = 4
1 2 34 5 67 8 9
4
Dr inż. Stanisław Polak 65 Przedmiot: Techniki Programowania Równoległego
MPE MPI
MPEWstęp
I MPE — Multi-Processing EnvironmentI Przebieg wykonania programu −→ generowanie dziennika zdarzeń
I automatycznieI ręcznie
Rysunek: Główne okno programu „Jumpshot”
Dr inż. Stanisław Polak 66 Przedmiot: Techniki Programowania Równoległego
MPE MPI
Automatyczne generowanie dziennika zdarzeń
1 . . .2 if ( rank == 0){3 for ( i = 1 ; i <= 2 ; i++){4 MPI_Send ( buffer , 1 , MPI_FLOAT , 1 , 100 , MPI_COMM_WORLD ) ;5 MPI_Recv ( buffer , length_of_message , MPI_FLOAT , 1 , 101 , MPI_COMM_WORLD , &status ) ;6 }7 }89 if ( rank == 1){
10 for ( i = 1 ; i <= 2 ; i++){11 MPI_Recv ( buffer , length_of_message , MPI_FLOAT , 0 , 100 , MPI_COMM_WORLD , &status ) ;12 MPI_Send ( buffer , 1 , MPI_FLOAT , 0 , 101 , MPI_COMM_WORLD ) ;13 }14 }15 . . .
1. mpicc-profile=mpe mpilog -oprogram program.c
2. mpiexec -n 2 ./program
3. jumpshot program.clog
Dr inż. Stanisław Polak 67 Przedmiot: Techniki Programowania Równoległego
MPE MPI
Ręczne generowanie dziennika zdarzeń
1 int event1 , event2 ;2 . . .3 MPE Init log ( ) ;4 MPE Log get state eventIDs( &event1 , &event2 ) ;5 MPE Describe state( event1 , event2 , "Moj stan" , "green" ) ; "6 ...7 if(rank == 0){8 for (i = 1; i <= 2; i++){9 MPE Log event(event1 , 0, "Iteracja start");
10 MPI_Send(buffer , 1, MPI_FLOAT , 1, 100, MPI_COMM_WORLD);11 MPI_Recv(buffer , length_of_message , MPI_FLOAT ,1, 101, MPI_COMM_WORLD , &status);12 MPE Log event(event2 , 0, "Iteracja stop");13 }14 }15 ...16 MPE Finish log("program−mpe");17 ...
1. mpicc -o program program.c -lmpe
2. mpiexec -n 2 ./program
3. jumpshot program-mpe.clog
Dr inż. Stanisław Polak 68 Przedmiot: Techniki Programowania Równoległego
Grafika MPE MPI
Grafika MPE
I Dostarcza biblioteka MPEI Zawiera prosty interfejs do XI Nagłówek
I #include <mpe.h>I Kompilacja
I mpicc -profile=mpe graphics program.c -o program
Dr inż. Stanisław Polak 69 Przedmiot: Techniki Programowania Równoległego
Grafika MPE MPI
Przykład
1 . . .2 MPE_XGraph graph ;3 MPE_Color my_color ;4 char ckey ;5 . . .6 ierr = MPE Open graphics(&graph , MPI_COMM_WORLD , NULL , −1, −1, 400 , 400 , 0) ;7 if (ierr != MPE SUCCESS) {8 fprintf ( stderr , "%d : MPE_Open_graphics () fails\n" , rank ) ;9 MPI_Abort ( MPI_COMM_WORLD , 1 ) ;
10 }11 my color = (MPE Color) (rank + 1) ;12 if ( rank == 0)13 MPE Draw string( graph , 187 , 205 , MPE_BLUE , "Hello" ) ;14 MPE Draw circle( graph , 200 , 200 , 20+rank∗5 , my_color ) ;15 MPE Update( graph ) ;1617 if ( rank == 0) {18 fprintf ( stdout , "Hit any key then return to continue" ) ;19 fscanf( stdin , "%s" , &ckey ) ;20 fprintf ( stdout , "\n" ) ;21 }22 MPI_Barrier ( MPI_COMM_WORLD ) ;2324 MPE Close graphics(&graph ) ;25 . . .
Dr inż. Stanisław Polak 70 Przedmiot: Techniki Programowania Równoległego
Źródła MPI
Źródła I
Blaise BarneyMessage Passing Interface (MPI)https://computing.llnl.gov/tutorials/mpi/
Neil MacDonald, Elspeth Minty, Tim Harding, Simon Brown,Writing Message-Passing Parallel Programs with MPIhttp://www.math.tu-cottbus.de/~kd/parallel/mpi/mpi-course.book_1.html
MPI ForumMPI Documentshttp://www.mpi-forum.org/docs/docs.html
PDCMPIhttp://www.pdc.kth.se/publications/talks/mpi
LansPerformance Visualization for Parallel Programshttp://www.mcs.anl.gov/research/projects/perfvis/
Dr inż. Stanisław Polak 71 Przedmiot: Techniki Programowania Równoległego
Źródła MPI
Źródła II
Zdzislaw MeglickiMPI Graphics and Process Visualizationhttp://beige.ucs.indiana.edu/I590/node111.html
Rolf RabenseifnerIntroduction to the Message Passing Interface (MPI)https://fs.hlrs.de/projects/par/par_prog_ws/pdf/mpi_1_rab.pdf
Jacek DziedzicAlgorytmy równoległehttp://www.mif.pg.gda.pl/homepages/jaca/AR_W/AR1bw.pdf
CneaIntroduction to MPIhttp://www.ib.cnea.gov.ar/~ipc/ipd2007/htmlcourse/
DeinoMPIhttp://mpi.deino.net/
Dr inż. Stanisław Polak 72 Przedmiot: Techniki Programowania Równoległego
Źródła MPI
Źródła III
Vagelis HarmandarisParallel Computinghttp://www.tem.uoc.gr/~vagelis/Courses/EM361/em361.html
Jean-Pierre ProstMPI-2 Overviewhttp://www.pdc.kth.se/training/Talks/SMP/maui98/jpprost/index.htm
EPCCMPI-2: Extending the Message Passing Interfaceftp://ftp.epcc.ed.ac.uk/pub/personal/dsh/mpi2-report.ps.gz
MCSMPI-2: Extensions to the Message-Passing Interfacehttp://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-2.0/mpi2-report.htm
Dariusz Koniecznyhttp://www.ci.pwr.wroc.pl/~koniecz/ParAlg/Macierz.html
Dr inż. Stanisław Polak 73 Przedmiot: Techniki Programowania Równoległego
Źródła MPI
Źródła IV
William Gropp, Ewing Lusk, Rajeev ThakurUsing MPI-2: Advanced Features of the Message-Passing InterfaceMIT Press, 1999; ISBN 0-262-57132-3
Michał SajkowskiDynamiczne zarządzanie procesamihttp://szkolenia.man.poznan.pl/kdm/presentations/MPI-2/dynamiczne_MPI2_22112006.pdf
Mirosław KupczykRozszerzenia standardu MPI: MPI-2https://hpc.man.poznan.pl/modules/kdm_training/uploads/rozszerzeniastandarduMPI-MPI-2.pdf
Dr inż. Stanisław Polak 74 Przedmiot: Techniki Programowania Równoległego