Najczestsze bledy i wypaczenia przy stosowaniu komunikacji zbiorowej - PowerPoint PPT Presentation

About This Presentation
Title:

Najczestsze bledy i wypaczenia przy stosowaniu komunikacji zbiorowej

Description:

Komunikacja zbiorowa: cz II Najcz stsze b dy i wypaczenia przy stosowaniu komunikacji zbiorowej Grupy proces w i podzia komunikator w – PowerPoint PPT presentation

Number of Views:26
Avg rating:3.0/5.0
Slides: 33
Provided by: Adam1204
Category:

less

Transcript and Presenter's Notes

Title: Najczestsze bledy i wypaczenia przy stosowaniu komunikacji zbiorowej


1
Komunikacja zbiorowa czesc II
  • Najczestsze bledy i wypaczenia przy stosowaniu
    komunikacji zbiorowej
  • Grupy procesów i podzial komunikatorów
  • Operacje na grupach procesów
  • Komunikacja wewnatrzgrupowa i komunikatory
    wewnetrzne
  • Komunikacja miedzygrupowa i komunikatory
    zewnetrzne

2
  • Bledy i wypaczenia w komunikacji zbiorowej
  • Wywolanie procedury komunikacji zbiorowej tylko
    dla czesci procesorów zawartych w
    zaspecyfikowanym komunikatorze.
  • W szczególnosci zapomnienie o tym, ze w przypadku
    MPI_Bcast zarówno procesor zródlowy jak i wszyscy
    odbiorcy musza zawolac te procedure.
  • Zalozenie, ze wszystkie procesory jednoczesnie
    zakoncza wykonywanie danej procedury komunikacji
    zbiorowej.
  • Uzycie tego samego bufora wejsciowego i
    wyjsciowego w wywolaniu MPI_Reduce
    (MPI_Allreduce).

3
1 i 2. Wywolanie w zaleznosci od procesora
(BARDZO POWAZNY blad, bo nie powoduje zatrzymania
programu i przez to znakomicie utrudnia jego
odrobaczenie). if (rank 0)
MPI_Bcast(dane, ..., Master, ...,
MPI_COMM_WORLD) do_masters_work() else
do_work(dane,wyniki) MPI_Gather(wyniki,...,Ma
ster,...,MPI_COMM_WORLD) W takim przypadku
master wysle dane do pozostalych procesorów ale
dane te nigdy nie zostana odebrane, natomiast
wyniki wyslane przez robotników nigdy nie zostana
odebrane przez mastera. Nalezy napisac
tak MPI_Bcast(dane, ..., Master, ...,
MPI_COMM_WORLD) if (rank 0)
do_masters_work() else do_work(dane,wyniki)
MPI_Gather(wyniki,...,Master,...,MPI_COMM_WORLD)

4
4. Uzycie tego samego bufora wejsciowego i
wyjsciowego w MPI_Reduce call MPI_Allreduce(a, a,
1, MPI_REAL, MPI_SUM, comm, ierr) Spowoduje to
natychmiastowy blad wykonania i przerwanie
programu, wiec blad taki jest latwy do wykrycia.
Wymóg, aby bufor wyjsciowy byl rózny od
wyjsciowego zapewnia kompatybilnosc ze standartem
FORTRANu (przekazywanie zmiennej przez adres a
nie przez wartosc) w zwiazku z tym ograniczenie
obowiazuje równiez przy wolaniu MPI_Reduce w
programach w C. Poprawny kod call
MPI_Allreduce(a, a_sum, 1, MPI_REAL, MPI_SUM,
comm, ierr)
5
  • Grupy procesów i podzial komunikatorów
  • Grupa procesów zbiór procesorów uporzadkowany
    wedlug rzedu. W MPI zdefiniowano pusta grupe
    MPI_GROUP_EMPTY oraz dwie stale MPI_GROUP_EMPTY
    (odnosnik do grupy pustej) oraz MPI_GROUP_NULL
    (odnosnik do grupy zdefiniowanej niewlasciwie).
  • Podzial komunikatorów
  • Komunikatory wewnetrzne (intrakomunikatory)
    sluza do komunikacji w obrebie grupy mozliwa
    jest komunikacja punktowa i zbiorowa.
  • Komunikatory zewnetrzne (interkomunikatory)
    sluza do komunikacji pomiedzy dwoma grupami. W
    standarcie MPI-1 mozliwa jest jedynie komunikacja
    punktowa (MPI_Send i MPI_Receive).

