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

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

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

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

Paralelní architektury se sdílenou pamětí

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

Paralelní architektury se sdílenou pamětí

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

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

Pokročilé architektury počítačů

Paralelní programování

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

Cvičení MI-PAP I. Šimeček, M. Skrbek, J. Trdlička

Úvod do OpenMP. Jiří Fürst

OpenMP (Open Specification for Multi Processing)

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Paralelní programování

Øízený pøeklad - make

Operační systémy. Cvičení 5: Volání jádra, procesy, vlákna.

Procesy a vlákna (Processes and Threads)

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Struktura programu v době běhu

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

Více o konstruktorech a destruktorech

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Architektury VLIW M. Skrbek a I. Šimeček

PROGRAMOVÁNÍ V C++ CVIČENÍ

Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

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

Řada programovacích jazyků nabízí prostředky pro řešení meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce.

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


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

Programování bez vláken. OpenMP

1. Programování proti rozhraní

Procesy a vlákna - synchronizace


1.2 Realizace èekání pomocí jednoduché programové smyèky Pøíklad 3: Chceme-li, aby dítì blikalo baterkou v co nejpøesnìjším intervalu, øekneme mu: Roz

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

PESexcl. PODPORA PRO VÝMÌNU DAT S APLIKACÍ MICROSOFT EXCEL s využitím DDE serveru PESdde

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

3.7.5 Znaménkové operátory Násobící operátory Rùzné operátory Základní objekty Konstanty Sig

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Jakub Čermák Microsoft Student Partner

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

Uklízení odpadků a analýza úniku

Jazyk C++, některá rozšíření oproti C

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

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

3/ %,1'(& 83'1 &( &3 )XQNFH. + ; ; ; ; / ; ; + ; EH]H]PuQ\

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

Vytváøení sí ového diagramu z databáze: pøíklad

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

4. Úvod do paralelismu, metody paralelizace

KOMUNIKAÈNÍ DDE SERVER PRO AUTOMATY MICROPEL VERZE 2.3 POPIS ROZHRANÍ A OVLÁDÁNÍ

baspelin CPM Popis komunikaèního protokolu CPM KOMPR

Podìkování: Výsledkù publikovaných v této knize bylo dosaženo také za podpory projektù GAÈR 101/06/P108 Výzkum simulaèního a experimentálního modelová

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Motivace. Software. Literatura a odkazy

Architektury paralelních počítačů I.


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

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

4x kombinovaný analogový vstup s vysokou pøesností (0..10V, R, C)

OZNÁMENÍ ZADÁVACÍHO ØÍZENÍ / VYHLÁŠENÍ VEØEJNÉ SOUTÌŽE O NÁVRH

Programování v jazyce JavaScript

Optimalizace pomocí icc/gcc - vektorizace

Paralelní programování


Sdílení dat mezi podprogramy

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Programování v jazyce JavaScript

PREPROCESOR POKRAČOVÁNÍ

Dynamické programování

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

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

IRAE 07/08 Přednáška č. 1

Programování v jazyce JavaScript

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Programování inženýrských aplikací

1 Rozdělení paralelních úloh z hlediska jejich

Paralelní dotazy v PostgreSQL 9.6 (a 10.0)

Pavel Procházka. 3. prosince 2014

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í.

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

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

10 Balíčky, grafické znázornění tříd, základy zapozdření

Základní komunikační operace

Úvod do programovacích jazyků (Java)

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

Testování a spolehlivost. 4. Laboratoř Spolehlivostní modely 1

PODPROGRAMY PROCEDURY A FUNKCE

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

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

Programování v jazyce JavaScript

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Datové struktury. alg12 1

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

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Funkce, intuitivní chápání složitosti

Transkript:

Cvičení předmětu MI-PAR P Tvrdík, I Šimeček, M Šoch paveltvrdik,xsimecek,soch@fitcvutcz Katedra počítačových systémů FIT České vysoké učení technické v Praze 2011 MI-PAR, ZS2011/12, Cv1-6 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy Praha & EU: Investujeme do vaší budoucnosti

