Sunteți pe pagina 1din 22

Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritmi paraleli şi distribuiţi


Algoritmi fundamentali

Mitică Craus

Universitatea Tehnică ”Gheorghe Asachi” din Iaşi

1/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Cuprins

Comprimarea (Reducerea)
Algoritm recursiv de comprimare
Algoritm paralel de comprimare
Corectitudinea şi complexitatea
Reducerea numărului unităţilor de procesare
Comentarii
Calculul Prefixelor (Scan)
Algoritmul de calcul al prefixelor ı̂n cazul ı̂n care operatia ⊕ admite
element simetric
Algoritmul de calcul al prefixelor ı̂n cazul ı̂n care operatia ⊕ nu admite
element simetric
Corectitudinea şi complexitatea
Comentarii
Scurtcircuitarea (dublarea)
Algoritm paralel de scurtcircuitare
Complexitatea
Aplicaţii ale scurtcircuitării: Calcul ranguri
Comentarii

2/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Comprimarea (Reducerea)

• Fie M o mulţime de n = 2m elemente, M = {ai /i = 0, 1, . . . , n − 1} ⊆ Mr = mulţime


de referinţă.
• Mult, imea M urmează a fi procesată pentru a calcula valoarea a1 ⊕ · · · ⊕ an , unde ⊕
este o lege de compozit, ie asociativă definită pe Mr .
• Mult, imea de referint, ă Mr poate fi R, iar ⊕ poate fi +, min, max, etc.

3/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritm recursiv de comprimare

• Notat, ii:
• A[0..n − 1] este un tablou de dimensiune n = 2m .
• Prin (A, k, k + l − 1) se notează segmentul din tabloul A care ı̂ncepe pe poziţia k şi se
termină pe poziţia k + l − 1
• Premise:
• Datele de intrare sunt init, ial memorate ı̂n tabloul A[0..n − 1].
• Init, ial, k = 0 si l = n.

Comprim Recursiv(A, k, k + l − 1)
1 if l = 1
2 then return A[k]
3 else return Comprim Recursiv(A, k, k + l/2 − 1) ⊕ Comprim Recursiv(A, k + l/2, k + l − 1).

4/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritm paralel de comprimare

• Notat, ii:
• A[0..2n − 1] este un tablou de dimensiune 2n = 2m+1 .
• Premise:
• Datele de intrare sunt memorate ı̂n tabloul A[0..2n − 1], ı̂n locat, iile
A[n], A[n + 1], . . . , A[2n − 1].

Comprim Paralel(A, ⊕)
1 for k ← m − 1 down to 0
2 do for all j : 2k ≤ j ≤ 2k+1 − 1
3 do in parallel
4 A[j] ← A[2j] ⊕ A[2j + 1];

5/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Exemplu de execuţie a algoritmului de comprimare

Figura 1 : Exemplu de execuţie a algoritmului de comprimare

6/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Corectitudinea şi complexitatea

Teorema (1)
La terminarea execut, iei algoritmului A[1] = a0 ⊕ a1 ⊕ . . . an−1 .

Teorema (2)
Complexitatea timp a algoritmului de comprimare (implementat pe o masina
CREW-PRAM sau pe o ahitectura VLSI de tip arbore binar) este O(log n).

Demonstraţie.
Adâncimea arborelui de calcul este log n.

Teorema (3)
Numarul unităt, ilor de procesare este p ≥ d n2 e

Demonstraţie.
In prima iteraţie sunt active d n2 e unităt, ilor de procesare. Apoi numărul lor scade pâna la 1.

7/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Reducerea numărului unităţilor de procesare