6
Charakterystyka intra- i interkomunikatorów
7
Operacje na grupach MPI_GROUP_SIZE(group,
size) zwraca liczbe procesorów w grupie.
MPI_Group_size(MPI_Group group, int size)
MPI_GROUP_SIZE(GROUP, SIZE, IERROR) INTEGER
GROUP, SIZE, IERROR group - grupa size - liczba
procesorów w grupie MPI_GROUP_RANK(group,
rank) zwraca rzad danego procesora w grupie
jezeli procesor nie jest w grupie jest zwracany
rzad MPI_UNDEFINED. group - grupa rank - rzad
procesora w grupie. MPI_Group_rank(MPI_Group
group, int rank) MPI_GROUP_RANK(GROUP, RANK,
IERROR) INTEGER GROUP, RANK, IERROR
8
MPI_GROUP_TRANSLATE_RANKS(group1, n, ranks1,
group2, ranks2) podaje rzedy procesorów z jednej
grupy w innej grupie w przypadku, gdy którys z
procesorów nie nalezy do drugiej grupy zwraca w
tym miejscu MPI_UNDEFINED. group1 - grupa
pierwsza n - liczba procesorów w tablicach
ranks1 i ranks2 ranks1 - tablica rzedów w grupie
pierwszej group2 - grupa druga ranks2 - tablica
rzedów w grupie drugiej MPI_Group_translate_rank
s (MPI_Group group1, int n, int ranks1,
MPI_Group group2, int ranks2) MPI_GROUP_TRANSLA
TE_RANKS(GROUP1, N, RANKS1, GROUP2, RANKS2,
IERROR) INTEGER GROUP1, N, RANKS1(), GROUP2,
RANKS2(), IERROR
9
  • MPI_GROUP_COMPARE(group1, group2, result)
  • porównuje dwie grupy zwracajac wynik w zmiennej
    result
  • MPI_IDENT grupy sa identyczne
  • MPI_SIMILAR grupy zawieraja te same procesory
    ale w innym porzadku
  • MPI_UNEQUAL grupy sa rózne.

10
Kreatory grup MPI_COMM_GROUP(comm,
group) uzyskiwanie wskaznika grupy (group)
odpowiadajacej komunikatorowi comm.
MPI_Comm_group(MPI_Comm comm, MPI_Group group)
MPI_COMM_GROUP(COMM, GROUP, IERROR) INTEGER
COMM, GROUP, IERROR
11
Trzy standardowe operacje mnogosciowe
MPI_GROUP_UNION(group1, group2, newgroup)
MPI_GROUP_INTERSECTION(group1, group2, newgroup)
MPI_GROUP_DIFFERENCE(group1, group2, newgroup)
12
MPI_GROUP_INCL(group, n, ranks,
newgroup) tworzenie nowej grupy z elementów
starej. group - stara grupa n - liczba
procesorów ze starej grupy, które maja byc
wlaczone do nowej ranks - tablica zawierajaca
te rzedy newgroup - nowa grupa.
MPI_Group_incl(MPI_Group group, int n, int
ranks, MPI_Group newgroup) MPI_GROUP_INCL(GROUP,
N, RANKS, NEWGROUP, IERROR) INTEGER GROUP, N,
RANKS(), NEWGROUP, IERROR MPI_GROUP_EXCL(group,
n, ranks, newgroup) tworzy nowa grupe ze
starej poprzez wylaczenie n procesorów o rzedach
podanej w tablicy ranks. Skladnia analogiczna do
MPI_GROUP_INCL.
13
MPI_GROUP_RANGE_INCL(group, n, ranges, newgroup)
MPI_GROUP_RANGE_EXCL(group, n, ranges, newgroup)
Wygodniejsze formy poprzednich. Tablica
ranges(3,) zawiera zakresy wlaczanych/wylaczanych
procesorów ranges(1,i) i ranges(2,i) definiuja
odpowiednio pierwszy i ostatni procesorów w i-tym
zakresie, ranges(3,i) mówi z jakim krokiem
wlacza/wylacza sie procesory (1 - kazdy, 2 - co
drugi, itd.).
Destruktor grupy MPI_GROUP_FREE(group)
MPI_Group_free(MPI_Group group)
MPI_GROUP_FREE(GROUP, IERROR) INTEGER GROUP,
IERROR
14
Komunikacja wewnatrzgrupowa i komunikatory
wewnetrzne
Komunikacja wewnatrzgrupowa wymiana informacji w
obrebie procesorów nalezacych do jednej grupy.
Mozliwe jest tutaj stosowanie zarówno procedur
komunikacji punktowej jak i zbiorowej.
15
Operacje na komunikatorach MPI_COMM_SIZE(comm,
size) MPI_COMM_RANK(comm, rank)
MPI_COMM_COMPARE(comm1, comm2, result)
Wartosci zwracane przez MPI_COMM_COMPARE w
zmiennej result sa podobne jak w przypadku
MPI_GROUP_COMPARE z wyjatkiem, ze w przypadku
identycznosci grup odpowiadajacych komunikatorom
comm1 i comm2 zwracana jest wartosc
MPI_CONGRUENT. Standardowe komunikatory
MPI_COMM_WORLD wszystkie procesory
przydzielone zadaniu MPI_COMM_SELF dany
procesor (zawsze ma rzad 0). MPI_COMM_NULL
pusty komunikator.
16
Kreatory komunikatorów MPI_COMM_DUP(comm,
newcomm) tworzenie duplikatu komunikatora. comm
- stary komunikator newcomm - nowy komunikator.
MPI_Comm_dup(MPI_Comm comm, MPI_Comm newcomm)
MPI_COMM_DUP(COMM, NEWCOMM, IERROR) INTEGER
COMM, NEWCOMM, IERROR
17
MPI_COMM_CREATE(comm, group, newcomm) tworzenie
(paczkowanie) nowego komunikatora. comm -
stary komunikator (moze byc MPI_COMM_WORLD)
group - grupa procesorów, które maja utworzyc
nowy komunikator newcomm - nowy komunikator.
int MPI_Comm_create(MPI_Comm comm, MPI_Group
group, MPI_Comm newcomm) MPI_COMM_CREATE(COMM,
GROUP, NEWCOMM, IERROR) INTEGER COMM, GROUP,
NEWCOMM, IERROR
18
MPI_COMM_SPLIT(comm, color, key, newcomm)
tworzenie nowych komunikatorów poprzez podzial
starego wedlug przypisania zawartego w zmiennej
color. comm - stary komunikator color -
kolor procesory o róznych kolorach beda tworzyly
rózne komunikatory key - klucz wskazuje, jak
ma wzrastac rzad procesorów (jezeli dla dwóch
procesorów w nowej grupie jest taki sam,
kolejnosc rzedów jest tak jak kolejnosc rzedów w
starej grupie) newcomm - nowy komunikator, w
którym znajdzie sie wywolujacy procesor.
Jezeli nie chcemy, zeby dany procesor znalazl
sie w jakimkolwiek z nowych komunikatorów,
nadajemy mu kolor MPI_UNDEFINED.
MPI_Comm_split(MPI_Comm comm, int color, int
key, MPI_Comm newcomm) MPI_COMM_SPLIT(COMM,
COLOR, KEY, NEWCOMM, IERROR) INTEGER COMM,
COLOR, KEY, NEWCOMM, IERROR
19
Rozwazmy grupe procesorów a-j o rzedach (w starym
komunikatorze) od 0-9 (- oznacza kolor
MPI_UNDEFINED)
-
-
  • Wywolanie MPI_COMM_SPLIT dla tego ukladu
    spowoduje powstanie trzech nowych komunikatorów
  • f,g,a,d (kolor 0) rzedy beda wynosily
    odpowiednio 0, 1, 2, 3.
  • e,i,c (kolor 3) rzedy beda wynosily 0, 1, 2.
  • h (kolor 5) rzad oczywiscie 0.
  • Procesory b oraz j nie beda nalezaly do zadnego z
    komunikatorów.

