03.07.2013 Views

Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt

Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt

Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4.2. Gebalanceerde bom<strong>en</strong> / Prefixsomm<strong>en</strong> 41<br />

Algoritme 4.6 Berek<strong>en</strong>ing van prefixsomm<strong>en</strong> op PRAM (niet-recursieve formulering)<br />

Input: rij (a1,...,an) met n = 2 ℓ<br />

Output: tabel C: c0,k = sk = ∑ k j=1 a j (1 ≤ k ≤ n)<br />

1: for i from 1 to n pardo<br />

2: Stel b0,i ← ai<br />

3: for h from 1 to log 2 n do<br />

4: for j from 1 to n/2 h pardo<br />

5: Stel bh, j ← bh−1,2 j ⊕ bh−1,2 j+1<br />

6: for h from log 2 n to 0 do<br />

7: for j from 1 to n/2 h pardo<br />

8: case j = 1: Stel ch,0 ← bh,0<br />

9: case j ev<strong>en</strong>: Stel ch, j ← c h+1, j/2<br />

10: case j onev<strong>en</strong>: Stel ch, j ← c h+1,( j−1)/2 ⊕ bh, j<br />

Tot slot besprek<strong>en</strong> we e<strong>en</strong> niet-recursieve versie van Algoritme 4.5. Daarbij gebruik<strong>en</strong> we twee<br />

hulpvariabel<strong>en</strong> voor het bijhoud<strong>en</strong> van de gebalanceerde boom. De tabel (bh, j), met 0 ≤ h ≤<br />

log 2 n <strong>en</strong> 1 ≤ j ≤ n/2 h , wordt opgebouwd tijd<strong>en</strong>s het voorwaarts doorlop<strong>en</strong> van de boom. De<br />

tabel (ch, j) met 0 ≤ h ≤ log 2 n <strong>en</strong> 1 ≤ j < n/2 h , wordt opgebouwd tijd<strong>en</strong>s het achterwaarts<br />

doorlop<strong>en</strong> van de boom. Merk op dat deze hulpvariabel<strong>en</strong> niet echt nodig zijn <strong>en</strong> dat het algoritme<br />

in-place kan word<strong>en</strong> uitgevoerd.<br />

4.2.4 Berek<strong>en</strong><strong>en</strong> van prefixsomm<strong>en</strong> op e<strong>en</strong> rooster<br />

We veronderstell<strong>en</strong> dat de rij getall<strong>en</strong> verdeeld is over de rij<strong>en</strong> van het rooster. Dan kunn<strong>en</strong> de<br />

prefixsomm<strong>en</strong> als volgt berek<strong>en</strong>d word<strong>en</strong>. Elke rij van het rooster doet e<strong>en</strong> rijrotatie; hierdoor<br />

bevat elke rechtse processor van e<strong>en</strong> rij de som van de getall<strong>en</strong> op zijn rij. Vervolg<strong>en</strong>s doet de<br />

rechterkolom van het rooster e<strong>en</strong> kolomrotatie, hetge<strong>en</strong> ervoor zorgt dat deze processor<strong>en</strong> de<br />

correcte prefixsom bevatt<strong>en</strong>. Dan stuurt elke rechtse processor van e<strong>en</strong> rij zijn prefixsom naar<br />

zijn onderbuur. Tot slot doet elke rij (behalve de eerste) weer e<strong>en</strong> rijrotatie. Hierdoor bevat<br />

uiteindelijk elke processor de correcte prefixsom.<br />

Beschouw<strong>en</strong> we de performantie van dit algoritme. Zij p = n. De parallelle uitvoeringstijd is<br />

Tp(n) = Θ( √ p) = Θ( √ n). De kost is Cp(n) = Θ(p 3/2 ) = Θ(n 3/2 ). M.a.w. het algoritme is niet<br />

kost-optimaal.<br />

Om het algoritme te optimaliser<strong>en</strong> bepal<strong>en</strong> we de waarde van p waarvoor p 3/2 = n, of m.a.w.<br />

p = n 2/3 . Dan hebb<strong>en</strong> we e<strong>en</strong> rooster van n 1/3 × n 1/3 processor<strong>en</strong>, <strong>en</strong> elke processor verwerkt<br />

n 1/3 elem<strong>en</strong>t<strong>en</strong> sequ<strong>en</strong>tieel. De parallelle uitvoeringstijd van dit aangepaste algoritme is Tp(n) =<br />

Θ( √ p+n 1/3 ) = Θ(n 1/3 ). De kost is Cp(n) = Θ(p × n 1/3 ) = Θ(n), <strong>en</strong> het aangepaste algoritme<br />

is dus kost-optimaal.<br />

<strong>Algoritm<strong>en</strong></strong> <strong>en</strong> Datastructur<strong>en</strong> <strong>III</strong> Veerle.Fack@UG<strong>en</strong>t.be

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!