Vzporedenje opravil
Veliko izračunov lahko zapišemo kot zanke, ki so primerne za vzporedenje, ki smo si ga že ogledali. Nekaterih problemov in predvsem algoritmov za reševanje teh problemov pa ne moremo 'naravno' preslikati v zanke, zato potrebujemo drugačen pristop k vzporedenju nekaterih programov. Ta pristop predstavljajo opravila, ki jih lahko ustvarimo in poženemo med izvajanjem programa, da se izvedejo vzporedno z že obstoječimi deli programa.
Ponovno si to oglejmo na primeru seštevanja števil od 1 do n. V programu ints-sum-2.c ustvarimo v ukazni vrstici določeno število opravil in v vsakem opravilu seštejemo podinterval števil v spremenljivko local_sum
, nato pa vsoto intervalov seštejemo z uporabo atomarne operacije v spremenljivko sum
.
Vsako opravilo posebej ustvarimo z ukazom #pragma omp task
. Ustvarjeno opravilo zaživi povsem neodvisno in je dodeljen eni od niti, da ga izvede. Vsa opravila se morajo končati pred izstopom iz območja nitenja, saj po izstopu niti, ki ta opravila izvajajo, ne obstajajo več.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Sam ukaz #pragma omp task
je razmeroma enostaven, bolj je pomembno, v kakšnem vzorcu ga je smiselno uporabiti:
-
Kot lahko vidimo v programu ints-sum-2.c, ge seveda uporabimo znotraj območja nitenja, da se novo ustvarjeno opravilo lahko postavi v vrsto, da ga bo prevzela ena od niti programa.
-
V programu ints-sum-2.c je ustvarjanje novih opravil narejeno s
for
zanko, ki je zaprta v del programa, ki se izvede v eni sami niti (to določimo z ukazom#pragma omp single
). Če bi se tafor
zanka izvedla v vseh nitih, bi vse niti ustvarile kopije istih opravil: računanja bi bilo preveč, rezultat pa bi bil napačen.
Vaja
Vsa opravila v programu ints-sum-2.c zahtevajo približno enako časa, da se izvedejo - največji del tega časa prespijo v klicu funkcije sleep
, potem pa še malce računajo. Spremenite program ints-sum-2.c tako, da bodo vsa opravila zahtevala različno mnogo časa in opazujte, kako se s tem spremeni čas izvajanja celotnega programa.
Opravila so posebej primerna za vzporedenje algoritmov, ki so v osnovi rekurzivni, podproblemi, na katere taki algoritmi razbijejo osnovni problem, pa so vsaj do neke mere neodvisni. Kot primer si oglejmo vzporedno izvedbo hitrega urejanja.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
Vaja
Program qsort-1.c za hitro urejanje z uporabo n strojnih niti sploh ne deluje n-krat hitreje. Zakaj?
(Namig: Amdahlov zakon.)
Projekt
Napišite program za izračun Mandelbrotove množice in izriz na pravokotnem delu kompleksne ravnine. Učinkovit program mora predvideti, da je izračun te množice na različnih delih kompleksne ravnine različno zahteven. To lahko rešite z ustreznim razvrščanjem obratov zank, v katerih izračunate barvo posamezne točke v ravnini, med niti programa ali pa z delitvijo pravokotnega dela kompleksne ravnine na pravokotno mrežo, v kateri vsak pravokotnik izračunate z enim opravilom. Poskusite z obema pristopoma.