Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Podobné dokumenty
Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček

Paralelní a distribuované výpočty (B4B36PDV)

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Paralelní architektury se sdílenou pamětí

Paralelní výpočetní jádro matematického modelu elektrostatického zvlákňování

Paralelní a distribuované výpočty (B4B36PDV)

Úvod do OpenMP. Jiří Fürst

Paralelní a distribuované výpočty (B4B36PDV)

Pokročilé architektury počítačů

Paralelní architektury se sdílenou pamětí

Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35

8 Třídy, objekty, metody, předávání argumentů metod

Motivace. Software. Literatura a odkazy

Paralelní a distribuované výpočty (B4B36PDV)

Martin Lísal. Úvod do MPI

Paralelní programování

Pohled do nitra mikroprocesoru Josef Horálek

Paralelní programování

Úvod do B4B36PDV. Organizace předmětu a seznámení se s paralelizací. B4B36PDV Paralelní a distribuované výpočty

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Procesy a vlákna (Processes and Threads)

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Paralelní programování

Programování bez vláken. OpenMP

Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur

Úvod do GPGPU J. Sloup, I. Šimeček

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2

4. Úvod do paralelismu, metody paralelizace

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Více o konstruktorech a destruktorech

Algoritmizace a programování

1. Zpracování událostí na pozadí aplikace

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

Vláknové programování část V

OPS Paralelní systémy, seznam pojmů, klasifikace

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Pavel Procházka. 3. prosince 2014

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Cvičení předmětu MI-PAR P. Tvrdík, I. Šimeček, M. Šoch

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Matematika v programovacích

Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.

PB161 Programování v jazyce C++ Přednáška 4

Pointery II. Jan Hnilica Počítačové modelování 17

Úvod do programovacích jazyků (Java)

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Princip funkce počítače

Využijte plný výkon procesorů s více jádry v LabVIEW 8.5

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Procesy a vlákna - synchronizace

Programování v jazyce C a C++

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Paralelní programování

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Struktura programu v době běhu

Tento dokument obsahuje zadání pro semestrální programy z PAA. Vypracování. vypracovanou úlohu podle níže uvedených zadání. To mimo jiné znamená, že

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

C++ 0x aka C++11. Základním kamenem je třída std::thread

5 Přehled operátorů, příkazy, přetypování

Jakub Čermák Microsoft Student Partner

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Profilová část maturitní zkoušky 2013/2014

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Profilová část maturitní zkoušky 2017/2018

Kombinatorická minimalizace

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Úvod do programování - Java. Cvičení č.4

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Ukázka zkouškové písemka OSY

SUPERPOČÍTAČE DANIEL LANGR ČVUT FIT / VZLÚ

IB109 Návrh a implementace paralelních systémů. Analytický model paralelních programů. RNDr. Jiří Barnat, Ph.D.

Provádění instrukcí. procesorem. Základní model

1. Téma 03 - Rozhodování

Algoritmizace a programování

Principy operačních systémů. Lekce 5: Multiprogramming a multitasking, vlákna

Static Load Balancing Applied to Time Dependent Mechanical Problems

Programování v C++, 2. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

11. Přehled prog. jazyků

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Semestrální práce z předmětu Speciální číslicové systémy X31SCS

ČÁST 1. Základy 32bitového programování ve Windows

Základy programování (IZP)

VÝUKOVÝ MATERIÁL. 3. ročník učebního oboru Elektrikář Přílohy. bez příloh. Identifikační údaje školy

Algoritmizace a programování

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Přidělování zdrojů (prostředků)

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Úvod do programování. Lekce 1

PB161 Programování v jazyce C++ Přednáška 9

Programování v C++ 3, 3. cvičení

Paralelizace výpočtů v systému Mathematica

Transkript:

Paralení programování pro vícejádrové stroje s použitím OpenMP B4B36PDV Paralelní a distribuované výpočty

Minulé cvičení: Vlákna a jejich synchronizace v C++ 11... 1

Minulé cvičení: Vlákna a jejich synchronizace v C++ 11... Programování vícevláknových aplikací ručně může být dřina. Proč znovu objevovat kolo, když mužeme použít hotové řešení? 1

Minulé cvičení: Vlákna a jejich synchronizace v C++ 11... Programování vícevláknových aplikací ručně může být dřina. Proč znovu objevovat kolo, když mužeme použít hotové řešení? Dnešní menu: OpenMP 1

Osnova Opakování z minulého cvičení Úvod do OpenMP Paralelní bloky se sdílenou pamětí a synchronizace Redukce s OpenMP Rozvrhování výpočtu v OpenMP Zadání druhé domácí úlohy 2

Opakování z minulého cvičení

http://goo.gl/a6bemb 2

Co je OpenMP?

OpenMP: Přehled API pro psání vícevláknových aplikací se sdílenou pamětí Sada directiv, proměnných prostředí a rutin pro kompilátor a programátory Ulehčuje psaní vícevláknových aplikací v C/C++ a Fortran na většině platform s podporou většiny instrukčních sad a operačních systémů 3