20
Destruktor komunikatora MPI_COMM_FREE(comm)
MPI_Comm_free(MPI_Comm comm)
MPI_COMM_FREE(COMM, IERROR) INTEGER COMM,
IERROR
21
Przyklad Obliczanie liczby p metoda Monte Carlo
Algorytm obliczania liczby p losujemy pary liczb
(x,y) nalezace do przedzialu -1..1 a nastepnie
obliczamy przyblizenie ze stosunku liczby
wylosowanych punktów lezacych w kole scentrowanym
w punkcie (0,0) i o promieniu 1 do liczby
wszystkich wylosowanych punktów.
22
  • Dedykujemy procesor o najwyzszym rzedzie jako
    serwer liczb losowych dla pozostalych procesorów.
  • Z pozostalych procesorów tworzymy grupe przy
    pomocy procedury MPI_GROUP_EXCL oraz
    MPI_COMM_CREATE grupe robotników i definiujemy
    odpowiedni komunikator workers.
  • Robotnicy obliczaja ile przyslanych losowych
    punktów lezy w kole (N_in) a ile poza nim
    (N_out), nastepnie wykorzystujac procedure
    MPI_ALLREDUCE dzialajaca w obrebie komunikatora
    workers.
  • Jezeli obliczone przyblizenie liczby rózni sie od
    wartosci prawdziwej o mniej niz zadeklarowana
    dokladnosc (pobierana z linii polecenia) lub
    przekroczono maksymalna zadeklarowana liczbe
    kroków, program sie konczy. Jezeli nie, kazdy z
    robotników wysyla do serwera zadanie
    inicjalizacji generatora liczb losowych i
    procedura jest powtarzana od punktu 3.
  • Kod zródlowy programu w jezyku C
  • Wyniki (4 procesory)