- - - + + + + - = S t a r C l u s t e r = + + + + - - - http://usersfitcvutcz/~soch/mi-par/ 1 of 1 22122011 13:18 Programovaní pod MPI Programovací jazyk C a C++, C++, Komunikační knihovna MPI Úvod Základní komunikační funkce MPI Ukázkové příklady Kde najít další informace o MPI Jak kompilovat paralelní aplikaci na svazku STAR Jak spustit paralelní aplikaci na svazku STAR Jak ladit paralelní aplikaci na svazku STAR Další info na Wiki výpočetního svazku STAR Knihovna logger pro jednoduší logování aplikací Tipy a triky byvalych studentu MPI na WIN (s Netbeans) MPI na Linuxu

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 1 of 8 22122011 13:19 OpenMP podle Blaise Barney, Lawrence Livermore National Laboratory Struktura: 1 2 3 4 5 Základní informace 1 Co je to OpenMP? 2 Jak OpenMP funguje? 3 Jak udìlat program vícevláknový? 4 Váš úkol 5 Co zde chybí? 6 Odkazy dále OpenMP direktivy 1 Obecná pravidla pro zápis 2 Ukázka principu zápisu OpenMP direktivy 3 Direktiva "parallel" 4 Direktiva "for" 5 Direktiva "single" 6 Direktiva "master" 7 Direktiva "critical" 8 Direktiva "atomic" OpenMP vlastnosti 1 Co to je? 2 Vlastnost "shared" 3 Vlastnost "private" 4 Vlastnost "firstprivate" 5 Vlastnost "lastprivate" 6 Vlastnost "default" 7 Vlastnost "reduction" OpenMP operace 1 Operace "barrier" 2 Operace "flush" 3 Operace s vlákny 4 Operace s èasem 5 Operace se OpenMP zámky Ukázkové OpenMP kódy 1 Hello World (ukázka direktivy parallel) 2 Vektorový souèet (ukázka direktivy parallel a for) 3 Vektorový souèet (ukázka direktivy parallel for) 4 Kritická sekce(ukázka direktivy critical) Základní informace Co je to OpenMP? sjednocené API pro programování vícevláknových aplikací Jak OpenMP funguje?

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 2 of 8 22122011 13:19 Ve vybraných èástech kódu (dále oznaèovaných jako paralelní bloky = parallel regions) je pomocí fork-join mechanismu vytvoøen daný poèet vláken a tak je tento paralelní blok øešen vícevláknovì Mimo tyto paralelní bloky existuje pouze jedno vlákno hlavního procesu Pozn Nedoporuèuje se míchat tento zpùsob vytváøení a zániku threadù s tím jak byl probírán v pøedmìtu OSY (POSIX thready = pthread_create, pthread_join, pthread_exit) Jak udìlat program vícevláknový? Staèí dodržet tyto 4 kroky 1 2 3 4 Stanovit si, které èásti kódu (nejèastìji cykly) chci aby bìžely vícevláknovì, toto udìlám pomocí OpenMP direktiv = vytvoøíme paralelní bloky Díky tomu, že vytvoøení a zánik vláken má jistou režii, je snaha paralelizovat co èasovì nejvìtší èásti kódu Stanovit pro jednotlivé promìnné jejich OpenMP vlastnosti Je snaha co nejvíce se vyhybat sdíleným promìnným V rámci paralelních blokù se vyhnout "thead-unsafe" operacím Zkompilovat program pomocí "gcc-fopenmp-o3", první volba je pro zpracování OpenMP, druhá zapíná optimalizace kompilátoru Jaký je váš úkol? Pro každý výpoèetní uzel vytvoøit sdílenou frontu nebo zásobník, kterou budou využívat jednotlivá vlákna (jejich poèet volte rovných 4) v daném výpoèetním uzlu Pro vzájemné vylouèení vláken pøi pøístupu využijte OpenMP zámky, kritické sekce nebo atomické operace Co zde chybí? Tento text slouží jako úvod do OpenMP proto zde chybí popis pokroèilejší mechanismù jako direktiva sections, dynamicky mìnitelný poèet vláken nebo vnoøené paralelní bloky (nested parallel regions) Odkazy dále OpenMP website: openmporg API specifications, FAQ, presentations, discussions, media releases, calendar, membership application and more Wikipedia: enwikipediaorg/wiki/openmp OpenMP direktivy Obecná pravidla pro zápis Pøed každým paralelním blokem je na jedné programované øádce uvede jediná OpenMP direktiva a dále volitelný poèet jejich parametrù Pozn Jedna programová øádka mùže obsahovat i více øádek v kódu, pokud je pøedchozí øádka ukonèena pomocí znaku zpìtné lomítko("\") Ukázka principu zápisu OpenMP direktivy

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 3 of 8 22122011 13:19 C / C++ - General Code Structure #include <omph> main () { int var1, var2, var3; zde pracuje jen hlavni vlakno procesu (serial code) nasleduje paralelni blok (Beginning of parallel section Fork a team of threads Specify variable scoping) #pragma omp parallel private(var1, var2) shared(var3) { Uvnitr paralelniho bloku pracuje vice vlaken (Parallel section executed by all threads) Promenne var1, var2 jsou privatni = kazde vlakno v tomto bloku ma vlastni Promenna var3 je sdilena vsemi vlakny } Na konci bloku se nove vznikla vlakna zrusi (All threads join master thread and disband) } opet pracuje jen hlavni vlakno procesu (serial code) Direktiva "parallel" Možné parametry jsou: if (podmínka) num_threads (výraz) vlastnosti promìnných (seznam promìnných) Pokud je podmínka splnìna (když není uvedena, je splnìna), je vytvoøen daný poèet vláken, jinak se bude paralelní blok provádìt sekvenènì V tomto paralelním bloku budou mít promìnné tyto OpenMP vlastnosti Pøesné chování Omezení Je vytvoøen daný poèet vláken, vlákna jsou oèíslována, pùvodní (hlavní vlákno procesu) vlákno má èíslo 0 Kód paralelního bloku je zduplikován na všechny vlákna a zaène se provádìt Na konci paralelního bloku je implicitní bariéra, novì vzniklá vlákna jsou ukonèena, dále pokraèuje zase jen pùvodní (hlavní vlákno procesu) vlákno Pokud je z nìjakého dùvodu jedno z vláken ukonèeno bìhem paralelního bloku, jsou ukonèeny všchny vlákna a tím i program Paralelního blok nesmí pøekroèit rámec jedné procedury a musí být v jednom programovém souboru Je zakázáno vyskoèit ven nebo vskoèit zvenèí dovnitø paralelního bloku

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 4 of 8 22122011 13:19 Je dovolena maximálnì jedna if (podmínka) pøed každým paralelním blokem Je dovolena maximálnì jede num_threads (výraz) pøed každým paralelním blokem Poèet vláken u direktivy "parallel" Poèet vzniklých vláken je øízen tìmito výrazy (v tomto poøadí, dùležitý je první platný výraz) 1 2 3 4 5 pokud je uvedena, vyhodnotí se if Pokud není splnìna, bude provádìt jako sekvenèní kód pokud je uvedena, provede se dle nastavení num_threads pokud bylo uvedeno, provede se dle nastavení pøi posledním volání fci omp_set_num_threads() pokud je uvedena, provede se dle nastavení promìnné prostøedí OMP_NUM_THREADS v závisloti na implementaci nebo dynamicky Pozn: Direktivu "parallel" a "for" je mozno spojit do "parallel for" viz zde Direktiva "for" Konstrukce pro paralelizaci for-cyklu uvniø paralelního bloku, možné parametry jsou: schedule(typ,velikost) static Každému vláknu je staticky pøidìleno velikost iterací (jdoucích po sobì) cyklu Pokud není velikost uvedena, jsou iterace rovnomìrnì rozdìleny mezi vlákna dynamic Každému vláknu je dynamicky pøidìleno velikost iterací (jdoucích po sobì) cyklu Když vlákno dokonèí,je mu pøidìlena další èást stejné velikosti Pokud není velikost uvedena, pøedpokládá se 1 guided Každému vláknu je dynamicky pøidìleno x iterací ( x je poèet neprovedených iterací dìleno poètem vláken, x je vìtší nez velikost kromì posledního kousku) cyklu Když vlákno dokonèí,je mu pøidìlena další èást stejné velikosti Pokud není velikost uvedena, pøedpokládá se 1 runtime Rozhodnutí o plánování je odloženo až do okamžiku provedení dle promìnné prostøedí OMP_SCHEDULE auto Plánování je necháno na kompilátoru a OS nowait = vlákna na konci paralelního bloku neprovádí bariéru ordered = poøádí iterací je stejné jako pøi sekvenèním provádìní collapse = slouží pro upøesnìní u vnoøených cyklù Pokud je podmínka splnìna (když není uvedena, je splnìna), je vytvoøen daný poèet vláken, jinak se bude paralelní blok provádìt sekvenènì V tomto paralelním bloku budou mít promìnné tyto vlastnosti (TODO viz) Pøesné chování Omezení: Je vytvoøen daný poèet vláken, vlákna jsou oèíslována, pùvodní (hlavní vlákno procesu) vlákno má èíslo 0 Kód paralelního bloku je zduplikován na všechny vlákna a zaène se provádìt Na konci paralelního bloku je implicitní bariéra, novì vzniklá vlákna jsou ukonèena, dále pokraèuje zase jen pùvodní (hlavní vlákno procesu) vlákno Pokud je z nìjakého dùvodu jedno z vláken ukonèeno bìhem paralelního bloku, jsou ukonèeny všchny vlákna a tím i program Paralelního blok musí obsahuje for-cyklus, který je øízen celoèíselnou promìnnou Øídící promìnné

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 5 of 8 22122011 13:19 tohoto cyklu musí být stejné pro všechny vlákna Chování programu musí být nezávislé na tom, které vlákno provádí konkrétní iteraci cyklu Je zakázáno vyskoèit ven nebo vskoèit zvenèí dovnitø paralelního bloku velikost parametru velikost musí být nemìnná bìhem provádìní cyklu Je dovolena maximálnì jeden výskyt ordered, collapse nebo schedule, (podmínka) pøed každým paralelním blokem Pozn: Direktivu "parallel" a "for" je mozno spojit do "parallel for" viz zde Direktiva "single" Specifikuje èást paralelního bloku, kterou provádí pouze jedno vlákno Možné parametry jsou: Omezení nowait = vlákna na konci paralelního bloku neprovádí bariéru Je zakázáno vyskoèit ven nebo vskoèit zvenèí dovnitø paralelního bloku Direktiva "master" Specifikuje èást paralelního bloku, kterou provádí pouze master vlákno (to s èíslem vlákna rovným 0), ostatní vlákna zpracovávají kód následující po této èásti bloku Omezení Je zakázáno vyskoèit ven nebo vskoèit zvenèí dovnitø paralelního bloku Direktiva "critical" Specifikuje èást paralelního bloku, kterou mùže souèasnì provádìt pouze jedno vlákno (kritická sekce) Možné parametry jsou: Omezení jméno = èásti se stejným názvem jsou brány jako jedna kritická sekce Všechny èásti bez jména jsou také brány jako jedna kritická sekce Ukázka zde Je zakázáno vyskoèit ven nebo vskoèit zvenèí dovnitø paralelního bloku Direktiva "atomic" Specifikuje pamì ové operace, které mají být atomické Ukázka zde vlastnosti promìnných Co to je? Urèují vlastnosti promìnných vzhledem k pamì ovým operacím Pozor!!! Pokud budou vlastnosti použity na

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 6 of 8 22122011 13:19 pointer, aplikují se pouze na tento pointer nikoliv na data na která ukazuje vlastnost shared Urèuje, že daná promìnná bude sdílena všemi vlákny vlastnost private Urèuje, že daná promìnná bude lokální ve vláknì, tozn že každé vlákno bude mít nezávislou instanci této promìnné Promìnná je vytvoøena jako neinicializovaná vlastnost firstprivate Urèuje, že daná promìnná bude lokální ve vláknì, tozn každé vlákno bude mít nezávislou instanci této promìnné Promìnná je vytvoøena s pùvodní hodnotou, kterou mìlqa pøed vstupem do paralelního bloku vlastnost lastprivate Urèuje, že daná promìnná bude lokální ve vláknì, tozn že každé vlákno bude mít nezávislou instanci této promìnné Hodnota promìnná z poslední iterace bude pøekopírována do promìnné hlavního vlákna procesu (bude platná po skonèení paralelního bloku) vlastnost default Urèuje, jakou vlastnost budou mít defaultnì všechny promìnné použité v paralelním bloku (pokud nebude uvedeno jinak) Možné parametry jsou: shared none vlastnost reduction Urèuje, že daná promìnná bude lokální ve vláknì, tozn že každé vlákno bude mít nezávislou instanci této promìnné Po skonèení bloku se na všechny instance použije redukèní operace a výsledek bude zapsán do promìnné hlavního vlákna procesu (bude platný po skonèení paralelního bloku) Možné operace jsou: +, *, -, &, ^, Omezení: Musí se jednat o promìnné jednoduchého typu V nadøízeném bloku musí být deklarovány jako SHARED Operace nesmí být pøetížena pro daný datový typ Pro reálné datové typy operace nemusí být asociativní Každý blok mùže obsahovat i více promìnných pro redukci ale každou maximálnì jednou Ukázka zde podrobnìji a další ukázka zde OpenMP operace

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 7 of 8 22122011 13:19 Operace "barrier" Specifikuje bariéru (èást kódu,kde na sebe všechny vlákna "poèkají" a dále jdou zase všechny) Operace "flush" Násilnì vyvolá ètení a zápis daných promìných do/z pamìti Možné parametry jsou: seznam promìnných vysvìtlení zde Operace "omp_set_num_threads(int i)" Programovì zmìní poèet vytvoøených vláken v následujích paralelních blocích Musí být volán ze sekvenèní èásti pøedcházející paralelnímu bloku Efekt zùstává v platnosti do dalšího volání Parametrem je požadovaný poèet vláken Operace "omp_get_num_threads" Vrátí poèet vláken v aktuálním paralelním bloku V sekvenèní èásti vrací 1 Operace "omp_get_wtime" Vrátí èíslo (typu double), které udává ubìhnutý èas od nìjakém (impementaènì závislého) okamžiku v minulosti Nejèastìji se používá jako párové volání pro zjištìní napø doby trvání cyklu, doba trvání programu Operace "omp_init_lock(omp_lock_t *x)" Inicializuje OpenMP zámek (mutex) s poèáteèní hodnotou odemèeno Operace "omp_destroy_lock(omp_lock_t *x)" Zruší (inicializovaný) OpenMP zámek (mutex) Operace "omp_set_lock(omp_lock_t *x)" Pokusí se zamknout OpenMP zámek (mutex) V pøípadì neúspìchu se vlákno zablokuje Operace "omp_test_lock(omp_lock_t *x)" Pokusí se zamknout OpenMP zámek (mutex) V pøípadì neúspìchu vrací 0 Operace "omp_unset_lock(omp_lock_t *x)" Odemkne OpenMP zámek (mutex) Ukázkové OpenMP kódy 1 2 3 Hello World (ukázka direktivy parallel) Vektorový souèet (ukázka direktivy parallel a for) Vektorový souèet (ukázka direktivy parallel for)

http://usersfitcvutcz/~soch/mi-par/openmp/openhtml 8 of 8 22122011 13:19 4 Kritická sekce(ukázka direktivy critical) 5 Atomická operace(ukázka direktivy atomic) 6 Operace redukce(ukázka direktivy reduction)