OpenMP: Přehled API pro psání vícevláknových aplikací se sdílenou pamětí Sada directiv, proměnných prostředí a rutin pro kompilátor a programátory Ulehčuje psaní vícevláknových aplikací v C/C++ a Fortran na většině platform s podporou většiny instrukčních sad a operačních systémů Jako základní referenční příručku můžete použít https://msdn.microsoft.com/en-us/library/tt15eb9t.aspx 3

Otestujte si své prostředí omp_get_num_procs() Počet procesorů, které OpenMP využívá v době volání funkce omp_get_num_threads() Počet vláken, které OpenMP využívá v době volání funkce omp_get_max_threads() Maximální počet vláken, které OpenMP může využít omp_in_parallel() Vrací nenulovou hodnotu, pokud jsme uvnitř paralelního bloku omp_get_nested() Vrací nenulu, pokud je povoleno vnořování paralelních bloků test.cpp / make test_openmp 4

Otestujte si své prostředí omp_get_num_procs() Počet procesorů, které OpenMP využívá v době volání funkce omp_get_num_threads() Počet vláken, které OpenMP využívá v době volání funkce omp_get_max_threads() Maximální počet vláken, které OpenMP může využít omp_in_parallel() Vrací nenulovou hodnotu, pokud jsme uvnitř paralelního bloku omp_get_nested() Vrací nenulu, pokud je povoleno vnořování paralelních bloků Detailní přehled metod s ukázkami na https://msdn.microsoft.com/en-us/library/k1h4zbed.aspx. test.cpp / make test_openmp 4

Cvičení: Numerická integrace

Numerická integrace 9 5 f(x) dx plocha f(x) 0 1 2 3 4 5 6 7 8 9 10 x double integrate( std::function<double(double)> integrand, double a, double step_size, int step_count); integrate.cpp, main.cpp / make main 5

Doimplementujte sekvenční verzi numerické integrace Doimplementujte tělo metody integrate_sequential v souboru integrate.cpp. Použijte obdélníkovou metodu, kdy jako výšku obdélníku použijete hodnotu funkce uprostřed intervalu. integrand Funkce, kterou máte za úkol numericky zintegrovat a Dolní mez integrálu step_size Velikost kroku (šířka obdélníku) num_steps Počet kroků (horní mez je a + step_size * step_count) integrate.cpp, main.cpp / make main 6

Doimplementujte sekvenční verzi numerické integrace Doimplementujte tělo metody integrate_sequential v souboru integrate.cpp. Použijte obdélníkovou metodu, kdy jako výšku obdélníku použijete hodnotu funkce uprostřed intervalu. integrand Funkce, kterou máte za úkol numericky zintegrovat a Dolní mez integrálu step_size Velikost kroku (šířka obdélníku) num_steps Počet kroků (horní mez je a + step_size * step_count) Jaké problémy budeme mít, pokud budeme chtít tento sekvenční kód paralelizovat? integrate.cpp, main.cpp / make main 6

Alternativy k mutexům a atomickým proměným v OpenMP

#pragma omp parallel int num_threads = 0; #pragma omp parallel { // Zde jsme vytvorili tym vlaken, ktera vykonavaji // nasledujici kod num_threads += 1; } 7

#pragma omp parallel int num_threads = 0; #pragma omp parallel { // Zde jsme vytvorili tym vlaken, ktera vykonavaji // nasledujici kod num_threads += 1; } Jaký bude výsledek? 7

#pragma omp critical ( mutex ) int num_threads = 0; #pragma omp parallel { // Zde muze byt vice vlaken soucasne... #pragma omp critical { //..,ale inkrementaci provadi vzdy maximalne // jedno vlakno num_threads += 1; } } // Zde opet muze byt vice vlaken soucasne 8

Doimplementujte metodu integrate_omp_critical Doimplementujte metodu integrate_omp_critical v integrate.cpp. Využijte k tomu #pragma omp parallel a #pragma omp critical. Tip: Po spuštění vláken v bloku #pragma omp parallel si můžete napočítat rozsahy indexů, které jednotlivá vlákna budou zpracovávat (viz decrypt_threads_4 z minulého cvičení). Pro zjištění indexu aktuálního vlákna použijte metodu omp_get_thread_num(). Zjistit celkový počet vláken lze pomocí omp_get_num_threads(). integrate.cpp, main.cpp / make main 9

#pragma omp atomic Na minulém cvičení jsme si ukázali, že mutexy mohou být pomalé. Opravdu pomalé. Jednoduché operace nad jednou proměnnou lze řešit hardwarovým zámkem provedením atomické operace int num_threads = 0; #pragma omp parallel { #pragma omp atomic num_threads += 1; } Ne všechny operace lze provést atomicky! Typicky pouze: x++, x--, ++x, --x a x OP= expr, kde OP { +, -, *, /, &, ^,, <<, >> } Pokud kompilátor nemá k dispozici danou atomickou operaci, použije záložní plán: mutex. 10