23
Przyklad zastosowania procedury
MPI_Comm_split Zródlo programu w C Wyniki
24
Komunikacja miedzygrupowa
  • Komunikacja miedzygrupowa wymiana informacji
    pomiedzy procesami nalezacymi do rozlacznych
    grup. Komunikacje miedzygrupowa stosuje sie dla
    zadan modularnych, gdzie informacje musza
    przeplywac pomiedzy kolejnymi grupami (rura) lub,
    w bardziej ogólnym przypadku, plynac po grafie
    zdefiniowanym przez interkomunikatory.

25
  • Cechy komunikacji miedzygrupowej
  • Mozna stosowac jedynie procedury komunikacji
    punktowej.
  • Pomiedzy grupami procesów definiuje sie
    skierowane interkomunikatory zbiór
    interkomunikatorów tworzy graf polaczen.
  • Procesy identyfikuje sie poprzez ich rzedy w
    lokalnych grupach.

26
Kreator interkomunikatorów MPI_INTERCOMM_CREATE(l
ocal_comm, local_leader, bridge_comm,
remote_leader, tag, newintercomm) local_comm -
komunikator lokalny local_leader - rzad
procesora bedacego baza komunikatora lokalnego
musi byc w bridge_comm bridge_comm - komunikator
mostkujacy musi zawierac procesory obu laczonych
grup (na ogól MPI_COMM_WORLD) remote_leader -
rzad procesora-bazy komunikatora odleglego (w
bridge_comm) tag pieczatka interkomunikatora
newintercomm - nowo postaly interkomunikator
27
MPI_Intercomm_create(MPI_Comm local_comm, int
local_leader, MPI_Comm bridge_comm, int
remote_leader, int tag, MPI_Comm newintercomm)
MPI_INTERCOMM_CREATE(LOCAL_COMM, LOCAL_LEADER,
PEER_COMM, REMOTE_LEADER, TAG, NEWINTERCOMM,
IERROR) INTEGER LOCAL_COMM, LOCAL_LEADER,
PEER_COMM, REMOTE_LEADER, TAG, NEWINTERCOMM,
IERROR
28
Tworzenie intrakomunikatora z dwóch
interkomunikatorów MPI_INTERCOMM_MERGE(intercomm
, high, newintracomm) intercomm -
interkomunikator high - kolejnosc procesorów w
tworzonej grupie newintracomm - utworzony
intrakomunikator MPI_Intercomm_merge(MPI_Comm
intercomm, int high, MPI_Comm newintracomm)
Sprawdzanie, czy komunikator jest intra- czy
interkomunikatorem MPI_COMM_TEST_INNER(comm,
flag) comm - komunikator flag - flaga true
jezeli komunikator jest interkomunikatorem
MPI_Comm_test_inter(MPI_Comm comm, int flag)
29
Uzyskiwanie rozmiaru, rzedu procesora oraz grupy
odpowiadajacej lokalnej czesci
interkomunikatora MPI_COMM_RANK (comm, rank)
MPI_COMM_SIZE (comm, size) MPI_COMM_GROUP
(comm, group) Uzyskiwanie rozmiaru oraz grupy
odpowiadajacej odleglej czesci
interkomunikatora MPI_COMM_REMOTE_SIZE (comm,
size) MPI_COMM_REMOTE_GROUP (comm, group)
30
Przyklad Symulacja ukladu ocean atmosfera call
MPI_COMM_SIZE( MPI_COMM_WORLD, nprocs, ierr
) call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr
) if (rank .lt. Size/2 ) then color
OCEAN else color ATMOS endif call
MPI_COMM_SPLIT( MPI_COMM_WORLD, color, rank,
ocean_or_atmos_comm, ierr) call
MPI_INTERCOMM_CREATE( ocean_or_atoms_comm, 0,
MPI_COMM_WORLD, 0, 0, intercomm, ierr) if (color
.eq. OCEAN) then ocean_comm ocean_or_atmos_comm
call do_ocean( ocean_comm ) else atmos_comm
ocean_or_atmos_comm call do_atmos( atmos_comm
) endif call ocean_and_atmos( intercomm )
31
Przyklad bardziej konkretny przeplyw danych
pomiedzy grupami procesorów (rura) Grupe 12
procesorów dzielimy na 3 podgrupy po 4 procesory
w kazdej, jak na rysunku.
Dane sa wymieniane w obie strony pomiedzy grupami
0 i 1 oraz 1 i 2. W tym celu dla grup 0 i 2
musimy zdefiniowac po jednym komunikatorze,
natomiast dla grupy 1 musimy zdefiniowac 2
interkomunikatory - odpowiednio do komunikacji z
grupa 0 i 2.
32
Zródlo programu w C Wyniki (12 procesorów)
Write a Comment
User Comments (0)
About PowerShow.com