Plan prezentacji MPIicsr.agh.edu.pl/~polak/wyklady/TPR/MPI.pdfPlan prezentacji Wstęp Komunikacja...

19
MPI MPI Przedmiot: Techniki Programowania Równoleglego Dr inż. Stanislaw Polak Akademia Górniczo - Hutnicza w Krakowie, Katedra Informatyki http://www.icsr.agh.edu.pl/~polak/ Dr inż. Stanislaw Polak 1 Przedmiot: Techniki Programowania Równoleglego MPI Plan prezentacji Wstęp Komunikacja punkt-punkt Komunikacja kolektywna Pochodne typy danych MPE Dr inż. Stanislaw Polak 2 Przedmiot: Techniki Programowania Równoleglego Wstęp MPI Ogólna charakterystyka MPI I Próba polączenia zalet istniejących systemów „message passingu”. I Twórcy standardu: większość producentów maszyn wspólbieżnych, naukowcy uniwersyteccy, przedstawiciele ośrodków rządowych. I Przenośność. I Udostępnia zbiór precyzyjnie zdefiniowanych metod, które mogą być efektywnie zaimplementowane. Punkt wyjściowy do stworzenia praktycznego, przenośnego, elastycznego i efektywnego narzędzia dla „message passingu”. Dr inż. Stanislaw Polak 3 Przedmiot: Techniki Programowania Równoleglego Wstęp MPI Glówne zalożenia MPI I Efektywna komunikacja I Niska szczególowość I „Znajomy” interfejs I Komunikacja P-P oraz zbiorowa I Dzialanie na wielu platformach I Semantyka niezależna od języka I „Thread-safe” Dr inż. Stanislaw Polak 4 Przedmiot: Techniki Programowania Równoleglego

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