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

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

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

Saved successfully!

Ooh no, something went wrong!