An Introduction to MPI Parallel Programming with the Message Passing Interface - PowerPoint PPT Presentation

Loading...

PPT – An Introduction to MPI Parallel Programming with the Message Passing Interface PowerPoint presentation | free to download - id: 791464-NGQ4Z



Loading


The Adobe Flash plugin is needed to view this content

Get the plugin now

View by Category
About This Presentation
Title:

An Introduction to MPI Parallel Programming with the Message Passing Interface

Description:

Podstawowe zasady Typy danych MPI Slajd 16 Znaczniki (stemple) MPI (tag) MPI podstawowe (blokuj ce) wysy anie komunikatu MPI podstawowe (blokuj ce) ... – PowerPoint PPT presentation

Number of Views:9
Avg rating:3.0/5.0
Slides: 32
Provided by: William1397
Learn more at: http://dydaktyka.polsl.pl
Category:

less

Write a Comment
User Comments (0)
Transcript and Presenter's Notes

Title: An Introduction to MPI Parallel Programming with the Message Passing Interface


1
An Introduction to MPIParallel Programming with
the Message Passing Interface
Wprowdzenie do MPI na podstawie
  • William Gropp
  • Ewing Lusk
  • Argonne National Laboratory

oraz wlasnych rozwazan,programów i bledów
2
Gdzie szukac informacji ?
  • Oficjalna dokumentacja standardów
    MPIhttp//www.mpi-forum.org/docs/docs.html
  • Strona implementacji MPICHhttp//www-unix.mcs.anl
    .gov/mpi/mpich/
  • Google

3
Model przesylania komunikatów(message passing)
  • Proces posiada indywidualny licznik programu i
    indywidualna przestrzen danych
  • Procesy moga byc zbudowane z wielu watków
    (threads) (posiadajacych swoje liczniki programu
    oraz stos) dzielacych jedna przestrzen adresowa
  • MPI sluzy do komunikacji pomiedzy procesami
    posiadajacymi odrebne przestrzenie adresów
  • Komunikacja pomiedzy procesami sklada sie z
  • synchronizacji
  • Przeslania danych z jednej przestrzeni adresów do
    innej

4
Kooperatywne operacje komunikacji
  • Przesylanie komunikatu zawierajacego dane wymaga
    dzialania kooperatywnego
  • Dane sa wysylane przez jeden z procesów i
    pobierane przez inny
  • Zmiana pamieci procesu odbierajacego jest mozliwa
    tylko poprzez jawne uczestnictwo procesu
    (wywolanie odpowiedniej funkcji)
  • Komunikacja oraz synchronizacja sa wykonywane
    wspólnie

5
Jednostronne operacje komunikacji
  • Jednostronne operacje obejmuja dostep do zdalenj
    pamieci w celu jej odczytu lub zapisu
  • Wystarczy partycypacja tylko jedenego z procesów
  • Komunikacja oraz synchronizacja sa rozdzielone
  • Ten tym komunikacji wystepuje w standardzie MPI-2.

Proces 0
Proces 1
(memory) pamiec
Get(data) Pobiez dana
6
Czym jest MPI?
  • Specyfikacja biblioteki do przesylania
    komunikatów
  • rozszerzony model komunikacji za pomoca
    przesylania komunikatów
  • nie definiuje nowych jezyków ani polecen
    kompilatora
  • Nie jest zwiazane z konkretna implementacja ani
    produktem
  • Stworzona dla równoleglych komputerów, klastrów i
    heterogenicznych sieci komputerów
  • Zawiera pelen zestaw funkcji potrzebnych do p.k.
  • Pozwala na dostep do zaawansowanych zasobów
  • uzytkownikom koncowym
  • programistom opracowujacym nowe biblioteki
  • programistom nowych narzedzi

7
Dlaczego uzywac MPI?
  • MPI udostepnia potezne, wydajne i przenosne
    funkcje pozwalajace tworzyc programy równolegle
  • MPI zostalo stworzone w celu uzycia jako
    biblioteka i fragment innych bibliotek
  • pozwala to na uzycie MPI posiadajac o nim
    niewielka lub brak wiedzy

