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)