Somme prefisse su reti Ricerca in vettori ordinati Lezione n°7 Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi 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 = 0 to R-1 pardo for j = 0 to C-2 pardo Pi,j: xi,j = xi,j + sui,j end Tempo parallelo R+C AA 2011-2012 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 P i i+1 for j = 2 to 2 -1 pardo P j: xj = x2j + x2j+1 P X +…+x X1+…+x8 1 1 2 P4 X1+x2 P1: sp1 = 0 for i = 0 to log n -1 do for j = 2i to 2i+1-1 pardo P j: sp2j = spj sp2j+1 = spj + x2j for i = n to 2n-1 pardo P i: xi = xi + spi end P8 x1 X5+…+x8 P 3 4 X5+x6 P 6 P5 X3+x4 x2 x2 x3 x5 x6 X7+x8 P 7 x7 x8 P15 sp = 0 X1+…+x8 sp = X1+…+x4 sp = 0 X1+…+x4 X1+x2 AA 2011-2012 X3+x4 X5+x6 X7+x8 sp = X1+…+x7 x1 sp = 0 x1 sp = X1+…+x6 X1+x2 sp = 0 Tempo parallelo logaritmico X5+…+x8 x2 x3 x4 x5 x6 x7 x8 Ricerca di un elemento in un vettore ordinato Variabili: • N: numero dei processori • y: elemento da cercare • X = (x1, x2, …, xn), tale che x1 x2 … xn: vettore in cui cercare y • l ed r (inizializzati a 0 ed n rispettivamente): estremi del vettore su cui si lavora; • q0,…qN+1 (relative a ciascun processore + 2 aggiuntive): indice degli elementi da analizzare; • c0,…cN+1 (inizializzate a 0, cN+1 inizializzata ad 1): identificatori del sottovettore su cui iterare. Input: X, y Output: i t.c. xi y xi+1 • Passo 1: dividi iterativamente il vettore in sottovettori più o meno bilanciati finché il numero di elementi nel sottovettore identificato non è N e controlla se X[qi]=y; • Passo 2: controlla se nel sottovettore di dimensione N è presente l’elemento cercato. AA 2011-2012 Algoritmo Ricerca Binaria P1: c0 = 0; cN+1 = 1 while (r-l) > N do Pj: for j = 1 to N pardo if j = 1 then q0 = l; qN+1 = r qj = l + j (r-l) / (N+1) if y = X[ qj ] then return qj else if y > X[ qj ] then cj = 0 else cj = 1 if cj < cj+1 then l = qj; r = qj+1 if j = 1 and c0 < c1 then r = q1 Pj: for j = 1 to N pardo if y = X[ l+j ] then return l+j else if y > X[ l+j ] then cj = 0 else cj = 1 if cj < cj+1 then return l+j if j = 1 and c0 < c1 then return l AA 2011-2012 Passo 1 Passo 2 Esempio l 0 r 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 n = 14 N=2 y = 37 x - -22 -3 4 10 12 15 27 32 35 42 55 56 61 70 q0 q1 q2 0 c l 4 1 6 7 8 9 10 3 0 0 1 1 r 5 2 q3 11 Passo 2 l x 10 12 15 27 32 35 42 55 q0 q1 0 c q2 1 2 q3 7 r 8 9 10 11 x 27 32 35 42 55 0 3 c 0 0 0 1 AA 2011-2012 1 2 3 0 0 1 1 return 9 Complessità dell’algoritmo Ciascuna iterazione del Passo 1 richiede tempo O(1). Analizziamo il numero di iterazioni esplicitando la dimensione si del sottovettore nell’iterazione i-esima: s0 = n+2 si+1 = si / (N+1) = s0 / (N+1)i Quindi il numero totale di iterazioni è: logN+1(n+2) = log2(n+2) / log2(N+1) Il Passo 2 richiede tempo costante, quindi il tempo complessivo richiesto dall’algoritmo è O(log2(n+2) / log2(N+1)). Il modello di PRAM è CREW perché tutti gli N processori accedono contemporaneamente alle variabili y, l, r e c. Si noti che, quando N = O(1), il costo complessivo dell’algoritmo è O(log n): pari all’ottimo nel sequenziale. Quando N = O(n) il tempo diventa costante. AA 2011-2012