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

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

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

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

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

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

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

Operační systémy. Přednáška 4: Komunikace mezi procesy

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

Paralelní programování

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

Pavel Procházka. 3. prosince 2014

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

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

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

Procesy a vlákna - synchronizace

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

Principy operačních systémů. Lekce 6: Synchronizace procesů

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

Paralelní programování

Paralelní programování

Úvod do OpenMP. Jiří Fürst

Procesy a vlákna (Processes and Threads)

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

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

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

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

Paralelní programování

Spuštění instalace. nastavení boot z cd v BIOSu vložení CD s instal. médiem spuštění PC. nastavení parametrů instalace (F2 čěština)

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

Synchronizace Mgr. Josef Horálek

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

Paralelní programování

Paralelní architektury se sdílenou pamětí

Management procesu I Mgr. Josef Horálek

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

Paralelní architektury se sdílenou pamětí

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

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

Struktura programu v době běhu

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

Ukázka zkouškové písemka OSY

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

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

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

Paralelní a asynchronní programování. Zdeněk Jurka

Základní operace. Prefix sum. Segmentovaný prefix-sum

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

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

Domácí úkoly 2013/14

Procesy a vlákna IPC Komunikace mezi procesy (IPC = Inter-Process Communication)

Služba ve Windows. Služba (service) je program

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

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

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

map, multimap - Asociativní pole v C++.

Pokročilé architektury počítačů

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

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

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

Digitální učební materiál

Reaktivní programování v.net

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

Více o konstruktorech a destruktorech

PB přednáška (23. listopadu 2015)

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Paralelní programování

Vector datový kontejner v C++.

30. Vlákna, jejich atributy, metody, organizace a stavy. Možnosti synchronizace. (A7B36PVJ)

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

UNIVERZITA OBRANY. Knihovna HLAGate. Programátorská dokumentace. Petr Františ

4. Úvod do paralelismu, metody paralelizace

setup() { I = 0; } loop() { I = I + 1; }

Optimalizace. Optimalizace. Profilování. Gprof. Gcov. Oprofile. Callgrind. Intel Vtune. AMD CodeAnalyst

1 Nejkratší cesta grafem

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

Konstruktory a destruktory

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

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

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

Základy programování (IZP)

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

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Množina čísel int stl-set-int.cpp

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

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

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Šablony, kontejnery a iterátory

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Motivace. Software. Literatura a odkazy

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

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

Šablony, kontejnery a iterátory

Základy C++ I. Jan Hnilica Počítačové modelování 18

Vlákna Co je to vlákno?

Jazyk C# (seminář 6)

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Transkript:

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

Minulé cvičení: Paralelizace nám může pomoct... 1

Minulé cvičení: Paralelizace nám může pomoct... B4B36PDV: Ale ne všechny přístupy vedou ke stejně dobrým výsledkům! 1

Minulé cvičení: Paralelizace nám může pomoct... B4B36PDV: Ale ne všechny přístupy vedou ke stejně dobrým výsledkům! Dnešní menu: Vlákna a jejich synchronizace 1

Osnova Opakování z minulého cvičení Vlákna v C++ 11 Přístup ke sdílené paměti a synchronizace Zadání první domácí úlohy 2

http://goo.gl/a6bemb 2

Šifra PDVCrypt Vzpomeňte si na šifru z minulého cvičení s: Q R B F Y E L S I I E Jeden krok dešifrování: [ EQRBF {}}{ ] s i s i + p 1 secret( s [i 2..i+2] ) mod Σ [ ] i i + p 2 secret(s [i 2..i+2] ) mod s... opakován N-krát i PDVCrypt.cpp, decrypt.cpp / make decrypt decrypt_data.zip 3

Šifra PDVCrypt Jak vypadala paralelizace v OpenMP? void decrypt_openmp(const PDVCrypt &crypt, std::vector<std::pair<std::string, enc_params>> &encrypted, unsigned int numthreads) { const unsigned long size = encrypted.size(); } #pragma omp parallel for num_threads(numthreads) for(unsigned long i = 0 ; i < size ; i++) { auto & enc = encrypted[i]; crypt.decrypt(enc.first, enc.second); } decryption.cpp, benchmark.cpp, PDVCrypt.cpp / make benchmark 4

Šifra PDVCrypt #pragma omp parallel for num_threads(numthreads) for(...) {... } Co se ve skutečnosti stalo? 5

Vlákna v C++ 11