8
Najkrótszy program z uzyciem MPI
  • 1 include ltmpi.hgt
  • 2 include ltstdio.hgt
  • 3
  • 4 int main( int argc, char argv )
  • 5
  • 6 MPI_Init( argc, argv )
  • 7 printf( "Hello, world!\n" )
  • 8 MPI_Finalize()
  • return 0
  • 10

9
Pobieranie informacjio otoczeniu
  • Dwa podstawowe pytania pojawiajace sie podczas
    wykonywania programu równoleglego
  • Ile procesów bierze udzial w obliczeniach?
  • Który z nich to ja?
  • MPI dostarcza funkcje odpowiadajace na te
    pytania
  • MPI_Comm_size podaje size -liczbe procesów.
  • MPI_Comm_rank podaje rank-range, liczbe pomiedzy
    0 oraz size-1, identyfikujaca wywolujacy funkcje
    proces

10
Lepsza wersja Hello
  • 1 include ltmpi.hgt
  • 2 include ltstdio.hgt //lub include ltiostreamgt
  • 3
  • 4 int main( int argc, char argv )
  • 5
  • 6 int rank, size
  • 7 MPI_Init( argc, argv )
  • 8 MPI_Comm_rank( MPI_COMM_WORLD, rank )
  • 9 MPI_Comm_size( MPI_COMM_WORLD, size )
  • 10 printf( "I am d of d\n", rank, size )
  • 11 //lub coutltlt"I am"ltltrankltlt" of
    "ltltsizeltltendl
  • 12 MPI_Finalize()
  • 13 return 0
  • 14

11
Jak uruchomic ten program ?
  • Dolaczyc sciezki do biblioteki i plików
    naglówkowych w kompilatorze (library, include)
  • Wykorzystac skrypt dostarczany z MPI mpicc lub
    mpiCC (dla UNIX, IRIX, AIX, Linux,BSD)
  • Uruchomic poprzez mpiexec lub mpirun
  • Podczas uruchamiania podaje sie liczbe procesów
  • Szczególy -gt laboratorium

12
MPI podstawowe wysylanie/odbiór komunikatów
  • Musimy okreslic szczególy dla
  • Parametry do okreslenia
  • Jak dane-data beda opisane ?
  • Jak proces zostanie zidentyfikowany ?
  • Jak odbiorca rozpozna/przejrzy wiadomosc ?
  • W jaki sposób okreslic ze operacja zostala
    wykonana ?

13
W jaki sposób przeslac komunikat ?
  • Transfer danych synchronizacja

Proces 0
Proces 1
Czas
  • Wymaga kooperacji miedzy wysylajacym i
    odbierajacym procesem
  • Kooperacja nie zawsze widoczna w kodzie

14
Podstawowe zasady
  • Procesy moga byc laczone w grupy
  • Kazda wiadomosc jest wyslana z uzyciem pewnego
    kontekstu i musi zostac odebrana uzywajac tego
    samego kontekstu
  • Groupa oraz kontekst tworza razem komunikator
    (communicator).
  • Proces jest identyfikowany przez range-rank w
    grupie powiazanej z komunikatorem
  • Domyslnie istnieje komunikator, którego grupa
    zawiera wszystkie poczatkowe procesy, jego nazwa
    MPI_COMM_WORLD.

15
Typy danych MPI
  • Dane wysylane i odbierane sa okreslane przez trzy
    parametry (adres w pamieci, liczba, typ_danych)
  • typ_danych MPI jest zdefiniowany jako
  • predefiniowany, zwiazany z typami danych jezyków
    programowania (np. MPI_INT, MPI_DOUBLE)
  • tablica danych typ_danych MPI
  • dowolna struktura typów danych
  • MPI posiada funkcje pozwalajace tworzyc nowe typy
    danych

16
Wybrane typy danych MPI_Datatype
MPI MPI_CHAR MPI_INT MPI_FLOAT MPI_DOUBLE MPI_SHOR
T MPI_LONG MPI_BYTE MPI_PACKED
jezyk C char int float double short int long
int ciag bajtów wewnetrzny typ MPI
17
Znaczniki (stemple) MPI (tag)
  • Wiadomosci sa wysylane ze zdefiniowanym przez
    uzytkownika znacznikiem (liczba naturalna) tag w
    celu jednoznacznej identyfikacji wiadomosci przez
    proces odbierajacy
  • Wiadomosci odbierane moga byc weryfikowane
    poprzez uzycie odpowiedniego znacznika lub
    przyjmowane z dowolnym znacznikiem podajac
    wartosc znacznika jako MPI_ANY_TAG

