Documente Academic
Documente Profesional
Documente Cultură
INTRODUCERE
Algoritmul Floyd-Warshall este folosit n diverse domenii des ntalnite, de la controlul avioanelor de pe un anumit aeroport pn la jocuri informatice, rolul principal fiind acela de gsire a drumului de cost minim ntre un obiect principal i o tint anume.
Fie G=(V, E) un graf orientat, unde V are n elemente (n noduri) i E are m elemente (m muchii) memorat prin matricea ponderilor. Se cere ca pentru dou noduri x,y citite s se determine lungimea minim a drumului de la nodul x la nodul y. Prin lungimea unui drum nelegem suma costurilor arcelor care l alcatuiesc.
PAII ALGORITMULUI
Se genereaza matricea costurilor
1 1
2 5
3 3
4 1
0
1 0 5
2
0
8 0
2
3
Se ncearc pentru oricare pereche de noduri i,j s se obin drumuri mai scurte prin noduri intermediare k. Acest lucru se determin comparnd lungimea lanului a[i,j] cu lungimea lanului care trece prin k( k lund valori de la 1 la n) i dac: a[i,j] > a[i,k]+a[k,j] atunci se atribuie: a[i,j]:= a[i,k]+a[k,j]
PSEUDOCOD SECVENIAL
Input: n numrul de arce; a[0..n-1, 0..n-1] matricea de cost; Output: Matricea a coninnd cel mai scurt drum dintre dou noduri.
for k 0 to n-1 for k 0 to n-1 for j 0 to n-1 temp = a[i][k] + a[k][j] if temp < a[i][j] then a[i][j] temp endfor endfor endfor
PSEUDOCOD SECVENIAL
Pseudocodul anterior poate fi uor de modificat pentru a salva i drumurile efective. Reconstituirea drumurilor se face n mod recursiv.
for k 0 to n-1 for k 0 to n-1 for j 0 to n-1 temp = a[i][k] + a[k][j] if temp < a[i][j] then a[i][j] temp path[i][j] k endfor endfor endfor
ALGORITMUL PARALEL
n implementarea paralel a algoritmului Floyd-Warshall vom avea de luat n considerare gsirea unor soluii pentru:
Partiionarea algoritmului Comunicarea dintre procese Maparea pe coloane sau pe rnduri Deadlocks
PARTIIONARE
Algoritmul secvenial execut aceeai operaie de n3 ori n algoritmul paralel aplicm domain decomposition i mprim
matricea a n cele n2 elementele ale sale. Fiecare element va avea asociat cte un task Task-uri
a[i,j ] este obinut din procesul corespunztor lui i,j ( i * n +j) ex: a[2,3] obinut n urma procesului 2*5 + 3 = 13
PARTIIONARE
Algoritmul secvenial execut aceeai operaie de n3 ori.
a) Prelucrm a[2, 3]
10
a[k, j]. Astfel la o iteraie k: fiecare element din rndul k transmite valoarea sa elementelor din coloana n care se afl; fiecare element din coloana k transmite valoarea sa elementelor din rndul n care se afl; Putem actualiza toate elementele din a simultan n aceeai iteraie k, fiindc actualizarea lui a[i, j] nu depinde de actualizarea elementelor a[i, k] si a[k, j]: a[i, k] := min(a[i, k], a[i, k] + a[k, k]) a[k, j] := min(a[k, j], a[k, k] + a[k, j])
11
Indiferent de varianta aleas, broadcast-ul dintre dou procese va dura: ceil(log p) * ( + n/) Maparea pe rnduri este mai uoar i mai eficient!
Deadlock
Deadlock: atunci cnd un proces ateapt dup o condiie care nu va fi niciodat adevrat. Exemplu de situaii: 2 procese: amndou primesc nainte s trimit; Send tag-ul nu este acelasi cu receive tag ;
float a, b, c; int mpiRank; // Rang-ul procesului MPI MPI_Status status; ... if (mpiRank == 0) { MPI_Recv(&b, 1, MPI_FLOAT, 1, MPI_Send(&a, 1, MPI_FLOAT, 1, } else if (mpiRank == 1) { MPI_Recv(&a, 1, MPI_FLOAT, 0, MPI_Send(&b, 1, MPI_FLOAT, 0, }
13
IMPLEMENTAREA PARALEL
void( compute_shortest_paths( int id, int p, dtype **a, int n){ int i,j,k; int offset; /*local index of broadcast row*/ int root; /*process controlling row to be bcast*/ int *tmp; /*holds the broadcast row*/ tmp =(dtype*) malloc (n*sizeof(dtype)); for (k = 0; k < n; k++){ root = BLOCK_OWNER(k,p,n); if (root == id) { offset = k* BLOK_LOW(id,p,n); for(j = 0; j < n; j++) tmp[j] = a[offset][j]; } MPI_BCAST(tmp, n, MPI_TYPE, root, MPI_COMM_WORLD); for( i = 0; i < BLOCK_SIZE(id, p, n); i++) for (j = 0; j < n; j++) a[i][j]=MIN(a[i][j],a[i][k]+tmp[j]); }
14
ANALIZAREA PERFORMANEI
Cele dou loop-uri interne: (n2 / p) Broadcast ctre p procesoare: (n log p) Loop-ul exterior: (n) Complexitate final: (n * (n log p + n2 / p)) =
(n3 / p + n2 log p)
15
n n / p n n log p ( 4n / )
Message-passing time Messages per broadcast Iterations of outer loop Cell update time
16
ANALIZAREA PERFORMANTEI
Timpul total de execuie este estimativ, deoarece se ignor faptul c pot fi suprapuneri ntre procesare i comunicare:
P 0
P 1 P 2 P 3 Send Ateapt Proceseaz
17
ANALIZAREA PERFORMANTEI
Se observ n figura anterioar c spre exemplu procesul 1 nu poate
18
n n / p n n log p log p 4n /
Message transmission Message-passing time Messages per broadcast Iterations of outer loop Cell update time
19
ANALIZAREA PERFORMANEI
Performana prezis vs. performana actual Timpul de executie (sec) Procesul 1 2 Prezis 25.54 13.02 Actual 25.54 13.89
3
4 5 6 7 8
9.01
6.89 5.86 5.01 4.40 3.94
9.60
7.29 5.99 5.16 4.50 3.98
20
BIBLIOGRAFIE
Cormen, Thomas H., Leiserson, Charles E., Rivest,
Ronald L. (1990). Introduction to Algorithms (1st ed.). MIT Press and McGraw-Hill. Section 26.2, "The Floyd Warshall algorithm", pp. 558565;