C2115 Praktický úvod do superpočítání -1-XIII. lekce / Modul 4 C2115 Praktický úvod do superpočítání Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta, Masarykova univerzita, Kotlářská 2, CZ-61137 Brno XIII. lekce / Modul 4 Revize 1 C2115 Praktický úvod do superpočítání -2-XIII. lekce / Modul 4 Paralelní úlohy Souběh chyb, numerické chyby, spouštíme aplikace, efektivita paralelizace (Amdahlův zákon) C2115 Praktický úvod do superpočítání -3-XIII. lekce / Modul 4 Úskalí paralelizace úloh, chyby souběhu Paralelní úlohy jsou náchylné na chyby souběhu (race condition). Při návrhu paralelních aplikací je proto nutné již při návrhu aplikace tomuto úskalí věnovat značnou pozornost. v = 0.0d0 !$omp do private(i,x,y),reduction(+:v) do i=1,n x = (i-0.5d0)*h + rl y = 4.0d0/(1.0d0+x**2) v = v + y*d end do !$omp end do !!! klíčové pro funkčnost !!! do #1 do #2 v v v=0 v=v+v paralelní běh (dvě vlákna) bariéra (nejdříve se počká na doběhnutí všech vláken a teprve poté se vypočítá výsledek) Bez bariéry se bude proměnná "v" používat v nedefinovaném pořadí s možností přepisování mezivýsledků. Zjednodušeně (pro ilustraci): do #1 do #2v vv=v v=v v=v v=v v v C2115 Praktický úvod do superpočítání -4-XIII. lekce / Modul 4 Úskalí paralelizace úloh, numerické chyby Pořadí vykonávání aritmetických operací se může v čase měnit, proto můžete získat různý výsledek za použití různého počtu CPU a či při opakování stejné paralelní úlohy (typické pro úlohy s dynamickým vyvažováním zátěže). Úlohy s dynamickým vyvažováním zátěže mění rozdělení problému na jednotlivé CPU (např. atomy, které bude CPU zpracovávat v molekulové dynamice) tak, aby úloha běžela co nejrychleji. [kulhanek@wolf openmp]$ OMP_NUM_THREADS=1 ./integral Number of threads = 1 integral = 3.1415926535894521 [kulhanek@wolf openmp]$ OMP_NUM_THREADS=2 ./integral Number of threads = 2 integral = 3.1415926535888206 [kulhanek@wolf openmp]$ OMP_NUM_THREADS=4 ./integral Number of threads = 4 integral = 3.1415926535898944 C2115 Praktický úvod do superpočítání -5-XIII. lekce / Modul 4 Spouštění paralelních úloh ➢ U nových úloh vždy ověřujte, že skutečně spouštíte paralelní verzi aplikace (programu). ➢ Pokud úloha neběží paralelně, ověřte, že spouštíte správnou verzi programu a správným způsobem (OpenMP vs MPI). Užitečné příkazy: ▪ ldd vypíše seznam dynamických knihoven, které program využívá ▪ top vypíše přehled běžících procesů ▪ pstree vypíše přehled běžících procesů C2115 Praktický úvod do superpočítání -6-XIII. lekce / Modul 4 Spouštění paralelních úloh, pokr. OpenMP MPI 1 proces a 4 vlákna 4 procesy (+ servisní vlákna, které využívá MPI) C2115 Praktický úvod do superpočítání -7-XIII. lekce / Modul 4 Spouštění paralelních úloh, pokr. proces #1 vlákno #1 (main thread) CPU jádro #1 process #2 vlákno #1 (main thread) CPU jádro #2 process #2 vlákno #1 (main thread) CPU jádro #1 WN #1 WN #2 MPI ➢ Vyvarujte se spouštění paralelních úloh na více uzlech (MPI). ➢ Pokud je to nezbytné, použijte co nejrychlejší síťové propojení (Infinibend vs Ethernet) síťové přenosy (úzké hrdlo) MPI místní přenosy (rychlé) C2115 Praktický úvod do superpočítání -8-XIII. lekce / Modul 4 Efektivita paralelizace 1 CPU 2 CPU Nedílnou (nicméně nechtěnou) součástí paralelní aplikace jsou sekvenční části. Běh této části není urychlován se zvyšováním počtu CPU, což ve výsledku vede k snižovaní efektivity využití jednotlivých CPU. zkracuje se zůstává stejné C2115 Praktický úvod do superpočítání -9-XIII. lekce / Modul 4 Amdahlův zákon https://en.wikipedia.org/wiki/Amdahl's_lawAmdahlův zákon vyjadřuje maximální předpokládané urychlení paralelní úlohy. 𝑆𝑠𝑝𝑒𝑒𝑑𝑢𝑝 = 1 1 − 𝑝 + 𝑝 𝑁 Teoretické urychlení: p - paralelní část programu (zlomek) N - počet CPU ➢ VŽDY ověřujte efektivitu paralelního běhu aplikace (hlavně u nových problémů či změně jejich velikosti). ➢ Ověření se dělá podle cvičení L13.M2.1, přičemž akceptovatelná minimální efektivita na jedno CPU je cca 80%. C2115 Praktický úvod do superpočítání -10-XIII. lekce / Modul 4 Cvičení M4.1 1. Zkompilujte program integral_rc.f90 s optimalizací -O3 a podporou OpenMP. 2. Spouštějte program integral_rc postupně pro 1, 2, 3, až N vláken, kde N je maximální dostupný počet CPU jader. Jak se mění výsledek a proč? 3. Opakovaně spusťte program integral_rc na 2 vláknech. Jak se mění výsledek a proč? Zdrojové kódy: /home/kulhanek/Documents/C2115/code/integral/openmp