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).