Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt
Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt
Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
2.1. Het gedeelde-geheug<strong>en</strong>model 9<br />
Algoritme 2.1 Berek<strong>en</strong><strong>en</strong> van matrix-vector-verm<strong>en</strong>igvuldiging<br />
Input: n×n matrix A <strong>en</strong> vector x; aantal processor<strong>en</strong> p met r = n/p geheel; processornummer i;<br />
Output: compon<strong>en</strong>t<strong>en</strong> y (i−1)r+1,...,yir van y = Ax in globale variabele<br />
1: global read (x, z)<br />
2: global read (A (i−1)r+1:ir,1:n, B)<br />
3: Berek<strong>en</strong> w ← Bz<br />
4: global write (w, y (i−1)r+1:ir)<br />
Algoritme 2.2 Berek<strong>en</strong><strong>en</strong> van matrix-vector-verm<strong>en</strong>igvuldiging (met verkorte notatie)<br />
Input: n×n matrix A <strong>en</strong> vector x; aantal processor<strong>en</strong> p met r = n/p geheel; processornummer i;<br />
Output: compon<strong>en</strong>t<strong>en</strong> y (i−1)r+1,...,yir van y = Ax in globale variabele<br />
1: Berek<strong>en</strong> y (i−1)r+1:ir ← A (i−1)r+1:ir,1:nx<br />
stel z ← x+y<br />
global write (z, c)<br />
met a,b,c gedeelde variabel<strong>en</strong>, <strong>en</strong> x,y,z lokale variabel<strong>en</strong>.<br />
Voorbeeld 2.1.1 (Matrix-vector-verm<strong>en</strong>igvuldiging). Beschouw het verm<strong>en</strong>igvuldig<strong>en</strong> van e<strong>en</strong><br />
n×n matrix A met e<strong>en</strong> vector x van orde n, die beid<strong>en</strong> in het gedeelde geheug<strong>en</strong> opgeslag<strong>en</strong> zijn.<br />
Veronderstel dat we over p processor<strong>en</strong> Pi beschikk<strong>en</strong>, met p ≤ n <strong>en</strong> r = n/p geheel, <strong>en</strong> dat we<br />
in het asynchroon model werk<strong>en</strong>.<br />
E<strong>en</strong> e<strong>en</strong>voudig parallel algoritme bestaat in het opsplits<strong>en</strong> van A in p blokk<strong>en</strong> A (i) van r rij<strong>en</strong>,<br />
waarbij elke processor Pi de vector x <strong>en</strong> e<strong>en</strong> blok A (i) uit het gedeeld geheug<strong>en</strong> leest <strong>en</strong> het<br />
product A (i) x berek<strong>en</strong>t. Dit levert r compon<strong>en</strong>t<strong>en</strong> van de resultaatvector.<br />
Algoritme 2.1 geeft de pseudocode voor processor Pi. Merk op dat alle processor<strong>en</strong> in stap 1<br />
tegelijkertijd toegang moet<strong>en</strong> hebb<strong>en</strong> tot de globale variabele x. Daar<strong>en</strong>teg<strong>en</strong> zull<strong>en</strong> twee processor<strong>en</strong><br />
nooit tegelijkertijd naar dezelfde globale geheug<strong>en</strong>plaats prober<strong>en</strong> te schrijv<strong>en</strong>.<br />
Met de eerder vermelde verkorte notatie bekom<strong>en</strong> we de pseudocode zoals getoond in Algoritme<br />
2.2.<br />
De parallelle tijd van dit algoritme is Tp(n) = Θ(n 2 /p). De kost is Cp(n) = pΘ(n 2 /p) = Θ(n 2 ),<br />
hetge<strong>en</strong> precies de tijd van het sequ<strong>en</strong>tiële algoritme is. Het algoritme is dus kost-optimaal.<br />
E<strong>en</strong> belangrijk aspect van dit algoritme is het feit dat de processor<strong>en</strong> hun activiteit<strong>en</strong> niet hoev<strong>en</strong><br />
te synchroniser<strong>en</strong> – dit is te dank<strong>en</strong> aan de manier waarop de berek<strong>en</strong>ing<strong>en</strong> gepartitioneerd<br />
werd<strong>en</strong>. Door de matrix op te splits<strong>en</strong> in blokk<strong>en</strong> van rij<strong>en</strong> zijn de berek<strong>en</strong>ing<strong>en</strong> die door de<br />
verschill<strong>en</strong>de processor<strong>en</strong> gebeur<strong>en</strong>, onafhankelijk van elkaar.<br />
Als we daar<strong>en</strong>teg<strong>en</strong> de matrix zoud<strong>en</strong> opsplits<strong>en</strong> in blokk<strong>en</strong> van kolomm<strong>en</strong>, m.a.w. als A =<br />
(A (1) ,...,A (r) ) <strong>en</strong> x = (x (1) ,...,x (r) ), dan wordt het product y = Ax gegev<strong>en</strong> door y = A (1) x (1) +<br />
···+A (r) x (r) . Elke processor Pi kan dus z (i) = A (i) x (i) berek<strong>en</strong><strong>en</strong>, na het inlez<strong>en</strong> van A (i) <strong>en</strong> x (i)<br />
uit het gedeelde geheug<strong>en</strong>. Maar ge<strong>en</strong> <strong>en</strong>kele processor mag beginn<strong>en</strong> met het berek<strong>en</strong><strong>en</strong> van<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