Doimplementujte metodu integrate_omp_atomic Doimplementujte metodu integrate_omp_atomic v integrate.cpp. Místo kritické sekce využijte #pragma omp atomic. Jakého zrychlení touto úpravou dosáhneme? integrate.cpp, main.cpp / make main 11

Redukce v OpenMP

Redukce v OpenMP To samé lze ale udělat elegantněji a efektivněji: int num_threads = 0; #pragma omp parallel reduction(+:num_threads) { num_threads += 1; } OpenMP pak zajistí, že se částečné výsledky lokálních proměnných num_threads po konci bloku posčítají Následující operátory jsou podporované (OpenMP verze 3+): Aritmetické: +, *, -, max, min Logické: &, &&,,, ^ 12

Doimplementujte metodu integrate_omp_reduction Doimplementujte tělo metody integrate_omp_reduction v souboru integrate.cpp. Nahraďte #pragma omp atomic redukcí. integrate.cpp, main.cpp / make main 13

#pragma omp parallel for Kód s redukcí lze napsat ještě jednodušeji. Rozsahy pro vlákna si nemusíme počítat ručně a můžeme práci nechat na OpenMP: double acc = 0.0; #pragma omp parallel for reduction(+:acc) //schedule(static) for(int i = 0 ; i < step_count ; i++) { const double cx = a + (2*i + 1.0)*step_size/2; acc += integrand(cx)*step_size; } return acc; 14

Proč při integraci funkce f (x) = x dosahujeme většího zrychlení? 15

Proč při integraci funkce f (x) = x dosahujeme většího zrychlení? Výpočet f (x) = x trvá konstantní dobu a práce je tak mezi vlákna rozdělena rovnoměrně. To neplatí o funkci f (x) = 0.001x 2 sin(p) dp, kterou aproximujeme 0 numerickou integrací s proměnlivým počtem kroků. 15

Doimplementujte metodu integrate_omp_for_dynamic Doimplementujte tělo metody integrate_omp_for_dynamic. Statické rozvrhování schedule(static) nahraďte dynamickým schedule(dynamic). Jaký má tato volba dopad na rychlost numerické integrace f (x) = x a f (x) = 0.001x 2 0 sin(p) dp? integrate.cpp, main.cpp / make main 16

#pragma omp parallel for schedule Obecná syntaxe (možno použít i další parametry jako např. reduction): #pragma omp parallel for schedule(type[,chunk_size]) 17

#pragma omp parallel for schedule Obecná syntaxe (možno použít i další parametry jako např. reduction): #pragma omp parallel for schedule(type[,chunk_size]) chunk_size udává minimální velikost bloku, se kterým se plánuje, např: #pragma omp parallel for schedule(dynamic,16) zajistí, že si vlákno po dokončení práce na aktuálním bloku dat řekne o další blok o 16 prvcích. 17

#pragma omp parallel for schedule Obecná syntaxe (možno použít i další parametry jako např. reduction): #pragma omp parallel for schedule(type[,chunk_size]) chunk_size udává minimální velikost bloku, se kterým se plánuje, např: #pragma omp parallel for schedule(dynamic,16) zajistí, že si vlákno po dokončení práce na aktuálním bloku dat řekne o další blok o 16 prvcích. dynamic - vlákna si dynamicky alokují bloky, které mají počítat guided - dynamické plánování, kde se velikost bloků v průběhu výpočtu zmenšuje static - každé vlákno má svůj blok přiřazený napevno (když skončí dříve, musí čekat) runtime - rozhodnuto za běhu na základě nastavení prostředí (export OMP_SCHEDULE="dynamic, 100") 17

Zadání druhé domácí úlohy

Paralelní suma vektoru V 2. domácí úloze si budete moct vyzkoušet, že úspěšnost různých způsobů paralelizace závisí do značné míry na vstupních datech. Na vstupu dostanete vektor složený z vektorů náhodně generovaných čísel. Vaším úkolem je čísla v každém vektoru sečíst a tento součet vložit do vektoru s řešením na index odpovídající pořadí vektoru, který jste sčítali. 18

Paralelní suma vektoru Doimplementujte metody v SumsOfVectors.cpp a zajistěte, že 1. Výpočet sum je paralelní a každá metoda vrací korektní výsledky 2. Metody využívají požadované způsoby paralelizace 19

Paralelní suma vektoru Doimplementujte metody v SumsOfVectors.cpp a zajistěte, že 1. Výpočet sum je paralelní a každá metoda vrací korektní výsledky 2. Metody využívají požadované způsoby paralelizace Za spravné výsledky na každé ze čtyř datových sad dostanete 2b. 19

Díky za pozornost! Budeme rádi za Vaši zpětnou vazbu! http://bit.ly/2utkap2 19