n
• Se poate observa că ı̂n fiecare pas k, k = m − 1, m − 2 . . . , 0, sunt active d m−k
2
e
unităţi de procesar.e Aceasta sugerează faptul că este posibilă reducerea numărului
de unităţi de procesare, fără a afecta complexitatea algoritmului.
• Presupunând că p < d n2 e, se partiţionează mulţimea celor n elemente
a0 , a1 , . . . , an−1 ı̂n p submulţimi astfel:
• Primele p − 1 submulţimi contin k = d pn e elemente.
• Ultima submulţime conţine n − (p − 1)· d pn e (≤ d pn e elemente.
• Fiecărei submulţimi i se asociază o unitate de procesare. Unitatea de procesare
asociată unei submulţimi S = {ai0 , . . . , aik−1 } rezolvă problema determinarii valorii
ai0 ⊕ ... ⊕ aik−1 ı̂n d pn e − 1 unităţi de timp.
• Actionând ı̂n paralel, cele p unităţi de procesare reduc problema iniţială la o
problemă similară de dimensiune p, ı̂n d pn e − 1 unităţi de timp.
• În continuare, aplicând comprimarea asupra problemei rezultate, se obţine rezultatul
final ı̂n log p unităţi de timp.
• Rezultă un timp total de d pn e − 1 + log p unităţi. Dacă p = d log
n
n e, atunci
d logn n e − 1 + log p ' 2 log n − 1 − log log n ∈ O(log n),

8/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Comentarii

• Comprimarea nu se reduce la operarea cu elementele unei mulţime de numere.


• a0 ⊕ a1 ⊕ . . . an−1 pot fi n fis, iere, care urmează a fi concatenate.
• Mai pot fi n instant, e ale unei tabele ale unei baze de date distribuite, care trebuie
unificate.
• În aceste situat, ii algoritmul este distribuit.

9/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Calculul Prefixelor (Scan)

• Tehnica calculării prefixelor dezvoltă tehnica comprimării, ı̂n care parcurgerea


arborelui asociat execut, iei algoritmului se face dinspre frunze spre rădăcină.
• Algoritmii de calcul a prefixelor parcurg arborele de execut, ie ı̂n ambele sensuri.
• Calculul prefixelor constă ı̂n determinarea valorilor
a0 , a0 ⊕ a1 , . . . , a0 ⊕ a1 ⊕ · · · ⊕ an−1 , unde ⊕ este o operat, ie binară asociativă.

10/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritmul de calcul al prefixelor ı̂n cazul


ı̂n care operatia ⊕ admite element simetric
• Notat, ii:
• A[0..2n − 1] este un tablou de dimensiune 2n = 2m+1 .
• Premise:
• Datele de intrare sunt memorate ı̂n tabloul A[0..n − 1], ı̂n locat, iile
A[n], A[n + 1], . . . , A[2n − 1].

Calcul Prefixe ⊕ admite element neutru(A, ⊕)


1 / ∗ Comprimare ∗ /
2 for k ← m − 1 down to 0
3 do for all j : 2k ≤ j ≤ 2k+1 − 1
4 do in parallel A[j] ← A[2j] ⊕ A[2j + 1];
5 / ∗ Calcul prefixe ∗ /
6 B[1] ← A[1];
7 for k ← 1 to m
8 do for all j : 2k ≤ j ≤ 2k+1 − 1
9 do in parallel;
10 if bit0 (j) = 1
11 then B[j] ← B[(j − 1)/2];
12 else B[j] ← B[j/2] ⊕ (−A[j + 1]);

11/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Exemplu de execuţie a algoritmului de calcul al prefixelor ı̂n cazul ı̂n care


operatia ⊕ admite element simetric

12/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritmul de calcul al prefixelor ı̂n cazul ı̂n care operatia ⊕ nu admite


element simetric
• Notat, ii: A[0..2n − 1] şi B[0..2n − 1] sunt tablouri de dimensiune 2n = 2m+1 .
• Premise: Datele de intrare sunt memorate ı̂n tabloul A[0..2n − 1], ı̂n locat, iile
A[n], A[n + 1], . . . , A[2n − 1]. La final,
B[n] = a0 , B[n + 1] = a0 ⊕ a1 , . . . , B[2n − 1] = a0 ⊕ a1 ⊕ · · · ⊕ an−1 .
Calcul Prefixe ⊕ nu admite element neutru(A, ⊕)
1 / ∗ Comprimare ∗ /
2 for k ← m − 1 down to 0
3 do for all j : 2k ≤ j ≤ 2k+1 − 1
4 do in parallel A[j] ← A[2j] ⊕ A[2j + 1];
5 / ∗ Calcul prefixe ∗ /
6 for k ← 0 to m
7 do for all j : 2k ≤ j ≤ 2k+1 − 1
8 do in parallel
9 if j = 2k
10 then B[j] ← A[j];
11 else if bit0 (j) = 1
12 then B[j] ← B[(j − 1)/2];
13 else B[j] ← B[(j − 2)/2] ⊕ (A[j]);

13/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Corectitudinea şi complexitatea

Teorema (4)
La terminarea execut, iei algoritmului,
B[n] = a0 , B[n + 1] = a0 ⊕ a1 , . . . , B[2n − 1] = a0 ⊕ a1 ⊕ · · · ⊕ an−1 .

Teorema (5)
Complexitatea timp a algoritmului paralel de calcul al prefixelor (implementat pe
o masina CREW-PRAM sau pe o ahitectura VLSI de tip arbore binar) este
O(log n).

Demonstraţie.
Adâncimea arborelui de calcul este log n.

Teorema (6)
Numarul unităt, ilor de procesare este d logn n e.

Demonstraţie.
Necesarul de unităt, ide procesare este acelas, i cu cel de la comprimare .
14/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Comentarii

• Ca s, i ı̂n cazul comprimării, calculul prefixelor nu se reduce la operarea cu elementele


unei mulţime de numere.
• Compilatoarele folosesc masiv calculul prefixelor.
• Descopirirea patternurilor frecvente ı̂n colect, ii de date de dimensiuni foarte mari,
cont, ine ca task de bază calculul de prefixe.
• Regăsirea informat, iei este un alt domeniu de aplicare a calculului prefixelor.
• Algoritmii paraleli pot aduce preformanţă sporită.
• Recurent, ele sunt cel mai clar exemplu de aplicare a calculului prefixelor.
• Fie recurent, a xk = xk−1 ⊕ ak , k > 0, x0 = a0 .
• Daca ⊕ este un operator binar asociativ, atunci xk = a0 ⊕ a1 ⊕ . . . ak .

15/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Scurtcircuitarea (dublarea)

• Fie L o listă simplu ı̂nlănţuită formată din n elemente.


• Fiecare element k ∈ L are asociat un număr valoare[k] şi un pointer pointer [k].
• Se presupune că fiecărui element k ∈ L ı̂i este asignată o unitate de procesare pk .
• Scurtcircuitarea se referă la indirectarea prin intermediul pointerilor, pentru a
accesa locaţii noi.

16/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritm paralel de scurtcircuitare

Scurtcircuitare paralela(L, valoare, ⊕)


1 for i ← 1 to log n
2 do for all k : k ∈ L
3 do in parallel
4 if pointer [k] 6= pointer [pointer [k]]
5 then valoare[k] ← valoare[k] ⊕ valoare[pointer [k]];
6 pointer [k] ← pointer [pointer [k]];

17/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Complexitatea

Teorema (7)
Complexitatea timp a algoritmului paralel de scurtcircuitare, implementat pe o masina
CREW-PRAM, este O(log n).

18/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Aplicaţii ale scurtcircuitării: Calcul ranguri

• Un exemplu tipic de utilizare a tehnicii scurtcircuitării ı̂l constituie calcularea


numerelor de ordine ale elementelor unei liste, faţă de sfârşitul acesteia.
• Pentru un element k ∈ L, rang [k] va conţine ı̂n final numărul i al elementor din lista
L care se afla ı̂n listă după elementul k, ı̂n ordinea dată de pointeri.

19/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Algoritm paralel de calcul ranguri

Calcul Ranguri paralel(L, rang , +)


1 / ∗ Init, ializare vectori pointer s, i rang ∗ /for all k : k ∈ L
2 do in parallel
3 pointer [k] ← succesor (k) / ∗ succesor (k) = elementul care urmează lui k ı̂n lista L ∗ /
4 if pointer [k] 6= k
5 then rang [k] ← 1;
6 else rang [k] ← 0;
7 / ∗ Aplicarea tehnicii scurtcircuitării ∗ /
8 Scurtcircuitare paralela(L, rang , +)

20/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Exemplu de execuţie a algoritmului de calcul ranguri

Figura 3 : Exemplu de execuţie a algoritmului de calcul ranguri

21/ 22
Cuprins Comprimarea (Reducerea) Calculul Prefixelor (Scan) Scurtcircuitarea (dublarea)

Comentarii

• Scurtcircuitarea nu se reduce la operarea cu elementele unei liste.


• Documentele web pot fi obiectul unor operaţii de scurtircuitare paralelă, atunci când
se doreşte clusterizarea acestora.
• Rutarea poate folosi tehnica scurtcircuitării paralele.

22/ 22

S-ar putea să vă placă și