Somme prefisse Lezione n°2 Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi Somma su albero binario (1) Con n foglie e 2n-1 processori Input alle foglie output alla radice Numerazione dalla radice alle foglie Somma(x) begin for i = n to 2n-1 pardo Pi: ai = read() /* input alle foglie */ for i = log n -1 to 0 do for j = 2i to 2i+1-1 pardo Pj: aj = a2j + a2j+1 return a1 end Tempo parallelo logaritmico P1 X1+…+x8 P2 X1+…+x4 X5+…+x8 P3 P4X1+x2 P5X3+x4 X5+x6 P6 X7+x8 P7 P8 x1 x2 x2 x3 x5 x6 x7 x8 P15 Somma su albero binario (2) Con n foglie e 2n-1 processori Input alle foglie output alla radice Numerazione dalle foglie alla radice Somma(x) begin for i = 1 to n pardo Pi: ai = read() /* input alle foglie */ for i = log n -1 to 0 do for j = 2i to 2i+1-1 pardo P2n-j: a2n-j = a2n-2j + a2n-(2j+1) return a2n-1 end Tempo parallelo logaritmico P15 X1+…+x8 P13 X1+…+x4 X5+…+x8 P14 P9X1+x2 P10 X3+x4 X5+x6 P11 X7+x8 P12 P1 x1 x2 x2 x3 x5 x6 x7 x8 P8 Somme prefisse Sequenziale PrefixSum(A, n) begin for i = 1 to n-1 do A[ i ] = A[ i ] + A[ i-1 ] end Tempo O(n) 2 5 1 3 2 6 0 1 2 7 8 11 13 19 19 20 Somme prefisse su P-RAM P-RAM EREW con n processori PrefixSum(A, n) begin for i = 0 to log n -1 do for j = 0 to n-1 -2i pardo Pj: A[ j+2i ] = A[ j ] + A[ j+2i ] end 2 5 2 2 1 5 7 3 1 6 7 3 4 6 2 5 6 8 Tempo Parallelo O(log n) 9 5 4 2 7 8 0 11 11 12 11 7 2 1 1 6 8 0 6 2 2 2 8 8 11 13 19 19 20 7 11 Somme prefisse su mesh Ogni processore ha il valore da sommare in xi,j begin for i = 0 to R-1 pardo for j = 1 to C-1 do •Pi,j: xi,j = xi,j + xi,j-1 •P0,C-1: su0,C-1 = 0 for i = 1 to R-1 do •Pi,C-1: sui,C-1 = xi-1,C-1 + sui-1,C-1 for i = 1 to R-1 pardo for j = C-2 downto 0 do •Pi,j: sui,j = sui,j+1 for i = 1 to R-1 pardo for j = 0 to C-1 pardo •Pi,j: xi,j = xi,j + sui,j end Tempo parallelo R+C Somme prefisse su albero binario Le n foglie hanno già il valore da sommare nella variabile xi •begin • for i = log n -1 downto 0 do • for j = 2i to 2i+1-1 pardo •Pj: xj = x2j + x2j+1 •P1:sp1 = 0 • for i = 0 to log n -1 do • for j = 2i to 2i+1-1 pardo •Pj: sp2j = spj • sp2j+1 = spj + x2j • for i = n to 2n-1 pardo •Pi: xi = xi + spi •end P2 P8 x1 X5+…+x8 X1+…+x4 P4 X1+x2 x2 P3 X5+x6 P 6 P5 X3+x4 x2 x3 x5 x6 X7+x8 P 7 x7 x8 P15 sp = 0 X1+…+x8 sp = X1+…+x4 sp = 0 X1+…+x4 X5+…+x8 sp = X1+…+x6 X1+x2 sp = 0 X1+x2 X5+x6 X3+x4 X7+x8 x1 sp = 0 Tempo parallelo logaritmico X1+…+x8 P1 x1 x2 sp = X1+…+x7 x3 x4 x5 x6 x7 x8 Concorrenza in lettura e scrittura Memoria PRAM P0 – – – – P1 P2 EREW: Exclusive Read, Exclusive Write; CREW: Concurrent Read, Exclusive Write; ERCW: Exclusive Read, Concurrent Write; CRCW: Concurrent Read, Concurrent Write; Pn-1 Scrittura Concorrente Nei modelli a scrittura concorrente, quando più processori richiedono di scrivere in una stessa locazione di memoria condivisa, viene consentita la scrittura ad un solo processore in accordo con uno dei seguenti criteri di scelta: – stabilita una scala di priorità tra i processori, si permette la scrittura solo al processore nella prima posizione della scala (CRCW prioritaria); – supposto che tutti i processori vogliano scrivere lo stesso valore, consentire la scrittura ad uno qualunque dei processori (CRCW arbitraria). Esistono in letteratura altri criteri, anche se meno usati, che permettono ad un fissato processore di scrivere nella cella di memoria il valore di una funzione di tutti i dati (ad esempio il massimo, lo xor, la somma). Esempio di Algoritmo su P-RAM di tipo CREW Si adoperano n processori Assumiamo A[ i ] tutti distinti Cerca(A, n, x) begin indice = -1 for i = 0 to n-1 pardo Pi: if A[ i ] = x then indice = i return indice end /* lettura concorrente di x */ Tempo parallelo costante Se A può contenere elementi ripetuti allora più processori possono scrivere concorrentemente la variabile indice: il modello necessario in tal caso è la P-RAM CRCW con scrittura concorrente basata su priorità dei processori (es viene scritto il valore dato dal processore di indice massimo tra quelli che tentano di scrivere).