690 likes | 835 Views
Arkitektura Paraleloak. 8. Begizten Paralelizazioa eta Atazen Banaketa. - Sarrera - Begizten paralelizazioa - Sinkronizazio-mekanismoak - Optimizazio nagusiak - Iterazioen (atazen) banaketa - Atal paraleloak. Arkitektura Paraleloak. IF - EHU. Sarrera.
E N D
Arkitektura Paraleloak 8.Begizten Paralelizazioa eta Atazen Banaketa - Sarrera - Begizten paralelizazioa - Sinkronizazio-mekanismoak - Optimizazio nagusiak - Iterazioen (atazen) banaketa - Atal paraleloak Arkitektura Paraleloak IF - EHU
Sarrera Helburua: programak P aldiz azkarrago exekutatzea; kasu partikular bat: begiztak. • Paraleloan exekuta daitezkeen atazak identifikatu behar dira (dependentzien analisia). • Prozesuak sinkronizatu behar dira. • Prozesuak prozesadoreetara banatu behar dira. Adi: eraginkortasuna!
P0 P2 P1 do i = 1,1000 do i = 1001,2000 do i = 2001,3000 A(i) = fun(i) A(i) = fun(i) A(i) = fun(i) enddo enddo enddo Sarrera • Paralelismo motak (1) (a) Datu-paralelismoa do i = 1, 3000 A(i) = fun(i) enddo
P0 P1 F1 F3 F2 F4 Sarrera • Paralelismo motak (1) (b) Funtzio-paralelismoa
Sarrera • Paralelismo motak (2) ▪ale xehea (fine grain)ataza “txikiak” komunikazio asko ▪ ale ertaina ▪ale larria(coarse grain)ataza “handiak” komunikazio gutxi
P0 P1 F1 F3 F2 F4 Sarrera • Atazen arteko dependentziak? Sinkronizazioa - globala (hesiak) - gertaerak (puntutik puntura)
Sarrera • Bi eredu: ▪ Nagusi/Morroi Hari (thread) nagusiak P hari sortzen ditu une jakin batean, paraleloan exekuta daitezen; ataza bukatutakoan, “hiltzen” dira. ▪ SPMD(Single-Program-Multiple-Data) Programaren P kopia (berdinak) exekutatzen dira. Atazak bereizteko, prozesuen identifikado-reak erabiltzen dira (pid).
Sarrera • Begizten paralelizazioa ale xehea / ertaina begiztaren iterazioen banaketa dependentzien analisia Modu eraginkorrean. Programatzailea edo konpiladorea?
Sarrera • Eskuarki, eta salbuespenak salbuespen, kodearen paralelizazioa (dependentzien analisia, lan-banaketa…) programatzaileak berak egin behar du. • Hori dela eta, begiztak eraginkorki paraleliza-tzeko ohiko aukerak analizatu behar ditugu.
Sarrera • Kodearen frakzio handi bat exekutatu behar da paraleloan; ez ahaztu Amdahl-en legea. Kodearen paralelizazioak (bektorizazioak bezalaxe) begiztaren aginduen jatorrizko ordena aldatzen du. Beraz, aginduen arteko datu-dependentziak kontuan hartu behar dira.
L0+0S0L1+1S1L2+2S2 ... L2L0+2L1+0+1S2S1S0 ... P0: L0+0S0 P1:L1+1 S1 P2: L2+2S2 … ... Paraleloan Sarrera • Adibidez: • do i = 0, N-1 • A(i)=A(i)+1 • enddo
dependentzia RAW i: A = ... j: = A antidependentzia WAR i: = A ... j: A = irteera-dependentzia WAW i: A = ... j: A = ij ij i j Sarrera: datu-depend. benetako dependentziak izen-dependentziak
1 A, 2 2 A, 1 Sarrera: datu-depend. do i = 2, N-2 1 A(i) = B(i) + 2 2 C(i) = A(i-2) + A(i+1) enddo • Begiztak • + Dependentzia-grafoak • + Dependentziaren distantzia A(2) = B(2) + 2 C(2) = A(0) + A(3) A(3) = B(3) + 2 C(3) = A(1) + A(4) A(4) = B(4) + 2 C(4) = A(2) + A(5) A(5) = B(5) + 2 C(5) = A(3) + A(6)
1 A, 2 2 C, 0 A, 0 C, 1 3 B, 1 4 D, 29 B, 1 5 Sarrera: depend.-grafoak do i = 2, N-31 1 A(i) = B(i) + 2 2 C(i) = A(i-2) 3 D(i+1) = C(i) + C(i+1) 4 B(i+1) = B(i) + 1 5 D(i+30) = A(i) enddo
j i A0,1 1 A2,-1 2 Sarrera: depend.-grafoak • + Iterazio-espazioa do i = 2, N-1 do j = 1, N-2 1 A(i,j) = A(i,j-1) * 2 2 C(i,j) = A(i-2,j+1) + 1 enddo enddo
a*i+b c*i+d i L2 L1 d-b Z→ez dago depend. ZKH(c,a) Sarrera: depend.-proba • Dependentzia-proba automatikoa: begiztaren indizearen funtzio linealak soilik. do i = L1, L2 X(a*i+b) = = X(c*i+d) enddo i1i2
Begizten paralelizazioa • Begizten iterazioak prozesadoreen artean banatu behar dira, baina, jakina, datu-dependentziak errespetatu behar dira. • Arazoa distantzia> 0duten dependentziak dira, eta, batik bat, dependentzia-grafoan zikloak osatzen dituztenak.
Begizten paralelizazioa • Begiztak beti exekuta daitezke P prozesadore erabiliz, dependentziak errespetatzeko behar den sinkronizazioa gehituta… …baina horrek ez du esan nahi beti egin behar denik, kostu orokorra kontuan hartu behar baita:kalkulua + sinkronizazioa(komunikazioa).
Begizten paralelizazioa • Helburuak: Begizten iterazioak prozesadoreetara banatzea, “aldi berean” exekuta daitezen. Ahal bada, prozesuen arteko sinkronizazioaerabili behar izan gabe (0 distantziako depen-dentziak). Makinaren ezaugarrien arabera (komunikazio-sarea, lan-banaketa…), tamaina jakin bateko atazak sortzea.
Begizten paralelizazioa Agian, prozesadore kopuru mugatua erabili beharko da. Adi eraginkortasunari (ad., cache memoriaren erabilera).
P0 P1 P2 P3 Begizten paralelizazioa • >Adibideak do i = 0, N-1 A(i) = A(i) + 1 B(i) = A(i) * 2 enddo
P0 P1 P2 P3 ? Begizten paralelizazioa • >Adibideak do i = 0, N-2 A(i) = B(i) + 1 B(i+1) = A(i) * 2 enddo
P1 P1 P0P0 Begizten paralelizazioa • >Adibideak do i = 0, N-3 A(i+2) = A(i) + 1 enddo
P0 P1 P2 P3 Begizten paralelizazioa • >Adibideak j do i = 0, N-1 do j = 1, M-1 A(i,j) = A(i,j-1) + 1 enddo enddo i
P0 P1 P2 P3 Begizten paralelizazioa • >Adibideak j do i = 0, N-1 do j = 1, M-1 A(i,j) = A(i,j-1) + 1 enddo enddo i
Begizten paralelizazioa • Aginduen arteko dependentziak 0 distantziakoak baldin badira, hau da, iterazioak independenteak badira, iterazioak nahi den moduan bana daitezke prozesadoreetara, sinkronizazioa erabili gabe:doall. • Iterazioen arteko dependentziak baldin badaude, baina denak “aurrerantz” badoaz, sinkronizazio-hesiak erabil daitezke: forall(edo doall + barrier). • Dependentzia-zikloak baldin badaude, puntutik pun-turako sinkronizazioa erabili behar da:doacross.
1 i=0 1 2 3 C,0 2 A, 0 3 Doall begiztak • Iterazioak independenteak dira, eta banaketa nahi den moduan egin daiteke: doall. do i = 0, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i) / A(i) enddo doall i = 0, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i) / A(i) enddoall
Forall begiztak • Iterazioen arteko dependentziak daude, baina denak aurrerantz doaz: forall. • Dependentzia bakoitza hesi baten bidez sinkroniza daiteke: prozesuek zain geratuko dira agindu jakin bat denok exekutatu arte. • Behar dena baino sinkronizazio gehiago gehitzen da, baina oso metodo sinplea da.
1 i=1 2 3 4 C,0 C,1 2 A, 0 hesia 3 Forall begiztak do i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo forall i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) HESIA (...) D(i) = C(i-1) / A(i) endforall
1 i=1 2 3 4 C,0 C,1 2 A, 0 hesia 3 Forall begiztak doall i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) enddoall [ HESIA (...) ] doall i = 1, N-1 D(i) = C(i-1) / A(i) enddoall do i = 1, N-1 C(i) = C(i) * C(i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo
Doacross begiztak • Dependentziek zikloak osatzen dituzte: doacross, ekoizle/kontsumitzaile motako sinkronizazioa. Dependentziak sinkronizatzeko, gertaera-bektoreak: post(gA,i) gA(i):= 1 wait(gA,i) itxarongA(i)=1izan arte gA(i)=0 bada, oraindik ez da exekutatu sinkronizatzen ari den aginduaren i iterazioa.
i=2 3 4 5 6 7 1 111 . . . 222 . . . 111 222 A,2 B,3 2 Doacross begiztak do i = 2, N-2 A(i) = B(i-2) + 1 B(i+1) = A(i-2) * 2 enddo doacross i = 2,N-2 wait (gB,i-3) A(i) = B(i-2) + 1 post (gA,i) wait (gA,i-2) B(i+1) = A(i-2) * 2 post (gB,i) enddoacross
,3 P0 P1 P2 12 13 14 22 23 24 15 16 17 25 26 27 ... 1 A,2 B,3 2 Doacross begiztak do i = 2, N-2 A(i) = B(i-2) + 1 B(i+1) = A(i-2) * 2 enddo doacross i = 2,N-2 wait (gB,i-3) A(i) = B(i-2) + 1 post (gA,i) wait (gA,i-2) B(i+1) = A(i-2) * 2 post (gB,i) enddoacross
doacross i = 0, N-2 wait (gB,i-1) A(i) = B(i) + C(i) B(i+1) = A(i) / 2 post (gB,i) enddoacross 1 2 p w 1 2 p w 1 … 1 A,0 B,1 2 ?? Doacross begiztak • ADI: paralelizatzea ez da beti egokia do i = 0, N-2 A(i) = B(i) + C(i) B(i+1) = A(i) / 2 enddo
P0 P1 P2 P3 Doacross begiztak • Bi dimentsioko gertaera-bektoreak do i = 0, N-2 do j = 0, N-2 A(i+1,j+1) = A(i+1,j) + 1 B(i,j) = A(i,j) enddo enddo doacross i = 0, N-2 do j = 0, N-2 A(i+1,j+1) = A(i+1,j) + 1 post (gA,i,j) wait (gA,i-1,j-1) B(i,j) = A(i,j) enddo enddoacross
1 B,2 2 Beste dependentziak • Antidependentziak / Irteera-dependentziak • Prozesuen artean baldin badira, sinkronizatu egin behar dira. do i = 0, N-3 A(i) = B(i+2) / A(i) B(i) = B(i) + C(i) enddo doacross i = 0, N-3 A(i) = B(i+2) / A(i) post (gB,i) wait (gB,i-2) B(i) = B(i) + C(i) enddoacross LD B(i+2) post ... wait ST B(i)
0 1 A,1 2 If aginduak • Ifmotako aginduak do i = 1, N-1 if (B(i)>0) then A(i) = A(i) + B(i) C(i) = A(i-1) / 2 endif enddo doacross i = 1, N-1 if (B(i)>0) then A(i) = A(i) + B(i) post (gA,i) wait (gA,i-1) C(i) = A(i-1) / 2 endif enddoacross elsepost (gA,i) endif
Sinkroniz.-mekanismoak • Nola sinkronizatu aginduak? • gertaera-bektoreen bidez (post/wait) - hasieratzea - tamaina (memoria) - adi! partekatze faltsua • kontagailuenbidez
Sinkroniz.-kontagailuak • Sinkronizazio-kontagailu bat dependentzia bakoitzeko - prozesuek ordena hertsian gehitzen dute kontagailua, agindu horren exekuzioa bukatu dela adierazteko. - kA = jj arteko iterazio guztiak bukatu dira, baina j+1 iterazioa ez. i = 0 1 2 3 4 5 6 7 8 9... gA(i) = 1 1 1 0 1 0 1 1 0 0... kA= 2
Sinkroniz.-kontagailuak • Nola sinkronizatu dependentzia bat kontagailu baten bidez: - i iterazioa exekutatu ondoren, itxaron egin behar da kontagailua i-1 izan arte (hau da, agindu horren exekuzioa i-1 iteraziora heldu arte): wait(kA,i-1) → itxaron kA=i-1 izan arte - gero, gehitukontagailua, i iterazioa ere exekutatu dela adierazteko: post(kA,i) → kA:=kA+1(kA:= i)
1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 D,3 C, 0 2 C,1 A, 0 3 Sinkroniz.-kontagailuak doacross i = 3, N-1 wait (gD,i-3) C(i) = C(i) * D(i-3) post (gC,i) A(i) = C(i) + B(i) wait (gC,i-1) D(i) = C(i-1) / A(i) post (gD,i) enddoacross do i = 3, N-1 C(i) = C(i) * D(i-3) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo doacross i = 3, N-1 wait (kD,i-3) C(i) = C(i) * D(i-3) wait (kC,i-1) post (kC,i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) wait (kD,i-1) post (kD,i) enddoacross
P0 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 D,3 P0 C, 0 2 C,1 A, 0 3 Sinkroniz.-kontagailuak do i = 3, N-1 C(i) = C(i) * D(i-3) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddo doacross i = 3, N-1 C(i) = C(i) * D(i-3) wait (kC,i-1) post (kC,i) A(i) = C(i) + B(i) D(i) = C(i-1) / A(i) enddoacross Sinkronizazioa minimizatu
A, 1 1 2 A,0 3 B,0 C, 2 4 Adibide bat doacross i = ... [ 1 ] post (gA,i) wait (gA,i-1) [ 2 ] post (gC,i) [ 3 ] wait (gC,i-2) [ 4 ] enddoacross doacross i = ... [ 1 ] wait (kA,i-1) post (kA,i) [ 2 ] wait (kC,i-1) post (kC,i) [ 3 ] [ 4 ] enddoacross forall i = ... [ 1 ] hesia(...) [ 2 ] [ 3 ] hesia(...) [ 4 ] endforall
Xaldagaia pribatua bihurtu Optimizazio nagusiak • 0.Konstanteen definizioak eta indukzio-aldagaiak desegitea. • 1.Berezkoak ez diren dependentzia guztiak ezabatzea. Esaterako, do i = 0, N-1 X = A(i) * B(i) C(i) = SQRT(X) D(i) = X - 1 enddo doall i = 0, N-1 X(i) = A(i) * B(i) C(i) = SQRT(X(i)) D(i) = X(i) - 1 enddoall ez da bektore bat erabilli behar, nahikoa da X aldagaia pribatua dela adieraztea
Optimizazio nagusiak • 2.Begiztaren fisioa. • Seriean exekutatu behar den zati bat baldin badago, zatitu begizta bi partetan (edo gehiago), ahal dena paraleloan exekutatzeko. do i = 1, N-1 A(i) = A(i-1) / 2 D(i) = D(i) + 1 enddo do i = 1, N-1 A(i) = A(i-1) / 2 enddo doall i = 1, N-1 D(i) = D(i) + 1 enddoall
1 1…2.. 1…2.. 1…2.. 2………….1 2………1 2…….1 D, 1 2 ?? Optimizazio nagusiak • 3. Dependentziak ordenatzea (aurrerantz). do i = 1, N-1 A(i) = D(i-1) / 2 D(i) = C(i) + 1 enddo forall i = 1, N-1 D(i) = C(i) + 1 HESIA (...) A(i) = D(i-1) / 2 endforall
1 A, 1 2 Optimizazio nagusiak • 4.Dependentziaklerrokatzea: peeling. do i = 1, N-1 A(i) = B(i) C(i) = A(i-1) + 2 enddo C(1) = A(0) + 2 doall i = 1, N-2 A(i) = B(i) C(i+1) = A(i) + 2 enddoall A(N-1) = B(N-1)
1 A, 2 A, 1 2 1 1’ A, 2 X, 1 2 Optimizazio nagusiak do i = 2, N-1 A(i) = B(i) C(i) = A(i-1) + A(i-2) enddo do i = 2, N-1 A(i) = B(i) X(i) = B(i) C(i) = X(i-1) + A(i-2) enddo C(2) = A(1) + A(0) C(3) = B(2) + A(1) doall i = 2, N-3 A(i) = B(i) X(i+1) = B(i+1) C(i+2) = X(i+1) + A(i) enddoall A(N-2) = B(N-2) A(N-1) = B(N-1)
1 A,1 B,2 2 B,0 3 Optimizazio nagusiak • 5. Hari independenteak sortzea do i = 0, N-3 A(i+1) = B(i) + 1 B(i+2) = A(i) * 3 C(i) = B(i+2) - 2 enddo B(2) = A(0) * 3 C(0) = B(2) - 2 doall k = 0, 2 do i = pid, N-4, 3 A(i+1) = B(i) + 1 B(i+3) = A(i+1) * 3 C(i+1) = B(i+3) – 2 enddo enddoall A(N-2) = B(N-3) + 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3
1 B,0 2 C,1 3 C,2 A,1 i=2 3 4 ... 4 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 B,1 D,0 5 Optimizazio nagusiak • 6.Sinkronizazioa minimizatzea do i = 2, N-1 B(i) = B(i) + 1 C(i) = C(i) / 3 A(i) = B(i) + C(i-1) D(i) = A(i-1) * C(i-2) E(i) = D(i) + B(i-1) enddo doacross i = 2, N-1 B(i) = B(i) + 1 C(i) = C(i) / 3 post (gC,i) wait (gC,i-1) A(i) = B(i) + C(i-1) post (gA,i) wait (gA,i-1) D(i) = A(i-1) * C(i-2) E(i) = D(i) + B(i-1) enddoacross