Title: Najczestsze bledy i wypaczenia przy stosowaniu komunikacji zbiorowej
1Komunikacja 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).
31 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)
44. 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).
6Charakterystyka intra- i interkomunikatorów
7Operacje 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
8MPI_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.
10Kreatory 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
11Trzy standardowe operacje mnogosciowe
MPI_GROUP_UNION(group1, group2, newgroup)
MPI_GROUP_INTERSECTION(group1, group2, newgroup)
MPI_GROUP_DIFFERENCE(group1, group2, newgroup)
12MPI_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.
13MPI_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
14Komunikacja 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.
15Operacje 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.
16Kreatory 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
17MPI_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
18MPI_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
19Rozwazmy 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.
20Destruktor komunikatora MPI_COMM_FREE(comm)
MPI_Comm_free(MPI_Comm comm)
MPI_COMM_FREE(COMM, IERROR) INTEGER COMM,
IERROR
21Przyklad 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)
23Przyklad zastosowania procedury
MPI_Comm_split Zródlo programu w C Wyniki
24Komunikacja 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.
26Kreator 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
27MPI_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
28Tworzenie 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)
29Uzyskiwanie 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)
30Przyklad 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 )
31Przyklad 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.
32Zródlo programu w C Wyniki (12 procesorów)