Topologie wirtualne Topologia wirtualna: zadany schemat połączeń pomiędzy procesorami; inaczej mówiąc schemat ich wzajemnego sąsiedztwa. W MPI można określić dwa typy topologii: • topologie zdefiniowane przez grafy połączeń między procesorami (przypadek ogólny) • topologie kartezjańskie (siatki) Wyróżnienie topologii siatek jest uzasadnione bardzo częstym ich stosowaniem (rozwiązywanie równań różniczkowych cząstkowych, mnożenie macierzy, itp.) Tworząc wirtualną topologię definiujemy nowy
35
Embed
Topologie wirtualne Topologia wirtualna: zadany schemat połączeń pomiędzy
Topologie wirtualne Topologia wirtualna: zadany schemat połączeń pomiędzy procesorami; inaczej mówiąc schemat ich wzajemnego sąsiedztwa. W MPI można określić dwa typy topologii: topologie zdefiniowane przez grafy połączeń między procesorami (przypadek ogólny) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Topologie wirtualne
Topologia wirtualna: zadany schemat połączeń pomiędzyprocesorami; inaczej mówiąc schemat ich wzajemnego sąsiedztwa.
W MPI można określić dwa typy topologii:• topologie zdefiniowane przez grafy połączeń między
procesorami (przypadek ogólny)
• topologie kartezjańskie (siatki)
Wyróżnienie topologii siatek jest uzasadnione bardzo częstym ich stosowaniem (rozwiązywanie równań różniczkowych cząstkowych, mnożenie macierzy, itp.)
Tworząc wirtualną topologię definiujemy nowy komunikator.
Przykład: Schemat komunikacji w układzie 12 procesoróww topologii cylindra (kartezjańskiej z periodycznością w wymiarze poziomym).
Motywacja stosowania topologii wirtualnych: • pozwalają na dopasowanie nazewnictwa
procesorów do schematu komunikacji
• upraszczają strukturę programu i czynią go bardziej czytelnym
• informacja o topologii może pozwolić MPI na dodatkową optymalizację komunikacji przez odpowiednie mapowanie wirtualnej i sprzętowej topologii połączeń
• topologia kartezjanska pozwala na zdefiniowanie n-wymiarowej siatki z periodycznymi lub nie warunkami brzegowymi
comm_old - wejściowy komunikator ndims - liczba wymiarów siatki dims - tablica z rozmiarami siatki w każdym z wymiarów periods - tablica logiczna określająca warunki brzegowe dla każdego z
wymiarów (periodyczne dla true) reorder - jesli true numercja procesorów może być zmieniona w
tworzonym komunikatorze względem wejściowego komunikatora comm_cart - komunikator o topologii kartezjanskiej powstały w wyniku
wykonania procedury
int MPI_Cart_create (MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_cart)
nnodes - liczba wierzchołków grafuindex - tablica (liczb całkowitych) określająca liczbę dotychczas określonych połączeń pomiędzy wierzchołkamiedges - tablica (liczb całkowitych) określająca połączenia w grafie
#sąsiedzi
0 1,21 02 0,33 2
nnodes=4
index=2,3,5,6
edges=1,2,0,0,3,2
Ogólnie (tworzenie topologii zdefiniowanej przez dowolny graf) c.d.
w C index[0] zawiera liczbę połączeń procesu 0 index[i-1] zawiera ilość połączeń procesu iedges[j] dla 0 ≤ j ≤ index[0]-1 zawiera listę połączeń procesu 0edges[j] dla index[i-1] ≤ j ≤ index[i]-1 lista połączeń procesu i>0
w Fortranie index(1) zawiera liczbę połączeń procesu 0 index(i+1)- index(i) zawiera ilość połączeń procesu iedges(j) dla 1 ≤ j ≤ index(1) zawiera listę połączeń procesu 0edges(j) dla index(i)+1 ≤ j ≤ index(i+1) lista połączeń procesu i>0
Funkcje określające parametry topologii kartezjańskiej
Określanie wymiarowości:
MPI_CARTDIM_GET(comm, ndims) comm - komunikator z określoną strukturą kartezjańską ndims - wymiarowość struktury kartezjańskiej
comm – komunikator z określoną strukturą kartezjańską maxdims – wymiar przestrzeni kartezjańskiejdims – tablica liczb procesorów wzdłuż poszczególnych współrzędnych
periods – okresowość (tablica logiczna)
coords – współrzędne kartezjańskie procesora wołającego procedurę int MPI_Cart_get(MPI_Comm comm, int maxdims, int *dims, int *periods, int *coords)
Określanie współrzędnych kartezjańskich procesora o danym rzędzie
MPI_CART_COORDS(comm, rank, maxdims, coords)
comm - komunikatorrank - rząd procesora maxdims - długość wektora coord coords - tablica całkowita zawierająca współrzędne kartezjańskie danego procesora
int MPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int *coords)
comm - komunikatordirection - wymiar współrzędnej disp - przesunięcie (> 0: w górę,< 0: w dół) rank_source - rząd sąsiada poprzedniego w kierunku disp (procesu źródłowego) rank_dest - rząd sąsiada następnego w kierunku disp (procesu celowego) int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest) MPI_CART_SHIFT(COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR)INTEGER COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR
Utworzenie nowego komunikatora z wybranych współrzędnych
MPI_CART_SUB(comm, remain, new_comm)
comm – komunikator o zdefiniowanej topologii kartezjańskiejremain – tablica logiczna z wartościa true dla tych wymiarów ktore
zostaną skopiowane new_comm - nowy komunikator zawierający wybrane wymiary wejściowej
topologii
int MPI_Cart_sub (MPI_Comm comm, int *remain, MPI_Comm *new_comm ) MPI_CART_SHIFT (COMM,REMAIN,NEW_COMM, IERROR) INTEGER COMM, COMM,REMAIN(*),NEW_COMM, IERROR
Przesuniecie każdej kolumny tablicy rozposzonej w topologii torusa 3x4
INTEGER comm_2d, rank, coords(2), ierr, source, dest INTEGER status(MPI_STATUS_SIZE), dims(2) LOGICAL reorder, periods(2)REAL a, b CALL MPI_COMM_SIZE(MPI_COMM_WORLD, isize, ierr) IF (isize.LT.12) CALL MPI_ABORT(MPI_COMM_WORLD, ERR, ierr) CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
a = rank b = -1dims(1) = 3 dims(2) = 4 periods(1) = .TRUE. periods(2) = .TRUE.reorder = .TRUE.
Przykład zastosowania topologii wirtualnych: równoległy algorytm metody Jacobiego rozwiązywania zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych
Sformułowanie problemu
2
2
2
22
2
y)g(x,y)u(x,
),(
y
u
x
uu
yxfu
wewnątrz obszaru,
na granicy obszaru.
2
2
22
2
22
2
,4,,,,
,2,,
,2,,
h
yxuhyxuhyxuyhxuyhxuu
h
yxuhyxuhyxu
y
u
h
yxuyhxuyhxu
x
u
Dyskretyzacja zagadnienia
Dyskretyzacja zagadnienia na siatce prostokątnej
ij2ij1j,ij,1i1j,ij,1i f
h
u4uuuu
nx
nyx=i/nx
y=j/ny
fij – wartość funkcji stojącej po prawej stronie równania w węźle (i,j)
uij – wartość rozwiązania w węźle (i,j)
Założenia zadania:
fij=0 dla każdego i,j
u0i=1, ui0=1
uny+1,0=0, u0,nx+1=0
Rozwiązanie numeryczne metodą iteracji Jacobiego
toluu until
fhuuuu4
1u
repeat
)k()1k(
ij2)k(
1j,i)k(
j,1i)k(1j,i
)k(1j,i
)1k(ij
Kod szeregowy iteracji Jacobiego: część podstawowa
C Pętla główna DO WHILE(.NOT.converged) C Obliczanie nowego przybliżenia U DO j=1, n DO i=1, n UNEW(i,j)=0.25*(U(i-1,j)+U(i+1,j)+U(i,j-1)+U(i,j+1)- & H*H*F(I,J)) ENDDO ENDDO C Kopiujemy nowe przybliżenie do macierzy U DO j=1, n DO i=1, n U(i,j) = UNEW(i,j) ENDDO ENDDO ... C Test zbieżności (kod wycięty z braku miejsca) ENDDO
Przykładowy podział punktów siatki pomiędzy procesory dla 9 warstw i 3 procesorów
nx
ny
Do obliczenia elementów tablicy u leżących na granicy podziału, procesor o 1 będzie potrzebował elementów u z pierwszego rzędu przypisanego procesorowi 2 oraz ostatniego rzędu przypisanego procesorowi 0.Podobnie, procesory 0 i 2 będą potrzebowały od procesora 1 elementów z odpowiednio pierwszego i ostatniego rzędu jemu przypisanych.
Projektowanie komunikacji
nx
ny
Tworzenie jednowymiarowej topologii kartezjańskiej i podziałwarstw punktów siatki między procesory
Wymiana granicznych wartości u pomiędzy danym procesorema jego topologicznymi sąsiadami
Obliczanie przez każdy procesor przydzielonego mu paska tablicy u
Obliczanie różnicy pomiędzy poprzednim i obecnym przybliżeniem rozwiązania
Zbieżność?N
Stop
T
cc Tworzenie jednowymiarowej topologii kartezjańskiejc call MPI_CART_CREATE( MPI_COMM_WORLD, 1, numprocs, .false., $ .true., comm1d, ierr )cc Rząd procesora w nowym komunikatorze comm1d odpowiadającymc jednowymiarowej siatce kartezjańskiej oraz określenie jego sąsiada dolnegoc (nbrbottom) i górnego (nbrtop)c call MPI_COMM_RANK( comm1d, myid, ierr ) call MPI_Cart_shift( comm1d, 0, 1, nbrbottom, nbrtop, ierr )cc Podział pracy: ny wartstw siatki jest dzielone pomiędzy numprocs c procesorów s i e są numerem pierwszej i ostatniej warstwy obsługiwanej c przez dany procesor.c call MPE_DECOMP1D( ny, numprocs, myid, s, e )
subroutine MPE_DECOMP1D( n, numprocs, myid, s, e ) integer n, numprocs, myid, s, e integer nlocal integer deficitc nlocal = n / numprocs s = myid * nlocal + 1 deficit = mod(n,numprocs) s = s + min(myid,deficit) if (myid .lt. deficit) then nlocal = nlocal + 1 endif e = s + nlocal - 1 if (e .gt. n .or. myid .eq. numprocs-1) e = n return end
Dekompozycja zadania na kawałki odpowiadające poszczególnym procesorom
cc Inicjalizacja prawej strony równania (f) i tworzenie przybliżenia poczatkowego (u)c call onedinit( u, unew, f, nx, s, e )cc Część obliczeniowac call MPI_BARRIER( MPI_COMM_WORLD, ierr ) t1 = MPI_WTIME() do 10 it=1, 100 call exchng1( u, nx, s, e, comm1d, nbrbottom, nbrtop ) call sweep1d( u, f, nx, s, e, unew ) call exchng1( unew, nx, s, e, comm1d, nbrbottom, nbrtop ) call sweep1d( unew, f, nx, s, e, u )c Obliczanie normy różnicy u i unew; wykorzystana jest globalna operacja redukcji dwork = diff( u, unew, nx, s, e ) call MPI_Allreduce( dwork, diffnorm, 1, MPI_DOUBLE_PRECISION, $ MPI_SUM, comm1d, ierr ) if (diffnorm .lt. 1.0e-5) goto 2010 continue if (myid .eq. 0) print *, 'Failed to converge'20 continue
Kod iteracji Jacobiego dla warstwy punktów siatki przypisanej danemu procesorowic c Perform a Jacobi sweep for a 1-d decomposition. c Sweep from u into unew c subroutine sweep1d( u, f, nx, s, e, unew ) integer nx, s, e double precision u(0:nx+1,s-1:e+1), f(0:nx+1,s-1:e+1), unew(0:nx+1,s-1:e+1) c integer i, j double precision h c h = 1.0d0 / dble(nx+1) do 10 j=s, e do 10 i=1, nx unew(i,j) = 0.25 * (u(i-1,j)+u(i,j+1)+u(i,j-1) + u(i+1,j) - h * h * f(i,j) ) 10 continue return