skaitiniai metodai 1

Panašūs dokumentai
skaitiniai metodai 1

Microsoft Word - 15_paskaita.doc

Masyvas su C++ Užduotys. Išsiaiškinkite kodą (jei reikia pataisykite) ir paleiskite per programą. Ciklo skaitliuko įrašymas į vienmatį masyvą: #includ

Slide 1

DB sukūrimas ir užpildymas duomenimis

skaitiniai metodai 1

P. Kasparaitis. Praktinė informatika. Skriptų vykdymas ir duomenų valdymas Skriptų vykdymas ir duomenų valdymas Įvadas Skripto failas tai M

Java esminės klasės, 1 dalis Išimtys, Įvestis/išvestis

Programų sistemų inžinerija Saulius Ragaišis, VU MIF

Pagrindiniai algoritmai dirbant su sveikųjų ir realiųjų skaičių masyvų reikšmėmis Sumos skaičiavimo algoritmas Sveikieji skaičiai int Suma (int X[], i

Algoritmai ir duomenų struktūros (ADS) 2 paskaita Saulius Ragaišis, VU MIF

DBVS realizavimas Pagrindiniai DBVS komponentai Duomenų saugojimas diske Paruošė J.Skučas

Algoritmø analizës specialieji skyriai

Logines funkcijos termu generavimo algoritmas pagristas funkciniu modeliu

Dažniausios IT VBE klaidos

GPU

PowerPoint Presentation

Neiškiliojo optimizavimo algoritmas su nauju bikriteriniu potencialiųjų simpleksų išrinkimu naudojant Lipšico konstantos įvertį

MUITINĖS DEPARTAMENTAS PRIE LIETUVOS RESPUBLIKOS FINANSŲ MINISTERIJOS BENDRO NAUDOTOJŲ VALDYMO SISTEMOS, ATITINKANČIOS EUROPOS KOMISIJOS REIKALAVIMUS,

PowerPoint Presentation

PS Testavimo ir konfigūravimo valdymas Užduotis nr. 1. Karolis Brazauskas Mindaugas Rekevičius Jonas Riliškis Eugenijus Sabaliauskas

Slide 1

4 skyrius Algoritmai grafuose 4.1. Grafų teorijos uždaviniai Grafai Tegul turime viršūnių aibę V = { v 1,v 2,...,v N } (angl. vertex) ir briaun

PATVIRTINTA Kauno sporto mokyklos Startas Direktoriaus 2019 m. balandžio 23 d. įsakymu Nr KAUNO SPORTO MOKYKLOS STARTAS PRIVATUMO POLITIKA Kauno

PowerPoint Presentation

Lietuvos mokslo ir studijų institucijų kompiuterių tinklas LITNET Vilniaus universitetas Mokslininko darbo vietos paslauga Paslaugos naudojimo instruk

Jabra SPEAK 410 Naudotojo vadovas

File Transfer programinės įrangos naudotojo instrukcija

Slide 1

RYŠIŲ REGULIAVIMO TARNYBOS

UAB AMEA Business Solutions Praktiniai IT Sprendimai smulkioms ir vidutin ms mon ms Direktor, Jurgita Vitkauskait , K

Microsoft Word - SDH2.doc

Algoritmai ir duomenų struktūros (ADS) 7 paskaita Saulius Ragaišis, VU MIF

K9 WebProtection (toliau K9) programa yra nemokama asmeniniam naudojimui. Programa suderinama su Windows Vista, Windows 7, Windows 10 ir Mac operacinė

PATVIRTINTA Valstybinės kainų ir energetikos kontrolės komisijos pirmininko 2017 m. d. įsakymu Nr. O1- VALSTYBINĖS KAINŲ IR ENERGETIKOS KONTROLĖS KOMI

* # * # # 1 TIESĖS IR PLOKŠTUMOS 1 1 Tiesės ir plokštumos 1.1 Lygtys ir taškų aibės Sferos lygtis Tarkime, kad erdvėje apibrėžta Dekarto stačiak

Banko_paslaugu_internetu_teikimo_salygos_

PS_riba_tolydumas.dvi

VERSLO IR VADYBOS TECHNOLOGIJŲ PROGRAMA

Pardavimų aplikacija (Microsoft Dynamics AX (Axapta) sistemai) Diegimo instrukcija bifree.lt qlik.com

LT Europos Sąjungos oficialusis leidinys L 79/11 DIREKTYVOS KOMISIJOS DIREKTYVA 2007/16/EB 2007 m. kovo 19 d. įgyvendinanti Tarybos direktyv

Microsoft Word - Vaida_Benetyte_v6.doc

PATVIRTINTA

PowerPoint Presentation

Slide 1

Layout 1

ktu kompiuterių katedra Programavimas asembleriu Darius Birvinskas Ignas Martišius Algimantas Venčkauskas

NEKILNOJAMO TURTO KADASTRO DUOMENŲ TEIKIMO IŠVADAI GAUTI EL. PASLAUGA: NAUDOTOJO VADOVAS NŽT DARBUOTOJAMS (V.1) VILNIUS 2017

RR-GSM_IM_LT_110125

Techninė dokumentacija Qlik Sense architektūros apžvalga 2015 m. gruodis qlik.com

LIETUVOS RESPUBLIKOS ŪKIO MINISTRAS

Style Sample for C&N Word Style Sheet

Slide 1

CompoundJS Node on rails

Elektroninio dokumento nuorašas UKMERGĖS RAJONO SAVIVALDYBĖS ADMINISTRACIJOS DIREKTORIUS ĮSAKYMAS DĖL NACIONALINIO MOKINIŲ PASIEKIMŲ PATIKRINIMO (DIAG

Microsoft Word - Naudotojo gidas_aplikacijai_

JABRA REVO WIRELESS Naudotojo Vadovas jabra.com/revowireless

LIETUVOS RESPUBLIKOS VALSTYBINIO PATENTŲ BIURO DIREKTORIAUS

Automatinis skolinimas Automatinio skolinimo paslauga automatiškai teikia pasiūlymus paskolų prašymams pagal Jūsų pasirinkto portfelio rinkinio nustat

RET2000 Elektronisis Skaitmeninis Termostatas su LCD

NACIONALINIS KIBERNETINIO SAUGUMO CENTRAS Tel El. p. NACIONALINIS KIBERNETINIO SAUGUMO CENTRAS PRIE KRA

DĖL APLINKOS IR SVEIKATOS MOKSLO KOMITETO ĮSTEIGIMO

KTU BIBLIOTEKOS PASLAUGOS

AAA.AIEPI.Mokymu_medziaga_MOK_VI_07.Vandens_inventorizacijos_duomenu_tvarkymas.v.0.4

EUROPOS KOMISIJA Briuselis, C(2017) 4679 final KOMISIJOS ĮGYVENDINIMO SPRENDIMAS (ES) / dėl bendros sistemos techninių standa

Slide 1

Verification Opinion Template

No Slide Title

Printing triistr.wxmx

VALSTYBINĖS MOKESČIŲ INSPEKCIJOS

Vienlusčių įtaisų projektavimas

Brandos egzaminų organizavimas ir vykdymas 2012 m.

Cloud_sprendimu_salygos.pdf

ES F ben dri Projekto kodas (Įrašoma automatiškai) 1 PROJEKTO SFMIS DUOMENŲ FORMA FORMAI PRITARTA m. Europos Sąjungos struktūrinės paramos a

Tema 2 AP skaidres

Mokinių kūrybinių darbų vertinimo kriterijai, vertinimo aptarimas

MAGENTO 1.9 OMNIVA MODULIO DIEGIMO INSTRUKCIJA

EUROPOS KOMISIJA Briuselis, C(2012) 2384 final KOMISIJOS ĮGYVENDINIMO SPRENDIMAS kuriuo priimamas valstybių narių teikiamų Europ

Specialiosios_SoyouStart_dedikuoto_serverio_nuomos_sutarties_salygos

PowerPoint Presentation

Tema 2 AP skaidres

VILNIAUS R. PABERŽĖS ŠV. STANISLAVO KOSTKOS GIMNAZIJOS 2, 4, 6 IR 8 KLASĖS MOKINIŲ MOKYMOSI PASIEKIMŲ VERTINIMO PANAUDOJANT DIAGNOSTINIUS IR STANDARTI

Pridėtinės vertės mokesčio sąskaitų faktūrų registrų duomenų tvarkymo ir pateikimo taisyklių priedas I.SAF DUOMENŲ RINKMENOS APRAŠYMAS I DALIS ANTRAŠT

Projektas „Europos kreditų perkėlimo ir kaupimo sistemos (ECTS) nacionalinės koncepcijos parengimas: kreditų harmonizavimas ir mokymosi pasiekimais gr

LIETUVOS RESPUBLIKOS FINANSŲ MINISTRAS ĮSAKYMAS DĖL FINANSŲ MINISTRO 2014 M. GRUODŽIO 30 D. ĮSAKYMO NR. 1K-499 DĖL METŲ EUROPOS SĄJUNGOS FON

VALSTYBINĖS KAINŲ IR ENERGETIKOS KONTROLĖS KOMISIJA

PATVIRTINTA Gretutinių teisių asociacijos Greta 2018 m. spalio 14 d. Visuotinio narių susirinkimo sprendimu GRETUTINIŲ TEISIŲ ASOCIACIJA GRETA ATLYGIN

2 + 1 PROCENTAI GYVENTOJO PAJAMŲ MOKESČIO - PARAMAI

Microsoft Word - DV_Rekomendacijos2

Įžanga apie privatumą Dalyviai tyrinės tai, kaip jie patys suvokia privatumą ir kokį poveikį jis daro jų gyvenimams. Dalyviai apžvelgs informacijos, k

Techninis aprašymas SONOMETER TM 1100 Ultragarsinis kompaktiškas energijos skaitiklis Aprašymas / taikymas MID tikrinimo sertifikato nr.: DE-10-MI004-

Sistemos specifikacija

Microsoft PowerPoint - IOSrautai.ppt

NACIONALINIS KIBERNETINIO SAUGUMO CENTRAS Tel El. p. NACIONALINIS KIBERNETINIO SAUGUMO CENTRAS PRIE KRAŠTO APSA

VĮ GIS-Centras Vilnius 2019 Palydovinių duomenų peržiūros ir analizės paslauga Naudotojo vadovas v.1

Style Sample for C&N Word Style Sheet

Microsoft Word - DSEA-3s.doc

KAUNO TECHNOLOGIJOS UNIVERSITETAS INFORMATIKOS FAKULTETAS VERSLO INFORMATIKOS KATEDRA Jevgenij Nikonov LIETUVOS MOKESČIŲ ADMINISTRATORIAUS MOKESTINIO

A. Merkys ASOCIACIJA LANGAS Į ATEITĮ, 2015 m. Elektroninis mokymasis Tikriausiai šiais laikais daugelis esate girdėję apie elektroninį bei nuotolinį m

Transkriptas:

Lygiagretusis programavimas doc. dr. Vadimas Starikovičius 4-oji paskaita OpenMP programavimo standartas. Programavimo modelis. OpenMP konstrukcijos.

PThreads: Hello, world! pavyzdys #include <pthread.h> void* PrintHello(void *data) { cout << "Hello, world!" << endl; return NULL; int main() { pthread_t threads[4]; for(int tn=0; tn<4; tn++) { pthread_create(&threads[tn], NULL, PrintHello, NULL); for(int tn=0; tn<4 ; tn++) { pthread_join(threads[tn], NULL);// wait for thread[tn] return 0; Klasteryje Vilkas (examples/hello_threads.cpp): >g++ hello_threads.cpp pthread >./a.out arba > qsub serial-jobscript.sh

Windows threads: Hello, world! pavyzdys #include <windows.h> const int NUM_THREADS = 4; DWORD WINAPI PrintHello(LPVOID arg){ cout << "Hello, world! << endl; return 0; HANDLE thread_handles[num_threads]; int main(int argc, char* argv[]) { for (int i=0; i<num_threads; i++){ thread_handles[i] = CreateThread(0, 0, PrintHello, NULL, 0, NULL); WaitForMultipleObjects(NUM_THREADS, thread_handles, TRUE, INFINITE); return 0; Klasteryje Vilkas: examples/hello_win_threads.cpp

OpenMP: Hello, world! pavyzdys int main() { // Do this part in parallel #pragma omp parallel cout << "Hello, World!\n"; return 0; Klasteryje Vilkas kompiliuojame (examples/openmp/hello_openmp1.cpp): g++ hello_openmp1.cpp fopenmp Paleidžiame:./a.out qsub serial-jobscript.sh (tik trumpiems darbams, testavimui!!!) (tinka tas pats PBS nuoseklaus darbo skriptas, nes darbą paleidžiame tik viename mazge) Kiek gijų bus sugeneruota? Ką gausime, kai kompiliuosime be fopenmp rakto?

Kas yra OpenMP? OpenMP - Open specification for Multi-Processing Standartinis API (Application Programming Interface) lygiagrečiajam bendrosios atminties programavimui su C/C++ ir Fortran (multi-threaded shared-memory programming in C/C++ and Fortran). www.openmp.org API specifikacijos (1.0 1997,..., 2.5 2005, 3.0 2008, 3.1 2011, 4.0 2013, 5.0 2018), tutorials, forumai,... OpenMP API (High-level API, light syntax) sudaro: Direktyvos (preprocessor (compiler) directives) ( ~ 80% ) #pragma omp... Bibliotekos funkcijos (library calls) ( ~ 19% ), omp_xxxx(...); Aplinkos kintamieji (environment variables) ( ~ 1% ). Kompiliuojant lygiagretųjį kodą, reikalauja atitinkamo kompiliatoriaus palaikymo (support C/C++, Fortran). Tikslus lygiagrečiosios programos elgesys/efektyvumas priklauso nuo kompiliatoriaus gamintojo realizacijos. OpenMP palaikomas kompiliatoriuose: Intel (OpenMP 4.5), Windows (Visual Studio 2017 OpenMP 2.0), GNU g++ (Vilke versija 4.6.2 - OpenMP 3.0).

OpenMP suteikia : Kas yra OpenMP? paprastas ir patogias lygiagretinimo ir sinchronizavimo konstrukcijas programuotojui. Bendrą (angl. unified) kodą nuosekliai ir lygiagrečiai versijai. OpenMP nesuteikia: Automatinio išlygiagretinimo. Garantuoto pagreitėjimo. Laisvės nuo klaidų, pvz., lenktynių konfliktai (angl. data races), deadlocks. OpenMP nepanaudojamas(neskirtas) paskirstytos atminties lygiagrečiuose kompiuteriuose. Rekomenduojami tutorialai: https://computing.llnl.gov/tutorials/openmp/ (OpenMP 3.1) https://www.openmp.org/resources/tutorials-articles/

OpenMP: programavimo modelis Fork-Join lygiagretumas: Pradinis procesas (master thread) vykdo programa nuosekliai, kol nepasieks lygiagrečiosios srities direktyvą, tada jis sukuria gijų grupę (su fork). Gijų skaičius arba nurodomas (programuotojo, vartotojo), arba nustatomas automatiškai pagal operacinės sistemos konfigūraciją. Gijos lygiagrečiai vykdo lygiagrečiosios srities (parallel region) instrukcijas (užduotis) iki jos pabaigos (įvykdomas join). Toliau skaičiuoja vienas pradinis procesas iki kitos lygiagrečiosios srities arba programos pabaigos. Lygiagretumas pridedamas į nuoseklią programą (įterpiant direktyvas ir funkcijas). Galima išlaikyti vieną programinio kodo failą (-us) nuosekliai ir lygiagrečiai versijoms.

OpenMP: Hello, world! antras pavyzdys Tam, kad padalinti darbą tarp gijų, turime mokėti: nustatyti jų skaičių, atskirti kiekvieną giją nuo kitų, t.y. identifikuoti ją, nustatyti jos unikalų numerį (angl. id, rank). Šiam tikslui OpenMP turi dvi atitinkamas funkcijas: omp_get_num_threads(); // get number of threads omp_get_thread_num(); // get thread number/rank/id Pažiūrėkime kitą pavyzdį (examples/openmp/hello_openmp2.cpp): #include "omp.h int main() { #pragma omp parallel { int id = omp_get_thread_num(); cout << "Hello, world, from thread - " << id << endl; if (id == 0){ int nthreads = omp_get_num_threads(); cout << "Number of threads = " << nthreads << endl; return 0;

OpenMP konstrukcijos OpenMP direktyvos: Lygiagrečiosios srities (parallel regions) Užduočių paskirstymo (work sharing) Sinchronizavimo (synchronization) Duomenų/kintamųjų priklausomumo/matomumo apibrėžimo atributai (data scope attributes) Bendrieji, lokalieji kintamieji,... (shared, private,...) Bibliotekos funkcijos (runtime functions) Nurodyti, sužinoti gijų skaičių Gauti gijos ID (unikalų identifikuojantį numerį)... Aplinkos kintamieji (environment variables) Užduoti gijų skaičių, ciklo iteracijų paskirstymą, t.t. OpenMP konstrukcijos Fortran and C/C++ yra labai panašios.

OpenMP direktyvų sintaksė Direktyvos yra suprantamos tik kompiliatoriams, turintiems OpenMP palaikymą. Kitiems tai tik komentaras. C ir C++ formatas: #pragma omp construct [clause [clause] ] arba structured-block #pragma omp construct [clause [clause] ] construct yra direktyvos vardas clause - direktyvos argumentas, [clause] neprivalomas argumentas structured-block sakinys arba sakinių blokas: C/C++ - {... Fortrano formatas: C$OMP construct [clause [clause] ]!$OMP construct [clause [clause] ] *$OMP construct [clause [clause] ]

OpenMP: Lygiagrečiosios srities direktyva #pragma omp parallel [clause [clause] ] structured-block Kai pradinis procesas pasiekia šią direktyvą, jis sukuria gijų grupę ir toliau struktūrinį bloką (vieną sakinį arba sakinių bloką {...) visos gijos atlieka lygiagrečiai. Argumentai [clause]: if (scalar_expression) private(list) firstprivate(list) default(shared none) shared(list) copyin(list) reduction(operator: list) num_threads(integer-expression)

OpenMP: Lygiagrečioji sritis. Pavyzdys. OpneMP funkcijos pagalba nurodome, kiek reikės sukurti gijų. Lygiagrečioji sritis: sukuriamos gijos. Kiekviena gija vykdo visus struktūrinio bloko sakinius. Lygiagrečiosios srities pabaiga (join). double A[1000]; omp_set_num_threads(4); #pragma omp parallel { int ID =omp_get_thread_num(); pooh(id,a); printf( all done\n );

OpenMP: bendras ar lokalus kintamasis? Bendros taisyklės: Pagal nutylėjimą (default) iki lygiagrečiosios srities pradžios apibrėžti kintamieji srities viduje yra bendri (shared). Programuotojas gali keisti (kontroliuoti) pagal nutylėjimą priskiriamą kintamojo tipą naudodamas OpenMP opciją: default(shared none). C/C++ ir Fortrano globalus kintamieji yra bendri (shared): C/C++: File scope variables, static variables; Fortran: COMMON blocks, SAVE variables, MODULE variables. Automatiniai kintamieji (automatic variables), apibrėžiami lygiagrečiosios srities viduje, yra lokalus (private). Steko kintamieji (stack variables), apibrėžiami paprogramėse/funkcijose, kviečiamose (called from) lygiagrečiosios srities viduje, yra lokalus (private). Lygiagrečiųjų (OpenMP paskirstytų) ciklų iteratoriai (iteracijų indeksai) yra lokalus.

Duomenų priklausomumo tipai (OpenMP atributai) (data scope attributes): shared (var-list) Bendrųjų kintamųjų sąrašas (per kablelį). Atmintyje egzistuoja tik vieną bendrojo kintamojo kopija, matoma visoms grupės gijoms. private (var-list) Lokalieji kintamieji. Kiekviena gija generuoja savo lokalaus kintamojo kopiją, kuri yra neinicializuota. Pasibaigus lygiagrečiai sričiai gijų reikšmės yra prarandamos. firstprivate (var-list) Analogiškai kaip private, tik lokalios gijų kopijos yra inicializuojamos pradine kintamojo reikšme, kurią jis turėjo prieš lygiagrečiąją sritį. default (shared none) Nurodo tipą (shared arba none), kuris pagal nutylėjimą yra priskiriamas kintamiesiems lygiagrečiojoje srityje (jei jų tipas nebuvo išreikštiniu būdu apibrėžtas). Default as yra shared. Jei nurodoma none, tai programuotas turi apibrėžti visų lygiagrečioje srityje naudojamų kintamųjų tipą. reduction ( operator : var-list) vėliau... lastprivate, threadprivate, copyin (žr. OpenMP specifikacija)

Duomenų priklausomumo tipai. 1 Pavyzdys. examples/openmp/openmp_scope.cpp. main(){ int x = 7; #pragma omp parallel { int id = omp_get_thread_num(); if (id == 0) x = 9; cout << x << endl; cout << "x = " << x << endl; Kas bus atspausdinta? Paleiskite keletą kartų. Lenktynių konfliktas (race condition) x kintamajam! Rezultatas neapibrėžtas, atsitiktinis! Apibrėžkite x kaip lokalų kintamąjį.

Duomenų priklausomumo tipai. 2 Pavyzdys. main(){ int x = 7; #pragma omp parallel private(x) { int id = omp_get_thread_num(); if (id == 0) x = 9; cout << x << endl; cout << "x = " << x << endl; Kas bus atspausdinta?

OpenMP užduočių paskirstymo konstrukcijos (work-sharing constructs) Lygiagrečiosios srities viduje programuotojas gali pats paskirstyti darbą (užduotis) atskiroms gijoms, naudodamas gijos unikalų identifikacinį numerį ID, kurį kiekviena gija gali sužinoti (gauti) su bibliotekos funkcija - omp_get_thread_num(). O gali pasinaudoti OpenMP užduočių paskirstymo direktyvomis: #pragma omp for #pragma omp sections #pragma omp single Šios direktyvos, iškviestos lygiagrečioje srityje, nurodo atitinkamų užduočių (ciklo iteracijų, kodo fragmentų/sekcijų) paskirstymo būdą tarp sritį vykdančių gijų. Iškviestos nelygiagrečioje srityje (dirba tik viena gija) jos yra ignoruojamos, t.y. jos pačios gijų nekuria!

OpenMP užduočių paskirstymo for direktyva #pragma omp for [clause [clause] ] new-line for-loop Lygiagrečiąją sritį vykdančios gijos lygiagrečiai atlieka ciklo iteracijas. Iteracijų paskirstymo būdą nusako parametras schedule. Argumentai [clause]: schedule(kind[, chunk_size]) private(list) firstprivate(list) lastprivate(list) reduction(operator: list) ordered nowait

OpenMP užduočių paskirstymo for direktyva Pavyzdys. c a b Nuoseklus kodas Išlygiagretinimas tik su OpenMP lygiagrečiosios srities direktyva: examples/openmp/ openmp_for_1.cpp for(int i=0; i<n; i++) { c[i] = a[i] + b[i]; #pragma omp parallel { int id = omp_get_thread_num(); int Nthrds = omp_get_num_threads(); int istart = id * N / Nthrds; int iend = (id+1) * N / Nthrds; for(int i=istart; i<iend; i++) c[i]=a[i]+b[i]; Su OpenMP lygiagrečiosios srities ir ciklo paskirstymo for direktyvomis #pragma omp parallel #pragma omp for schedule(static) for(i=0; i<n; i++) { c[i]=a[i]+b[i]; Pvz., examples/openmp/openmp_for_2.cpp

OpenMP for direktyva: schedule argumentas (clause) uschedule(static [,chunk]) Iteracijų blokai (po chunk iteracijų) statiškai (prieš ciklo vykdymą) cikliniu būdu paskirstomi tarp gijų. Kai bloko dydis (chunk) nenurodytas, imamas maksimalus Num_iterations / num_threads. Pvz., Num_iterations = 16, num_threads = 4 examples/openmp/ openmp_for_3.cpp uschedule(dynamic[,chunk]) Iteracijų blokai (po chunk iteracijų) dinamiškai (ciklo vykdymo metu) yra priskiriami atsilaisvinančioms (atlikusioms anksčiau priskirto bloko iteracijas) gijoms. Jei bloko dydis nenurodytas, jis imamas lygus vienetui. uschedule(guided[,chunk]) Mažėjantys iteracijų blokai yra dinamiškai priskiriami gijoms. Bloko dydis=max(number_iterations_remaining / num_threads, chunk). Pagal nutylėjimą: default chunk=1. uschedule(runtime) Programos vykdymo metų tvarkaraščio tipas (schedule) ir bloko dydis (chunk) yra paimami iš aplinkos kintamojo OMP_SCHEDULE (environment variable).

OpenMP for direktyva: schedule argumentas (clause) Kai argumentas schedule nenurodytas, pagal nutylėjimą naudojamas (default): schedule (static) Siekiant efektyvumo, vienas svarbiausių uždavinių sudarant lygiagrečiuosius algoritmus ir programas yra darbo subalansavimas tarp procesų (gijų) angl. load balancing. Pasirenkant iteracijų paskirstymo cikle tipą, reikia siekti kuo tolygesnio darbo padalinimo tarp gijų: Jei iteracijos yra vienodai sudėtingos, tai geriausiai tinka static paskirstymas. Jei kai kurios iteracijos reikalauja daugiau darbo (skaičiavimo laiko) negu kitos, tai reikia rinktis tarp dynamic ir guided paskirstymų.

OpenMP Reduction argumentas (examples/openmp/openmp_reduction.cpp) 1000 Panagrinėkime pavyzdį: Pridėkime OpenMP i 1 direktyvas: Ar viskas teisingai? Paleiskite keletą kartų. Kokio tipo (shared, private,...) turi būti kintamieji: ZZ? private(zz) sum? func( i) #define NT 2 void main () { double ZZ, func(), sum=0.0; #pragma omp parallel num_threads(nt) #pragma omp for for (int i=1; i< 1001; i++){ ZZ = func(i); sum = sum + ZZ; reduction (operatorius : list) Lygiagrečiosios srities užduočių paskirstymo (pvz. for) konstrukcijų viduje reduction tipo kintamajam: Kiekviena gija sukuria savo lokaliąją kintamojo kopiją ir ją inicializuoja priklausomai nuo operatoriaus (pvz., sumos operatoriui + pradinė reikšmė yra lygi 0). Konstrukcijos pabaigoje (pvz. lygiagretaus ciklo) lokaliosios gijų reikšmės yra surenkamos į vieną globaliąją reikšmę, naudojant nurodytą operatorių.

OpenMP: Reduction pavyzdys #include <omp.h> #define NUM_THREADS 4 void main () { double ZZ, func(), sum=0.0; #pragma omp parallel num_threads(num_threads) #pragma omp for reduction(+:sum) private(zz) for (int i=1; i< 1001; i++){ ZZ = func(i); sum = sum + ZZ; reduction (operatorius : list) Operatoriai C/C++ standarte: +, -, *, &,, ^, &&, Užduočių paskirstymo (pvz. for) direktyvos reduction kintamasis turi būti shared tipo prieš tai pradėtoje lygiagrečioje srityje ir negali būti joje privatizuotas.

OpenMP: užduočių paskirstymo sections direktyva #pragma omp sections [clause[[,] clause]...] new-line { #pragma omp section new-line structured-block #pragma omp section new-line structured-block... Lygiagrečiąją sritį vykdančios gijos lygiagrečiai atlieka skirtingas sekcijas (struktūrinius blokus). Kiekviena sekcija bus atlikta tik vieną kartą vienos iš grupės gijų. Argumentai [clause]: private(list) firstprivate(list) lastprivate(list) reduction(operator: list) nowait

OpenMP sections direktyva Gerai tinka funkciniam lygiagretumui (functional parallelism) realizuoti. Pavyzdys. examples/openmp/openmp_sections.cpp #pragma omp parallel #pragma omp sections { #pragma omp section Function_1(); #pragma omp section Function_2(); #pragma omp section Function_3(); #pragma omp parallel { #pragma omp sections { #pragma omp section { for (int i=0; i<n; i++) c[i] = a[i] + b[i]; #pragma omp section for (int i=0; i<n; i++) d[i] = a[i] * b[i]; /*-- End of sections --*/ /*-- End of parallel region --*/ Jeigu sekcijų yra mažiau nei gijų, tai atitinkamos gijos lieka be darbo.

OpenMP užduočių paskirstymo single direktyva #pragma omp single [clause[[,] clause]...] new-line structured-block Jei lygiagrečioje srityje reikia nurodyti struktūrinį bloką, kuris būtų įvykdytas tik vieną kartą, t.y. tik vienos (nesvarbu kokios) gijos, tai galime padaryti su single direktyva. Pirmoji gija, kuri vykdydama lygiagrečiąją sritį pasieks šią direktyvą, imsis vykdyti nurodytą struktūrinį bloką, o kitos gijos jį praleis ir lauks konstrukcijos pabaigoje (jei nenurodytas argumentas nowait). Argumentai [clause]: private(list) firstprivate(list) copyprivate(list) nowait

OpenMP single direktyva. Pavyzdys. #pragma omp parallel { int id = omp_get_thread_num(); atlikti_lyg_skaiciavimus1(id); #pragma omp single { skaiciuoti_viena_karta(); atlikti_lyg_skaiciavimus2(id); Pažiūrėkite pavyzdį examples/openmp/openmp_single.cpp. Atkreipkite dėmesį į panašumus ir skirtumus su OpenMP master direktyva.

OpenMP direktyvų sutrumpinimai (short-cuts) Siekiant minimizuoti papildomą lygiagretųjį kodą, OpenMP standartas leidžia apjungti lygiagrečiosios srities ir iškart toliau sekančią for (arba sections) direktyvą į vieną direktyvą: #pragma omp parallel #pragma omp for for (...) #pragma omp parallel for for (...) #pragma omp parallel #pragma omp sections {... #pragma omp parallel sections {... Pastaba: šiuos sutrumpinimus galime taikyti, kai lygiagrečioji sritis sudaryta tik iš lygiagretaus ciklo (arba lygiagrečiųjų sekcijų).