際際滷

際際滷Share a Scribd company logo
Parallel Patterns Library(PPL)Tomas Daba邸inskas, Microsoft Student Partner
Lygiagretus programavimas sudtingasPadaromas tik labiau patyrusi迭 programuotoj迭Lygiagret笛s 邸ablonai nra paplit, gerai 転inomi ir lengvai 眺gyvendinamiKr笛va galim迭 problem迭:Gij迭 var転ymaisi (races)Mirties ta邸kas (deadlock)Gyvas ta邸kas (livelock)Pamir邸ti prane邸imai (lost event notifications)
Ko nori programuotojai?
Visual Studio 2010
Parallel Patterns Library (PPL)Veikia kaip ConcurrencyRuntimekomponentasAbstrakcijos lygis tarp programos ir gij迭 mechanizmoLengvas panaudojimasGalimyb plstis (scalability)
Strukt笛rinis ir nestrukt笛rinis lygiagretumasStrukt笛rinis:Lygiagretus kodas pradedamas ir baigiamas viename konteksteU転duotis negali baigtis, kol nesibaigia jos dukterins u転duotysDidesnis na邸umasNestrukt笛rinis:Leid転ia u転duot眺 pradti ir baigti ar jai laukti skirtinguose kontekstuoseLankstesnis
PPL sudtisLygiagreios u転duotys (Task Parallelism)	Kelios u転duotys lygiagreiaiLygiagret笛s algoritmai (Parallel Algorithms)	Bendriniai algoritmai darbui su duomen迭 rinkiniaisLygiagreios talpyklos ir objektai (Parallel containers & objects)	Bendrins talpyklos/objektai saugiam darbui su j迭 viduje esaniais elementais
PPL: U転duotysU転duotis (Task)skaiiavimas, kuris viduje gali b笛ti i邸skaidytastask_handle klasU転duoi迭 grup (Task group)  u転duoi迭, formuojani迭 loginius skaiiavimus, gruptask_group klasstructured_task_group klas
U転duoi迭 tipai
U転duotys. Kada/kur naudoti?Rekursiniuose metoduoseNorint i邸skaidyti darb 眺 atskiras dalisNordami apra邸ysi savo lygiagret迭 algoritm, kai neu転tenka standartini迭 PPL algoritm迭.Jei galime, naudojame pastaruosius
Lets CODE!AKA DEMO
PPL: AlgoritmaiPPL Algoritmai pana邸笛s 眺 STL algoritmusI邸naudoja jau esam ConcurrencyRuntimefunkctionalumAlgoritmai:parallel_forparallel_for(begin,end,step,[](inti){ });parallel_for_eachparallel_for(v.begin(),v.end(),[](inti){  });parallel_invokeparallel_invoke([]{},[]{},[]{},,[]{});
parallel_for()Kartoja t pai u転duot眺 lygiagreiaiOptimaliai i邸skaido u転duotis lygiagreiam vykdymuiBalansuoja tarp i邸skaidyt迭 dali迭 priklausomai nuo apkrov迭.U転duoi迭 vykdymas neturi numatytos tvarkosArgumentai:Pradin reik邸m, galin reik邸m, 転ingsnis, funkcijaPradin reik邸m, galin reik邸m, funkcija	(貼ingsnis tokiu atveju pagal nutyljim = 1)
for()  parallel_for()Daugel眺 for cikl迭 galima pakeisti parallel_for, taiau:Ciklo indeksas (_Index_type) gali b笛ti tik sveiko tipoIteracija gali vykti tik 眺 priek眺 (jei 転ingsnis (_Step) ma転esnis nei 1, gauna klaida)Pabaigos slyga turi b笛ti konkreti. Iteracija baigiama, kai iteracijos kintamasis pasiekia reik邸m _Last
parallel_for_each()Lygiagreiai atlieka veiksmus iteruojamoje talpykloje (tarkim tokioje, kokias suteikia STL)Naudoja t pai u転duoi迭 skaidymo logik kaip ir parallel_forU転duoi迭 vykdymas taip pat neturi numatytos tvarkosVeikia tiek su einaniais 眺 priek眺 (forward) iteratoriais, tiek su atsitiktinio prijimo (randomaccess) iteratoriais. Su pastaraisiais greiiau.
parallel_invoke()Vykdo u転duoi迭 rinkin眺 paraleliai.Nebaigia darbo tol, kol darbo nebaigia visos lygiagreiai vykdomos u転duotysPriima nuo 2 iki 10 parametr迭  funkcij迭, kurias vykdys. Kiekviena perduodama funkcija neturi turti parametr迭.U転duoi迭 vykdymas taip pat neturi numatytos tvarkosPatogus, kai norima vykdyti kelet nepriklausom迭 u転duoi迭 lygiagreiai
parallel_invoke() pavyzdysunsignedintcount_primes(intstart,intend){unsignedintcount=0u;for(intn=start;n<end;++n){if(is_prime(n))++count;}returncount;}parallel_invoke([&]{prime_count1=count_primes(0,10000);},[&]{prime_count2=count_primes(10000,20000);},[&]{prime_count3=count_primes(20000,30000);},[&]{prime_count4=count_primes(30000,40000);});
Lets CODE!AKA DEMO
PPL: Talpyklos ir objektai
concurent_vectorNaudojimas pana邸us 眺 STL bibliotekos vector klassPapildymas, pamimas, iteracija veikia lygiagreiaiElementus pridti galima tik 眺 gal (nra insert() metodo)Galima pa邸alinti visus elementus su clear() metodu. alinti vieno elemento negalima.Nesaugo savo element迭 atmintyje i邸 eils, tad negalima atlikti kai kuri迭 masyvam b笛ding迭 operacij迭Galima keisti dyd眺 su grow_by() ir grow_to_at_least() (atitikmuo resize())
concurent_queueNaudojimas pana邸us 眺 STL bibliotekos queue() klassLeid転ia pasiekti pirm (dequeue) ir paskutin眺 (enqueue) elementus.Nra front() ir pop() metod迭. Vietoj j迭  try_pop()Nraback() metodo, tad negalima kreiptis 眺 eils galMetodu empty() galima patikrinti ar eil tu邸ia.Iteracija ir bei dyd転io gavimas nra pritaikyti lygiagreiam veikimu
combinableSuteikia daug kart迭 naudojam saugykl gijoje, i邸 kuri迭 rezultatai sujungiami 眺 bendrNaudingas, kai reikia ka転kokiu resursu dalintis keliose gijose/u転duotyseNebereikia naudoti papildom迭 priemoni迭 (tarkim mutex)combinable<int>sum;parallel_for_each(a.begin(),a.end(),[&](inti){sum.local()+=(is_prime(i)?i:0);});prime_sum=sum.combine(plus<int>());
PPL: Lygiagretaus darbo at邸aukimas (sustabdymas)tg1t1t2t3tg2U転duotisU転duoi迭 grupt4t5
Lygiagrei迭 u転duoi迭 stabdymasDu b笛dai sustabdyti:task_group::cancel() ir structured_task_group::cancel()At邸aukia u転duoi迭 grup ir visas dukterines u転duoi迭 grupes (i邸 vir邸aus 眺 apai)EfektyvesnisI邸imties (exception) i邸metimas u転duoties darbo funkcijoje.At邸aukinja kiekvien u転duoi迭 grup atskirai (i邸 apaios 眺 vir邸迭)
Lygiagrei迭 algoritm迭 stabdymasKadangi PPL lygiagret笛s algoritmai veikia lygiagrei迭 u転duoi迭 pagrindu, jiems sustabdyti (at邸aukti) galime naudoti tuos paios b笛dus.structured_task_grouptg;task_group_statusstatus=tg.run_and_wait([&]{parallel_for(0,100,[&](inti){// At邸aukiam u転duot眺, kai pasiekiam 50if(i==50) {tg.cancel();}else{// Normalus darbas}});});
(NE)stabdomLygiagretaus darbo stabdymas (at邸aukimas) tinkamas naudoti, kai kiekviena susijusios grups u転duotis darb gali baigti savo laikuYra atvej迭, kai lygiagreios u転duoi迭 grups sustabdymas nra geras sprendimas:U転duotis, kuri atblokuoja kit aktyvi u転duot眺, nra startavusi  i u転duotis nestartuoja, jei grup at邸aukiama  Galimas mirties ta邸kas (deadlock)
Parallel Debugger
Parallel DebuggerParallel TasksParallel Stacks
Lets CODE!AKA DEMO
Ai笛 u転 dmes眺Tomas 禽温恢温邸庄稼壊一温壊岳看馨温壊葵壊岳顎糸艶稼岳沿温姻岳稼艶姻壊.界看馨鞄岳岳沿://敬敬敬.敬庄稼恢鉛看乙.鉛岳

More Related Content

Parallel Patterns Library (PPL) in Visual C++ 2010

  • 1. Parallel Patterns Library(PPL)Tomas Daba邸inskas, Microsoft Student Partner
  • 2. Lygiagretus programavimas sudtingasPadaromas tik labiau patyrusi迭 programuotoj迭Lygiagret笛s 邸ablonai nra paplit, gerai 転inomi ir lengvai 眺gyvendinamiKr笛va galim迭 problem迭:Gij迭 var転ymaisi (races)Mirties ta邸kas (deadlock)Gyvas ta邸kas (livelock)Pamir邸ti prane邸imai (lost event notifications)
  • 5. Parallel Patterns Library (PPL)Veikia kaip ConcurrencyRuntimekomponentasAbstrakcijos lygis tarp programos ir gij迭 mechanizmoLengvas panaudojimasGalimyb plstis (scalability)
  • 6. Strukt笛rinis ir nestrukt笛rinis lygiagretumasStrukt笛rinis:Lygiagretus kodas pradedamas ir baigiamas viename konteksteU転duotis negali baigtis, kol nesibaigia jos dukterins u転duotysDidesnis na邸umasNestrukt笛rinis:Leid転ia u転duot眺 pradti ir baigti ar jai laukti skirtinguose kontekstuoseLankstesnis
  • 7. PPL sudtisLygiagreios u転duotys (Task Parallelism) Kelios u転duotys lygiagreiaiLygiagret笛s algoritmai (Parallel Algorithms) Bendriniai algoritmai darbui su duomen迭 rinkiniaisLygiagreios talpyklos ir objektai (Parallel containers & objects) Bendrins talpyklos/objektai saugiam darbui su j迭 viduje esaniais elementais
  • 8. PPL: U転duotysU転duotis (Task)skaiiavimas, kuris viduje gali b笛ti i邸skaidytastask_handle klasU転duoi迭 grup (Task group) u転duoi迭, formuojani迭 loginius skaiiavimus, gruptask_group klasstructured_task_group klas
  • 10. U転duotys. Kada/kur naudoti?Rekursiniuose metoduoseNorint i邸skaidyti darb 眺 atskiras dalisNordami apra邸ysi savo lygiagret迭 algoritm, kai neu転tenka standartini迭 PPL algoritm迭.Jei galime, naudojame pastaruosius
  • 12. PPL: AlgoritmaiPPL Algoritmai pana邸笛s 眺 STL algoritmusI邸naudoja jau esam ConcurrencyRuntimefunkctionalumAlgoritmai:parallel_forparallel_for(begin,end,step,[](inti){ });parallel_for_eachparallel_for(v.begin(),v.end(),[](inti){ });parallel_invokeparallel_invoke([]{},[]{},[]{},,[]{});
  • 13. parallel_for()Kartoja t pai u転duot眺 lygiagreiaiOptimaliai i邸skaido u転duotis lygiagreiam vykdymuiBalansuoja tarp i邸skaidyt迭 dali迭 priklausomai nuo apkrov迭.U転duoi迭 vykdymas neturi numatytos tvarkosArgumentai:Pradin reik邸m, galin reik邸m, 転ingsnis, funkcijaPradin reik邸m, galin reik邸m, funkcija (貼ingsnis tokiu atveju pagal nutyljim = 1)
  • 14. for() parallel_for()Daugel眺 for cikl迭 galima pakeisti parallel_for, taiau:Ciklo indeksas (_Index_type) gali b笛ti tik sveiko tipoIteracija gali vykti tik 眺 priek眺 (jei 転ingsnis (_Step) ma転esnis nei 1, gauna klaida)Pabaigos slyga turi b笛ti konkreti. Iteracija baigiama, kai iteracijos kintamasis pasiekia reik邸m _Last
  • 15. parallel_for_each()Lygiagreiai atlieka veiksmus iteruojamoje talpykloje (tarkim tokioje, kokias suteikia STL)Naudoja t pai u転duoi迭 skaidymo logik kaip ir parallel_forU転duoi迭 vykdymas taip pat neturi numatytos tvarkosVeikia tiek su einaniais 眺 priek眺 (forward) iteratoriais, tiek su atsitiktinio prijimo (randomaccess) iteratoriais. Su pastaraisiais greiiau.
  • 16. parallel_invoke()Vykdo u転duoi迭 rinkin眺 paraleliai.Nebaigia darbo tol, kol darbo nebaigia visos lygiagreiai vykdomos u転duotysPriima nuo 2 iki 10 parametr迭 funkcij迭, kurias vykdys. Kiekviena perduodama funkcija neturi turti parametr迭.U転duoi迭 vykdymas taip pat neturi numatytos tvarkosPatogus, kai norima vykdyti kelet nepriklausom迭 u転duoi迭 lygiagreiai
  • 19. PPL: Talpyklos ir objektai
  • 20. concurent_vectorNaudojimas pana邸us 眺 STL bibliotekos vector klassPapildymas, pamimas, iteracija veikia lygiagreiaiElementus pridti galima tik 眺 gal (nra insert() metodo)Galima pa邸alinti visus elementus su clear() metodu. alinti vieno elemento negalima.Nesaugo savo element迭 atmintyje i邸 eils, tad negalima atlikti kai kuri迭 masyvam b笛ding迭 operacij迭Galima keisti dyd眺 su grow_by() ir grow_to_at_least() (atitikmuo resize())
  • 21. concurent_queueNaudojimas pana邸us 眺 STL bibliotekos queue() klassLeid転ia pasiekti pirm (dequeue) ir paskutin眺 (enqueue) elementus.Nra front() ir pop() metod迭. Vietoj j迭 try_pop()Nraback() metodo, tad negalima kreiptis 眺 eils galMetodu empty() galima patikrinti ar eil tu邸ia.Iteracija ir bei dyd転io gavimas nra pritaikyti lygiagreiam veikimu
  • 22. combinableSuteikia daug kart迭 naudojam saugykl gijoje, i邸 kuri迭 rezultatai sujungiami 眺 bendrNaudingas, kai reikia ka転kokiu resursu dalintis keliose gijose/u転duotyseNebereikia naudoti papildom迭 priemoni迭 (tarkim mutex)combinable<int>sum;parallel_for_each(a.begin(),a.end(),[&](inti){sum.local()+=(is_prime(i)?i:0);});prime_sum=sum.combine(plus<int>());
  • 23. PPL: Lygiagretaus darbo at邸aukimas (sustabdymas)tg1t1t2t3tg2U転duotisU転duoi迭 grupt4t5
  • 24. Lygiagrei迭 u転duoi迭 stabdymasDu b笛dai sustabdyti:task_group::cancel() ir structured_task_group::cancel()At邸aukia u転duoi迭 grup ir visas dukterines u転duoi迭 grupes (i邸 vir邸aus 眺 apai)EfektyvesnisI邸imties (exception) i邸metimas u転duoties darbo funkcijoje.At邸aukinja kiekvien u転duoi迭 grup atskirai (i邸 apaios 眺 vir邸迭)
  • 25. Lygiagrei迭 algoritm迭 stabdymasKadangi PPL lygiagret笛s algoritmai veikia lygiagrei迭 u転duoi迭 pagrindu, jiems sustabdyti (at邸aukti) galime naudoti tuos paios b笛dus.structured_task_grouptg;task_group_statusstatus=tg.run_and_wait([&]{parallel_for(0,100,[&](inti){// At邸aukiam u転duot眺, kai pasiekiam 50if(i==50) {tg.cancel();}else{// Normalus darbas}});});
  • 26. (NE)stabdomLygiagretaus darbo stabdymas (at邸aukimas) tinkamas naudoti, kai kiekviena susijusios grups u転duotis darb gali baigti savo laikuYra atvej迭, kai lygiagreios u転duoi迭 grups sustabdymas nra geras sprendimas:U転duotis, kuri atblokuoja kit aktyvi u転duot眺, nra startavusi i u転duotis nestartuoja, jei grup at邸aukiama Galimas mirties ta邸kas (deadlock)
  • 30. Ai笛 u転 dmes眺Tomas 禽温恢温邸庄稼壊一温壊岳看馨温壊葵壊岳顎糸艶稼岳沿温姻岳稼艶姻壊.界看馨鞄岳岳沿://敬敬敬.敬庄稼恢鉛看乙.鉛岳