C++11 (přes #include <thread>) poskytuje multiplatformní přístup k práci s vlákny: #include <iostream> #include <thread> void dummy_thread(int id, int n) { std::cout << "Thread " << id << " prints " << n << "\n"; } int main() { std::thread t1(dummy_thread, 1, 2); std::thread t2(dummy_thread, 2, 42); t1.join(); t2.join(); } return 0; 6

Kompaktnější zápis pomocí lambda funkcí #include <iostream> #include <thread> void dummy_thread(int id, int n) { std::cout << "Thread " << id << " prints " << n << "\n"; } std::thread t1(dummy_thread, 1, 2); std::thread t2([&] (int id, int n) { std::cout << "Thread " << id << " prints " << n << "\n"; }, 2, 42); Lambda funkce (uvozená pomocí [&]) má navíc přístup ke všem lokálním proměnným. Nemusíme si je tak předávat například pointery na lokální proměnné jako argumenty, pokud s nimi chceme pracovat 7

Vyřešte úlohu pomocí vláken Doimplementujte tělo metody decrypt_threads_1 v souboru decryption.cpp. Spusťte numthreads vláken, kdy každé vlákno bude vykonávat funkci process. decryption.cpp, benchmark.cpp, PDVCrypt.cpp / make benchmark 8

Vyřešte úlohu pomocí vláken Doimplementujte tělo metody decrypt_threads_1 v souboru decryption.cpp. Spusťte numthreads vláken, kdy každé vlákno bude vykonávat funkci process. Co je na této implementaci špatně? decryption.cpp, benchmark.cpp, PDVCrypt.cpp / make benchmark 8

Synchronizace vláken při přístupu ke sdílené paměti

Varianta opravy č.1: Mutex Mutex nám umožňuje zabránit více vláknům využívat stejný zdroj současně. Mutex vlastní vždy pouze jedno vlákno a ostatní vlákna musí čekat (mutex = mutually-exclusive) 9

Varianta opravy č.1: Mutex Mutex nám umožňuje zabránit více vláknům využívat stejný zdroj současně. Mutex vlastní vždy pouze jedno vlákno a ostatní vlákna musí čekat (mutex = mutually-exclusive) Můžeme tak naimplementovat kritickou sekci, kam může vstoupit jediné vlákno. V této sekci: Zjistíme index, který máme zpracovat Inkrementujeme hodnotu i 9

Varianta opravy č.1: Mutex Mutex nám umožňuje zabránit více vláknům využívat stejný zdroj současně. Mutex vlastní vždy pouze jedno vlákno a ostatní vlákna musí čekat (mutex = mutually-exclusive) Můžeme tak naimplementovat kritickou sekci, kam může vstoupit jediné vlákno. V této sekci: Zjistíme index, který máme zpracovat Inkrementujeme hodnotu i #include <iostream> #include <thread> #include <mutex> std::mutex m; void dummy_thread() { std::cout << "Zde muze byt soucasne vice vlaken." << std::endl; { std::unique_lock<std::mutex> lock(m); std::cout << "Ale zde budu uplne sam..." << std::endl; } std::cout << "A tady opet nemusim byt sam..."; } 9

Varianta opravy č.1: Mutex Doplňte mutex Opravte metodu decrypt_threads_1 za použití mutexu. Metodu decrypt_threads_1 neupravujte, opravený kód zapište do metody decrypt_threads_2. decryption.cpp, benchmark.cpp, PDVCrypt.cpp / make benchmark 10

Varianta opravy č.1: Mutex Pozor! Použití mutexů skrývá hrozbu dead-locků. Kód musíme navrhovat tak, aby bylo garantované, že vlákno někdy mutex získá (a provede tak kritickou sekci). Jinak zůstane čekat navěky... 11

Varianta opravy č.2: Atomická proměnná Pokud nám stačí v rámci kritické sekce provést jednu operaci nad jednou proměnnou, můžeme si vystačit s atomickou operací. Příklady atomických operací: Inkrementování proměnné typu int Vynásobení proměnné typu int konstantou 12

Varianta opravy č.2: Atomická proměnná Pokud nám stačí v rámci kritické sekce provést jednu operaci nad jednou proměnnou, můžeme si vystačit s atomickou operací. Příklady atomických operací: Inkrementování proměnné typu int Vynásobení proměnné typu int konstantou Jak na to v C++11: #include <atomic> int x = 0; std::atomic<int> x { 0 }; 12

Varianta opravy č.2: Atomická proměnná Nahraďte mutex atomickou proměnnou Nahraďte mutex v decrypt_threads_2 atomickou proměnnou. Nový kód zapište do funkce decrypt_threads_3. decryption.cpp, benchmark.cpp, PDVCrypt.cpp / make benchmark 13

Varianta opravy č.2: Atomická proměnná Mutex vs. Atomická proměnná Mutex je založený na systémovém volání jádra operačního systému To může být ale drahé! 14

Varianta opravy č.2: Atomická proměnná Mutex vs. Atomická proměnná Mutex je založený na systémovém volání jádra operačního systému To může být ale drahé! Atomická proměnná je (většinou) implementovaná na hardwarové úrovni Speciální instrukce pro atomické operace nad některými typy 14

Varianta opravy č.2: Atomická proměnná Mutex vs. Atomická proměnná Mutex je založený na systémovém volání jádra operačního systému To může být ale drahé! Atomická proměnná je (většinou) implementovaná na hardwarové úrovni Speciální instrukce pro atomické operace nad některými typy Nelze použít vždy! Procesory zpravidla podoporují jenom základní typy. 14

Varianta opravy č.3: Disjunktní rozsahy I atomická proměnná má ale nějakou režii... Nemůžeme se vyhnout použití mutexů a atomických proměnných úplně? 15

Varianta opravy č.3: Disjunktní rozsahy I atomická proměnná má ale nějakou režii... Nemůžeme se vyhnout použití mutexů a atomických proměnných úplně? Doplňte logiku výpočtu rozsahů Ve funkci decrypt_threads_4 chybí implementace výpočtu rozsahu t-tého vlákna. Doplňte výpočet hodnot proměnných begin a end. 15

Podmínkové proměnné

Jaký je problém následujícího kódu? void logger() { bool last_value = true; while(true) { std::unique_lock<std::mutex> lock(m); if(last_value!= value) { std::cout << "Value changed to " << value << std::endl; last_value = value; } } } condition_variable.cpp / make condition_variable 16

Jaký je problém následujícího kódu? void logger() { bool last_value = true; while(true) { std::unique_lock<std::mutex> lock(m); if(last_value!= value) { std::cout << "Value changed to " << value << std::endl; last_value = value; } } } Vlákno které čeká na splnění podmínky vytěžuje procesor (tzv. busy waiting)! condition_variable.cpp / make condition_variable 16

Podmínkové proměnné Podmínkové proměnné (#include <condition_variable>) slouží ke komunikaci mezi vlákny Umožňují nám čekat na splnění podmínky jiným vláknem (a na signál od něj) condition_variable.cpp / make condition_variable 17

Podmínkové proměnné Podmínkové proměnné (#include <condition_variable>) slouží ke komunikaci mezi vlákny Umožňují nám čekat na splnění podmínky jiným vláknem (a na signál od něj) Vytvoření podmínkové proměnné: std::condition_variable cv; condition_variable.cpp / make condition_variable 17

Podmínkové proměnné Podmínkové proměnné (#include <condition_variable>) slouží ke komunikaci mezi vlákny Umožňují nám čekat na splnění podmínky jiným vláknem (a na signál od něj) Vytvoření podmínkové proměnné: std::condition_variable cv; Čekání na splnění podmínky: cv.wait(lock, [&] { return value!= last_value; }); condition_variable.cpp / make condition_variable 17

Podmínkové proměnné Podmínkové proměnné (#include <condition_variable>) slouží ke komunikaci mezi vlákny Umožňují nám čekat na splnění podmínky jiným vláknem (a na signál od něj) Vytvoření podmínkové proměnné: std::condition_variable cv; Čekání na splnění podmínky: cv.wait(lock, [&] { return value!= last_value; }); Notifikace o změně stavu: cv.notify_one(); cv.notify_all(); condition_variable.cpp / make condition_variable 17

Zadání první domácí úlohy

Producent konzument Producent vyrábí určitá data a vkládá je do fronty Konzument je zase z fronty odebírá Každý pracuje svým tempem main.cpp, ThreadPool.h / make threadpool hw01_threadpool.zip 18

Producent konzument Producent vyrábí určitá data a vkládá je do fronty Konzument je zase z fronty odebírá Každý pracuje svým tempem Proč bychom něco takového chtěli dělat? main.cpp, ThreadPool.h / make threadpool hw01_threadpool.zip 18

Producent konzument Doimplementujte metody v ThreadPool.h a zajistěte, že 1. Výpočet úloh je paralelní a každá úloha (přidaná pomocí metody process) je zpracována právě jednou (1 bod) 2. Thread pool nečeká na přidání nových úloh pomocí busy-waitingu (1 bod) main.cpp, ThreadPool.h / make threadpool hw01_threadpool.zip 19

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