18
MPI podstawowe (blokujace) wysylanie komunikatu
  • MPI_SEND (start, count, datatype, dest, tag,
    comm)
  • MPI_SEND (adres w pamieci danej/danych, liczba
    danych, typ danych, docelowy proces, znacznik,
    komunikator)
  • W jezyku C/C
  • int MPI_Send( void buf, int count, MPI_Datatype
    datatype, int dest, int tag, MPI_Comm comm )
  • Wiadomosc bufor -okreslona przez (start, count,
    datatype).
  • Docelowy proces definiowany przez dest, który
    jest ranga procesu w komunikatorze okreslonym
    przez comm.
  • Po powrocie z tej funkcji, komunikat jest wyslany
    do systemu i mozna zmieniac zawartosc bufora.
    Wiadomosc mogla jeszcze nie dotrzec do odbiorcy.

19
MPI podstawowe (blokujace) odebranie wiadomosci
  • MPI_RECV(start, count, datatype, source, tag,
    comm, status)
  • MPI_RECV(adres w pamieci, liczba danych, typ
    danych, zrodlowy proces, tag, komunikator, status
    wiadomosci)
  • int MPI_Recv( void buf, int count, MPI_Datatype
    datatype, int source, int tag, MPI_Comm comm,
    MPI_Status status )
  • Czeka dopóki pasujaca (source i tag zródlo i
    znacznik) wiadomosc zostanie otrzymana z systemu
    i wstawiona do bufora
  • source jest ranga procesu wysylajacego komunikat
    w komunikatorze comm, lub MPI_ANY_SOURCE (dowolne
    proces wysylajacy komunikat)
  • status zawiera dodatkowe informacje (nastepny
    slajd)
  • Pobranie mniejszej niz count liczby wiadomosci
    typu datatype jest prawidlowe ale pobranie
    wiekszej liczby powoduje wystapienie bledu

20
Pobieranie dodatkowych informacji na temat
otrzymanej wiadomosci
  • status jest struktura która wczesniej musi zostac
    zdefiniowana w programie uzytkownika
  • recvd_tag znacznik wiadomosci
  • recvd_from ranga procesu który wyslal w.
  • recvd_count liczba danych otrzymanych
  • int recvd_tag, recvd_from, recvd_count
  • MPI_Status status
  • MPI_Recv(..., MPI_ANY_SOURCE, MPI_ANY_TAG, ...,
    status )
  • recvd_tag status.MPI_TAG
  • recvd_from status.MPI_SOURCE
  • MPI_Get_count( status, datatype, recvd_count )

21
Przykladowy program
  • Dwa procesy, pierwszy obslugiwany przez
    funkcje ProcA(), wywolywany dla procesu z ranga
    0, drugi ProcB() dla rangi1
  • ProcB() wysyla dwie wartosci do ProcA()
  • ProcA() odczytuje je

