Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 07/04/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI
Verso un ordinamento ottimo Gli algoritmi paralleli di ordinamento visti fino ad ora raggiungono, nei casi migliori, un costo O(n log 2 n) su PRAM CREW. Nel 1988 R. Cole presentò sul SIAM Journal Computing la prima versione del pipelined-merge sort (poi conosciuto come algoritmo di Cole) che richiede un tempo parallelo O(log n) su una PRAM. Da allora varianti e raffinamenti dell’algoritmo si sono susseguiti in letteratura fino a raggiungere un costo ottimo su PRAM EREW. Nel seguito presentiamo l’idea alla base di questo algoritmo e una serie di concetti e/o algoritmi necessari per la sua realizzazione. Il dettaglio dell’algoritmo è lasciato come tesina di approfondimento. Algoritmi Paralleli e Distribuiti a.a. 2008/09 2
3 Ricerca di un elemento in un vettore ordinato Variabili: N: numero dei processori y: elemento da cercare X = (x 1, x 2, …, x n ), tale che x 1 x 2 … x n : vettore in cui cercare y l ed r (inizializzati a 0 ed n rispettivamente): estremi del vettore su cui si lavora; q 0,…q N+1 (relative a ciascun processore + 2 aggiuntive): indice degli elementi da analizzare; c 0,…c N+1 (inizializzate a 0, c N+1 inizializzata ad 1): identificatori del sottovettore su cui iterare. Input: X, y Output: i t.c. x i y x i+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[q i ]=y; Passo 2: controlla se nel sottovettore di dimensione N è presente l’elemento cercato.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 4 Algoritmo Ricerca Binaria P 1 :c 0 = 0; c N+1 = 1 for j = 1 to N pardo P j : while (r-l) > N do if j = 1 then q 0 = l; q N+1 = r q j = l + j (r-l) / (N+1) if y = X[ q j ] then return q j else if y > X[ q j ] then c j = 0 else c j = 1 if c j < c j+1 then l = q j ; r = q j+1 if j = 1 and c 0 < c 1 then r = q 1 if j r-l then if y = X[ l+j ] then return l+j else if y > X[ l+j ] then c j = 0 else c j = 1 if c j < c j+1 then return l+j if j = 1 and c 0 < c 1 then return l Passo 1 Passo 2
Algoritmi Paralleli e Distribuiti a.a. 2008/09 5 Esempio x -- n = 14 N = 2 y = 37 q0q0 q1q1 q2q2 q3q c0011 lr x q0q0 q1q1 q2q2 q3q c0001 lr x c0011 lr Passo 2 return 9
Algoritmi Paralleli e Distribuiti a.a. 2008/09 6 Complessità dell’algoritmo Ciascuna iterazione del Passo 1 richiede tempo O(1). Analizziamo il numero di iterazioni esplicitando la dimensione s i del sottovettore nell’iterazione i-esima: s 0 = n+2 s i+1 = s i / (N+1) = s 0 / (N+1) i Quindi il numero totale di iterazioni è: log N+1 (n+2) = log 2 (n+2) / log 2 (N+1) Il Passo 2 richiede tempo costante, quindi il tempo complessivo richiesto dall’algoritmo è O(log 2 (n+2) / log 2 (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.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 7 Il concetto di rango Dati X = (x 1, x 2, …, x t ), Y = (y 1, y 2, …, y s ) e z, con z, x i e y j nello stesso insieme U, definiamo: 1. rango(z:X) = numero di elementi in X z Es: X = (-3,8,-2,5), z = 1, rango(z:X) = 2 2. rango(Y:X) = (r 1, r 2, … r s ) con r i = rango(y i :X) Es: X = (15,-3,12,1,-5), Y = (3,-13,-2), rango(Y:X) = (3,0,2) Si noti inoltre che vale la relazione*: rango(x:A B) = rango(x:A) + rango(x:B) *Nota: per semplicità assumiamo che i valori siano tutti distinti.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 8 Fondere tramite rango Il problema di fondere due vettori ordinati A e B in un unico vettore C si può risolvere calcolando il rango degli elementi di A rispetto a B e di quelli di B rispetto ad A: rango(x:A B) è esattamente la posizione in cui l’elemento x si trova nel vettore C. L’algoritmo di Ricerca Binaria può essere utilizzato per calcolare il rango di un elemento in un vettore, ed in particolare il rango di ogni elemento di A in B e viceversa. Con tali informazioni possiamo calcolare C. Esempio: A=(-2, -1, 8) B=(3,6) A B=(-2, -1, 8, 3, 6) rango(A:B)=(0, 0, 2) rango(B:A)=(2,2) rango=(1, 2, 5, 3, 4) C=(-2, -1, 3, 6, 8)