22
  • 1 include ltstdlib.hgt
  • 2 include ltmpi.hgt
  • 3 include ltstdio.hgt
  • 4
  • 5 define MY_TAG1 1
  • 6 define MY_TAG2 2
  • 7 define MASTER 0
  • 8
  • 9 MPI_Status status
  • 10
  • 11 void procA()
  • 12
  • 13 double wart1,wart2
  • 14 MPI_Recv(wart2, 1, MPI_DOUBLE,
    MPI_ANY_SOURCE, MY_TAG2,MPI_COMM_WORLD, status)
  • 15 printf("procA otrzymano wartosc 2
    f\n",wart2)
  • 16 MPI_Recv(wart1, 1, MPI_DOUBLE,
    MPI_ANY_SOURCE, MY_TAG1,MPI_COMM_WORLD, status)
  • 17 printf("procA otrzymano wartosc 1
    f\n",wart1)
  • 18
  • 19

23
  • 30 int main(int argc, char argv)
  • 31
  • 32 int rank
  • 33
  • 34 if(MPI_Init(argc, argv) ! MPI_SUCCESS)
  • 35
  • 36 printf("MPI initialization error\n")
  • 37 exit(1)
  • 38
  • 39
  • 40 MPI_Comm_rank(MPI_COMM_WORLD, rank)
  • 41
  • 42 if (rank0) procA()
  • 43 if (rank1) procB()
  • 44
  • 45 MPI_Finalize()
  • 46
  • 47 return 0

24
Wstep do operacji kolektywnych w MPI
  • Operacje kolektywne sa wywolywane przrz wszystkie
    procesy w komunikatorze
  • MPI_BCAST rozsyla dane z jednego procesu
    (ranga0) to wszystkich pozostalych w
    komunikatorze
  • MPI_REDUCE przetwarza dane ze wszystkich procesów
    w komunikatorze i wynik zwraca w jednym z
    procesów
  • W wielu programach funkcje SEND/RECEIVE moga byc
    zamienione przez BCAST/REDUCE, powodujac wzrost
    przejrzystosci i wydajnosci programu

25
Redukcja
Obliczenie funkcji z wykorzystaniem danych
wszystkich procesów w grupie comm np. suma,
iloczynitp. wartosci.int ierr
MPI_Reduce((void )sendbuf,(void )recvbuf,
int count, MPI_Datatype type,MPI_Op op, int
root,MPI_Comm comm)W wyniku wywolania tej
funkcji przez wszystkie procesyproces root
otrzymuje w recvbuf wartosc operacji.Rodzaj
operacji zdefiniowany jest przez op, typ
danychtype, liczba danych count. Wartosc
przekazywana jestprzez sendbuf.
26
Predefiniowane operacje
MPI MPI_MAX MPI_MIN MPI_SUM MPI_PROD MPI_LAND MPI_
BAND ...
operacja maksimum minimum suma iloczyn Logiczna
AND Bitowe AND
27
Przyklad obliczenie PI
  • include ltmpi.hgt
  • include ltmath.hgt
  • int main(int argc, char argv)
  • int done 0, n, myid, numprocs, i, rcdouble
    PI25DT 3.141592653589793238462643double mypi,
    pi, h, sum, x, aMPI_Init(argc,argv)MPI_Comm_
    size(MPI_COMM_WORLD,numprocs)MPI_Comm_rank(MPI_
    COMM_WORLD,myid)while (!done) if (myid
    0) printf("Enter the number of intervals
    (0 quits) ") scanf("d",n)
    MPI_Bcast(n, 1, MPI_INT, 0, MPI_COMM_WORLD)
    if (n 0) break

28
  • h 1.0 / (double) n sum 0.0 for (i
    myid 1 i lt n i numprocs) x h
    ((double)i - 0.5) sum 4.0 / (1.0 xx)
    mypi h sum MPI_Reduce(mypi, pi, 1,
    MPI_DOUBLE, MPI_SUM, 0,
    MPI_COMM_WORLD) if (myid 0) printf("pi
    is approximately .16f, Error is .16f\n",
    pi, fabs(pi - PI25DT))MPI_Finalize()
  • return 0

29
Przyczyny zakleszczen (deadlocks)
  • Wysylanie duzych wiadomosci z procesu 0 do
    procesu 1
  • Jesli nie ma wystarczajacego miejsca do
    przechowania informacji, wysylajacy musi zaczekac
    do momentu gdy zostanie przydzielona odpowiednia
    ilosc pamieci w procesie odbierajacym (podczas
    instrukcji odbioru)
  • Przyklad
  • Powyzszy przyklad jest niebezpieczny poniewaz
    jego prawidlowe wykonanie zalezy od dostepnosci
    buforów w systemach

30
Przykladowe rozwiazania niebezpiecznych programów
  • Zmiana kolejnosci rozkazów
  • Uzycie nie-blokujacych operacji

31
Bariery
Utworzenie bariery oczekiwanie az pozostale
procesy w grupie comm równiez utworza
bariere. int ierr MPI_Barrier(MPI_Comm comm)
About PowerShow.com