Paralelní a distribuované výpočty (B4B36PDV)
|
|
- Zdenka Ševčíková
- před 5 lety
- Počet zobrazení:
Transkript
1 Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech Technical University in Prague
2 Dnešní přednáška Motivace
3 Dnešní přednáška Nástroje
4 Dnešní přednáška Vlákna
5 Vlákna úvod, spuštění V C++11 (a dalších) V rámci C++ exportovány hlavičkou <thread> std::thread první argument je funkce, kterou bude vlákno vykonávat ostatní argumenty jsou argumenty dané funkce #include <iostream> #include <thread> #include <vector> const int thread_count = 10; void Hello(long my_rank); void Hello(long my_rank) { std::cout << "Hello from thread " << my_rank << " of " << thread_count << std::endl; int main(int argc, char* argv[]) { std::vector<std::thread> threads; for (int thread=0; thread < thread_count; thread++) { threads.push_back(std::thread(hello, thread)); std::cout << "Hello from the main thread\n"; for (int thread=0; thread < thread_count; thread++) { threads[thread].join(); return 0;
6 Vlákna - ukončení V rámci C++ exportovány hlavičkou <thread> std::thread hlavní vlákno musí zavolat buď metodu join případně detach
7 Přístup ke sdílené paměti Synchronizace vláken Při současném přístupu ke sdílené proměnné může dojít k uspořádání provedených instrukcí vedoucích k nesprávnému ( jinému než očekávanému) výsledku Příklad vyváříme histogram zbytků po dělení čísel: void hist(std::vector<int>& vector, int thread, std::vector<int>& histogram) { std::vector<int> local(parts); for (int i=thread; i<size; i += thread_count) { local[vector[i] % PARTS]++; for (int i=0; i<parts; i++) { histogram[i] += local[i];
8 Přístup ke sdílené paměti Synchronizace vláken Při současném přístupu ke sdílené proměnné může dojít k uspořádání provedených instrukcí vedoucích k nesprávnému ( jinému než očekávanému) výsledku Příklad vyváříme histogram zbytků po dělení čísel: void hist(std::vector<int>& vector, int thread, std::vector<int>& histogram) { std::vector<int> local(parts); for (int i=thread; i<size; i += thread_count) { local[vector[i] % PARTS]++; for (int i=0; i<parts; i++) { histogram[i] += local[i]; std::thread předá referenci pomocí std::ref(histogram)
9 Přístup ke sdílené paměti Synchronizace vláken - zámky Při současném přístupu ke sdílené proměnné může dojít k uspořádání provedených instrukcí vedoucích k nesprávnému ( jinému než očekávanému) výsledku Příklad vyváříme histogram zbytků po dělení čísel: Mutex naivní řešení std::mutex hist_mutex; void hist(std::vector<int>& vector, int thread, std::vector<int>& histogram) { std::vector<int> local(parts); for (int i=thread; i<size; i += thread_count) { local[vector[i] % PARTS]++; hist_mutex.lock(); for (int i=0; i<parts; i++) { histogram[i] += local[i]; hist_mutex.unlock();
10 Přístup ke sdílené paměti Synchronizace vláken - zámky Při současném přístupu ke sdílené proměnné může dojít k uspořádání provedených instrukcí vedoucích k nesprávnému ( jinému než očekávanému) výsledku Příklad vyváříme histogram zbytků po dělení čísel: Mutex trochu lepší řešení std::vector<std::mutex> hist_part_mutex(parts); void hist(std::vector<int>& vector, int thread, std::vector<int>& histogram) { std::vector<int> local(parts); for (int i=thread; i<size; i += thread_count) { local[vector[i] % PARTS]++; for (int i=0; i<parts; i++) { hist_part_mutex[i].lock(); histogram[i] += local[i]; hist_part_mutex[i].unlock();
11 Přístup k více proměnným Co když potřebujeme výlučný přístup ke dvěma (nebo více) proměnným např. chci mezivýsledek z operací, které se provádějí zamknu 1., zamknu 2.
12 Přístup k více proměnným Co když potřebujeme výlučný přístup ke dvěma (nebo více) proměnným např. chci mezivýsledek z operací, které se provádějí zamknu 1., zamknu 2. možný deadlock!
13 Přístup k více proměnným Co když potřebujeme výlučný přístup ke dvěma (nebo více) proměnným např. chci mezivýsledek z operací, které se provádějí zamknu 1., zamknu 2. možný deadlock! musíme zamknout oba zámky současně void thread_operation(){ std::lock(mutex1,mutex2);... complicated_task();... mutex1.unlock(); mutex2.unlock();
14 Deadlock Deadlocky mohou vzniknout pokud: 1. Každý zámek může vlastnit maximálně jedno vlákno 2. Vlákno aktuálně vlastní (má zamčený) alespoň jeden zámek a požaduje zamknout alespoň jeden další 3. Není možné odebrat vlastnictví zámku 4. Existuje cyklická závislost mezi vlákny Deadlock vznikne velice snadno
15 Deadlock Deadlocky mohou vzniknout pokud: 1. Každý zámek může vlastnit maximálně jedno vlákno 2. Vlákno aktuálně vlastní (má zamčený) alespoň jeden zámek a požaduje zamknout alespoň jeden další 3. Není možné odebrat vlastnictví zámku 4. Existuje cyklická závislost mezi vlákny Deadlock vznikne velice snadno
16 Odemykání zámků Zamknuté zámky je dobré odemykat A co v případě výjimky? Musíme zajistit odemknutí při všech možných ukončeních void operation(){ mutex.lock(); try {... complicated_task();... catch (std::string e){ mutex.unlock(); throw e; mutex.unlock();
17 Automatická správa zámků Lock_guard mutex RAII správa zámků Konstruktor automaticky volá lock() na zámku, destruktor zámek odemyká void operation(){ std::lock_guard<std::mutex> guard(mutex); try {... complicated_task();... catch (std::string e){ throw e; A co když chceme mít v lock_guard 2 zámky?
18 Automatická správa zámků Vícero proměnných Lock_guard mutex Konstruktor automaticky volá lock() na zámku, destruktor zámek odemyká A co když chceme mít v lock_guard 2 zámky? std::mutex m1; std::mutex m2; void f(int id) { std::lock(m1, m2); std::lock_guard<std::mutex> lock1(m1, std::adopt_lock); std::lock_guard<std::mutex> lock2(m2, std::adopt_lock); std::cout << "Thread " << id << " says hi." << std::endl; // we do not need to unlock int main(int argc, char* argv[]) { std::thread t1(f, 1); std::thread t2(f, 2); t1.join(); t2.join();
19 Časově omezené čekání Pokud nechceme, aby se vlákno při pokusu o zamknutí zámku zablokovalo, můžeme využít časově omezených metod časové zámky (timed_mutex) std::timed_mutex m; const int THREADS = 10; const std::chrono::milliseconds timeout(100); const std::chrono::milliseconds timeout2(20); void f(int id) { if (m.try_lock_for(timeout)) { std::cout << "Thread " << id << " is computing stuff." << std::endl; std::this_thread::sleep_for(timeout2); m.unlock(); else { std::cout << "Thread " << id << " is skipping." << std::endl; int main(int argc, char* argv[]) { std::vector<std::thread> threads; for (int i=0; i<threads; i++) threads.push_back(std::thread(f, i)); for (int i=0; i<threads; i++) threads[i].join();
20 Opakované zamykání Co když už máme naimplementovaných několik thread-safe metod, které bychom chtěli zavolat z jiné thread-safe metody? Mějme operace nad prvky matice add, divide void add_number(std::vector<std::vector<int>>& matrix, int row, int column, int value) { std::lock_guard<std::mutex> l(mutexes[row][column]); matrix[row][column] += value; void divide_by_number(std::vector<std::vector<int>>& matrix, int row, int column, int value) { std::lock_guard<std::mutex> l(mutexes[row][column]); matrix[row][column] = matrix[row][column] / value; Když bychom měli jinou metody, která tyto metody volá, zámky již budou zamknuté
21 Opakované zamykání Co když už máme naimplementovaných několik thread-safe metod, které bychom chtěli zavolat z jiné thread-safe metody? Mějme operace nad prvky matice add, divide void add_number(std::vector<std::vector<int>>& matrix, int row, int column, int value) { std::lock_guard<std::mutex> l(mutexes[row][column]); matrix[row][column] += value; void divide_by_number(std::vector<std::vector<int>>& matrix, int row, int column, int value) { std::lock_guard<std::mutex> l(mutexes[row][column]); matrix[row][column] = matrix[row][column] / value; Když bychom měli jinou metody, která tyto metody volá, zámky již budou zamknuté Můžeme použít recursive_mutex
22 Recursive Lock recurisve_lock void add_number(std::vector<std::vector<int>>& matrix, int row, int column, int value) { std::lock_guard<std::recursive_mutex> l(mutexes[row][column]); matrix[row][column] += value; void divide_by_number(std::vector<std::vector<int>>& matrix, int row, int column, int value) { std::lock_guard<std::recursive_mutex> l(mutexes[row][column]); matrix[row][column] = matrix[row][column] / value; //there is a one dimension padding in the matrix so that we do not need to check boundaries void average_with_neighbours(std::vector<std::vector<int>>& matrix, int row, int column) { std::lock(mutexes[row][column-1],mutexes[row][column],mutexes[row][column+1],mutexes[row- 1][column],mutexes[row+1][column]); std::cout << "thread is averaging " << row << "," << column << " old_value: " << matrix[row][column]; int v = (matrix[row][column-1] + matrix[row][column+1] + matrix[row-1][column] + matrix[row+1][column])/8; divide_by_number(matrix,row,column,2); add_number(matrix,row,column,v); std::cout << " new_value: " << matrix[row][column] << std::endl; for (int i=-1;i<=1;i++) for (int j=-1; j<=1; j++) { if (i*j!= 0) continue; mutexes[row+i][column+j].unlock();
23 Atomické proměnné Zámky znamenají práci navíc Někdy není nutné je použít Atomické proměnné umožňují provedení atomických operací, limitují možné optimalizace kompilátoru umožňují základní operace bez zámků typicky rychlejší atomic<type> (např. atomic<int> (=atomic_int), ) Vraťme se k histogramu void hist_atomic(std::vector<int>& vector, int thread, std::vector<std::atomic_int>& histogram) { std::vector<int> local(parts); for (int i=thread; i<size; i += thread_count) { local[vector[i] % PARTS]++; for (int i=0; i<parts; i++) { histogram[i] += local[i]; při současném přístupu k vícero proměnným musíme použít zámky
24 Zpracování výsledků z jiných vláken Při inicializaci přes std::thread, vlákna nic nevracejí dílčí výsledky jsou předávané přes sdílené proměnné Co když chceme vytvořit několik vláken pro pomocné úkoly a jejich výsledky zpracovat? struktura future a metoda std::async #include <thread> #include <future> #include <iostream> int foo() { std::cout << "I'm a thread" << std::endl; return 42; int main(){ auto future = std::async(std::launch::async, foo); std::cout << future.get(); return 0; future.get() blokuje aktivní vlákno a čeká na výsledek lze volat pouze jednou future.wait() čeká, ale nezkonzumuje výsledek
25 Zpracování výsledků z jiných vláken (2) Destruktor std::future vytvořené pomocí std::async je blokující std::async(std::launch::async, foo); std::async(std::launch::async, foo2); funkce foo2 se spustí pouze po skončení vlákna s metodou foo pokud v metodě zavoláme auto future = std::async(std::launch::async, foo); při ukončení metody se bude čekat na ukončení vláken
26 Zpracování výsledků z jiných vláken (2) Destruktor std::future vytvořené pomocí std::async je blokující std::async(std::launch::async, foo); std::async(std::launch::async, foo2); funkce foo2 se spustí pouze po skončení vlákna s metodou foo pokud v metodě zavoláme auto future = std::async(std::launch::async, foo); při ukončení metody se bude čekat na ukončení vláken Futures také umožňují časově-omezené čekání na výsledek Má smysl pokud hlavní vlákno aktivně pracuje a průběžně kontroluje dostupnost dílčích výsledků z asynchronně puštěných vláken
27 Zpracování výsledků z jiných vláken (3) Futures také umožňují časově-omezené čekání na výsledek #include <thread> #include <future> #include <iostream> #include <chrono> int function(int duration) { std::this_thread::sleep_for(std::chrono::seconds(duration)); return duration*4-2; int main(){ auto f1 = std::async(std::launch::async, function, 5); auto f2 = std::async(std::launch::async, function, 3); auto timeout = std::chrono::nanoseconds(10); while(f1.valid() f2.valid()){ if(f1.valid() && f1.wait_for(timeout) == std::future_status::ready){ std::cout << "Task1 is done with result " << f1.get() << std::endl; if(f2.valid() && f2.wait_for(timeout) == std::future_status::ready){ std::cout << "Task2 is done with result " << f2.get() << std::endl; std::cout << "Work in the main thread." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); return 0;
28 Podmínkové proměnné Podmínkové proměnné (Condition variables) slouží ke komunikaci mezi vlákny např. vlákno chce předat zprávu dílčí výsledek je již připraven typický příklad fronta úkolů ke zpracování (Producer-Consumer) 1 (nebo víc) vlákno generuje úkoly další vlákna je zpracovávají zpracovávající vlákna musí dostat notifikaci o tom, že další úkol je připraven ke zpracování podmíněná proměnná navázaná na zámek fronty úkolů nechť má fronta úkolů omezenou velikost (např. aby nám nepřetekla paměť) čekající vlákno je notifikováno metodou notify_one() (případně notify_all())
29 Podmínkové proměnné int front = 0; int rear = 0; int count = 0; std::vector<std::pair<int,int>> buffer; std::mutex lock; std::condition_variable not_full; std::condition_variable not_empty; void add_task(int row, int column){ std::unique_lock<std::mutex> l(lock); not_full.wait(l, [this](){return count!= MAXPOOL; ); buffer[rear] = std::pair<int,int>(row,column); rear = (rear + 1) % MAXPOOL; count++; l.unlock(); not_empty.notify_one(); std::tuple<int,int,int> execute_task(){ std::unique_lock<std::mutex> l(lock); not_empty.wait(l, [this](){return count!= 0; ); std::pair<int,int> square = buffer[front]; front = (front + 1) % MAXPOOL; count--; l.unlock(); not_full.notify_one(); int result = average_with_neighbours(*matrix, square.first, square.second); return std::tuple<int,int,int>(result,square.first,square.second);
30 Budoucnost V C++17 (a dalších) Další změny a podpora paralelismu v C++17 (finální standard schválen v prosinci 2017) Parallel versions of STL algorithms
Vlákna. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Aleš Hrabalík a Martin Hořeňovský, 2016
Vlákna Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Aleš Hrabalík a Martin Hořeňovský, 2016 Programování v C++, A7B36PJC 09/2015, Lekce 12 https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start
C++ 0x aka C++11. Základním kamenem je třída std::thread
C++ 0x aka C++11 Jako jiné jazyky, např. Free/Object Pascal, se C++ ve standardu ++0x dočkal podpory vláken Výhodou je, že standardní knihovna je platformě nezávislá na úrovni zdrojového kódu Základním
Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty
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
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
ZOS 9. cvičení, ukázky kódu. Pavel Bžoch
ZOS 9. cvičení, ukázky kódu Pavel Bžoch Obsah Komunikace mezi procesy Atomické operace TSL a CAS Zámky Semafory Semafory vypsání věty Monitor Bariéra pomocí monitoru Implementace semaforu pomocí monitoru
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
PROGRAMOVÁNÍ V C++ CVIČENÍ
PROGRAMOVÁNÍ V C++ CVIČENÍ INFORMACE Michal Brabec http://www.ksi.mff.cuni.cz/ http://www.ksi.mff.cuni.cz/~brabec/ brabec@ksi.mff.cuni.cz gmichal.brabec@gmail.com PODMÍNKY ZÁPOČTU Základní podmínky společné
Pavel Procházka. 3. prosince 2014
Jazyk C# (seminář 11) Pavel Procházka KMI 3. prosince 2014 Motivace Dnes už se prakticky nedělají jednojádrové procesory pokud potřebujeme výkon, musíme zapojit všechna jádra Často potřebujeme dělat více
Vector datový kontejner v C++.
Vector datový kontejner v C++. Jedná se o datový kontejner z knihovny STL jazyka C++. Vektor je šablona jednorozměrného pole. Na rozdíl od "klasického" pole má vector, mnoho užitečných vlastností a služeb.
<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************
zdroje/zdroje.xml
map, multimap - Asociativní pole v C++.
map, multimap - Asociativní pole v C++. Jedná se o asociativní pole. V asociativním poli jsou uloženy hodnoty ve tvaru (klíč,hodnota), kde klíč je vlastně "index" prvku. Klíčem může být libovolný objekt,
PB161 Programování v jazyce C++ Přednáška 8
.. PB161 Programování v jazyce C++ Přednáška 8 Výjimky Správa prostředků (RAII) Nikola Beneš 9. listopadu 2015 PB161 přednáška 8: výjimky, RAII 9. listopadu 2015 1 / 24 . PB161 přednáška 8: výjimky, RAII
Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost
Singleton Singleton obsah Motivace Základní myšlenka Implementace Problémy destrukce vícevláknovost Dědičnost Obecná implementace Shrnutí Singleton motivace Co mají následující příklady společného? DatabaseConnectionPool
Řada programovacích jazyků nabízí prostředky pro řešení meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce.
Operační systémy Tomáš Hudec 7 Prostředky programovacích jazyků pro IPC Obsah: 7.1 Monitor, 7.1.1 Použití monitoru pro řízení přístupu do kritické sekce, 7.1.2 Použití monitoru pro synchronizaci, 7.1.3
Jazyk C++ II. Výjimky
Jazyk C++ II Výjimky AR 2013/2014 Jazyk C++ II Funkce abort Dříve byl obvyklý způsob zavolat metodu abort(). Metoda provádí okamžitě: Vyprázdnění vyrovnávací paměti, Ukončení celého programu, Vrátí číslo
PB161 Programování v jazyce C++ Přednáška 10
.. PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 23. listopadu 2015 PB161 přednáška 10: šablony 23. listopadu 2015 1 / 29 K zamyšlení Jaký je rozdíl mezi new int[10] a new int[10]()?
Ukazatele, dynamická alokace
Ukazatele, dynamická alokace Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Mazanec Karel Richta,
x86 assembler and inline assembler in GCC
x86 assembler and inline assembler in GCC Michal Sojka sojkam1@fel.cvut.cz ČVUT, FEL License: CC-BY-SA 4.0 Useful instructions mov moves data between registers and memory mov $1,%eax # move 1 to register
Paralelní programování
Paralelní programování přednášky Jan Outrata únor duben 2011 Jan Outrata (KI UP) Paralelní programování únor duben 2011 1 / 16 Semafory Await synchronizace používající await běží na železe = využívají
Doporučené postupy. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze
Doporučené postupy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Hořeňovský, Aleš Hrabalík a Martin
Vláknové programování část III
Vláknové programování část III Lukáš Hejmánek, Petr Holub {xhejtman,hopet}@ics.muni.cz Laboratoř pokročilých síťových technologií PV192 2008 05 06 1/36 Přehled přednášky Další nástroje pro synchronizaci
PB161 Programování v jazyce C++ Přednáška 1
PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do C++ Nikola Beneš 18. září 2018 PB161 přednáška 1: organizace, úvod do C++ 18. září 2018 1 / 36 Cíle předmětu 1. ukázat možnosti jazyka C++
Přetěžování operátorů, dynamika objektů 2
Přetěžování operátorů, dynamika objektů 2 Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 03/2016, Lekce 6 https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start
Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.
Singleton Singleton obsah n Motivace n Základní myšlenka n Implementace n Problémy q destrukce q vícevláknovost n Dědičnost n Obecná implementace n Shrnutí Singleton motivace n Co mají následující příklady
Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016
Práce s knihovnami Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 04/2016, Lekce 7 https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start
Paralelní programování
Paralelní programování přednášky Jan Outrata únor duben 2011 Jan Outrata (KI UP) Paralelní programování únor duben 2011 1 / 17 Monitor Semafor vedle aktivní (čekací smyčka, busy-wait) i pasivní implementace
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161
PB161 Programování v jazyce C++ Přednáška 1
PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do C++ Nikola Beneš 18. září 2018 PB161 přednáška 1: organizace, úvod do C++ 18. září 2018 1 / 36 Cíle předmětu 1. ukázat možnosti jazyka C++
IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí
Velké projekty v C velký = 100ky a více řádek udržovatelnost, bezpečnost, přehlednost kódu rozdělení programu do více souborů další prvky globální proměnné, řízení viditelnosti proměnných, funkcí Globální
PB161 Programování v jazyce C++ Přednáška 10
PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 27. listopadu 2017 PB161 přednáška 10: šablony 27. listopadu 2017 1 / 33 Šablony PB161 přednáška 10: šablony 27. listopadu 2017 2 / 33
Více o konstruktorech a destruktorech
Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení
Domácí úkoly 2013/14
Domácí úkoly 2013/14 SIMD kontejner kontejner odpovídající poli s podporou SIMD operací Single Instruction Multiple Data simd_vector< T, S> T = logický prvek kontejneru pouze jednoduchý datový typ (bez
Paralelní programování
Paralelní programování cvičení Jan Outrata únor duben 2011 Jan Outrata (KI UP) Paralelní programování únor duben 2011 1 / 13 Cvičení 1 Jazyk C POSIX Threads (UNIX) hlavičkový soubor pthread.h, knihovna
Knihovny pro CUDA J. Sloup a I. Šimeček
Knihovny pro CUDA J. Sloup a I. Šimeček xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PRC, LS2010/11, Predn.10 Příprava studijního programu
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.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
Množina čísel int stl-set-int.cpp
Řetězce, pole a STL V C++ je výhodné pro práci s řetězci použít třídu string, funkce C jsou stále k dispozici cstring, ukazatele a pole lze stále používat stejně, jako v C, použití iterátorů a dalších
Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016
ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce
Funkční objekty v C++.
Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161
Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;
Cvičení 9 - Monitory na rozdíl od semaforů je monitor jazyková konstrukce monitor = Pascalský blok podobný proceduře nebo fci uvnitř monitoru jsou definovány proměnné, procedury a fce proměnné monitoru
Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.
Hrátky s funkcemi PV173 Programování v C++11 Vladimír Štill, Jiří Weiser Fakulta Informatiky, Masarykova Univerzita 29. září 2014 Hrátky s funkcemi PV173 29. září 2014 1 / 23 Úvod Na co se podíváme? předávání
Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu. 6.1.1 Obědvající filosofové
Operační systémy Tomáš Hudec 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu, 6.1.1 Obědvající filosofové, 6.1.2 Producenti a konzumenti, 6.1.3 Problém spících holičů, 6.1.4 Problém pisatelů
Operační systémy. Přednáška 4: Komunikace mezi procesy
Operační systémy Přednáška 4: Komunikace mezi procesy 1 Časově závislé chyby Dva nebo několik procesů používá (čte/zapisuje) společné sdílené prostředky (např. sdílená paměť, sdílení proměnné, sdílené
PB přednáška (23. listopadu 2015)
PB161 10. přednáška (23. listopadu 2015) Šablony Motivace snaha o co nejmenší duplikaci kódu co když máme kód, který chceme použít pro různé typy? generická funkce (maximum, minimum, swap, ) kontejnery
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné
PB071 Programování v jazyce C Jaro 2015
Programování v jazyce C Jaro 2015 Argumenty main(), Typový systém, Dynamická alokace Organizační Polosemestrální test Úterý 7. dubna v 10:00 a 11:00 v D1 20 bodů rozdíl mezi E a C Zdroj: http://www.bugemos.com/?node=342
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
Procesy, vlákna 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 Implementace vláken one-to-one o implementace na úrovni jádra o každé vlákno je pro
Operační systémy. Cvičení 4: Programování v C pod Unixem
Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné
Vláknové programování část VI
Vláknové programování část VI Lukáš Hejmánek, Petr Holub {xhejtman,hopet}@ics.muni.cz Laboratoř pokročilých síťových technologií PV192 2015 04 14 1/95 Vytváření vláken a procesů v Linuxu Vlákno vzniká
Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty
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
Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií
1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední
Programování bez vláken. OpenMP
Programování bez vláken Tradiční přístup je vytvoření vícevláknového programu, kde se řekne, co má které vlákno dělat Ale jde to i jinak, lze vytvořit program tak, že se řekne, co se má udělat paralelně
Programování v C++ 3, 3. cvičení
Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového
Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016
Preprocesor Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 4/2016, Lekce 9b https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start
Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody
Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro
Mělká a hluboká kopie
Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta
Procesy a vlákna - synchronizace
ÚVOD DO OPERAČNÍCH SYSTÉMŮ Ver.1.00 Procesy a vlákna - synchronizace České vysoké učení technické Fakulta elektrotechnická 2010 Studijní materiály a informace o předmětu http://measure.feld.cvut.cz/vyuka/predmety/bakalarske/navody
Ošetření chyb a výjimky
Ošetření chyb a výjimky Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2018 Programování v C++, B6B36PJC 11/2018, Lekce 9a https://cw.fel.cvut.cz/wiki/courses/b6b36pjc/start
přetížení operátorů (o)
přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - operátor je speciální
Zápis programu v jazyce C#
Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač
NG C Implementace plně rekurentní
NG C Implementace plně rekurentní neuronové sítě v systému Mathematica Zdeněk Buk, Miroslav Šnorek {bukz1 snorek}@fel.cvut.cz Neural Computing Group Department of Computer Science and Engineering, Faculty
Principy počítačů a operačních systémů
Principy počítačů a operačních systémů Operační systémy Synchronizace procesů, zablokování Zimní semestr 2011/2012 Přístup ke sdíleným datům Terminologie: souběžné vs. paralelní zpracování Paralelní provádění
Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března
Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.
Struktury, funkce, reference
Struktury, funkce, reference Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad a Martin Mazanec Karel Richta,
Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35
Úvod do paralelního programování 2 MPI Jakub Šístek Ústav technické matematiky FS 9.1.2007 ( Ústav technické matematiky FS ) 9.1.2007 1 / 35 Osnova 1 Opakování 2 Představení Message Passing Interface (MPI)
Paralelní architektury se sdílenou pamětí
Paralelní architektury se sdílenou pamětí Multiprocesory Multiprocesory se sdílenou pamětí SMP architektury Přístup do paměti OpenMP Multiprocesorové architektury I. Multiprocesor se skládá z několika
Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)
Příklad aplikace Klient/Server s Boss/Worker modelem (informativní) Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze A0B36PR2 Programování 2 Jan Faigl, 2015 A0B36PR2
IB111 Úvod do programování skrze Python Přednáška 7
IB111 Úvod do programování skrze Python Přednáška 7 Správa paměti (proměnné podrobněji) Práce se soubory Nikola Beneš 2. listopad 2016 IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016
Jakub Čermák jakub@jcermak.cz, http://www.jcermak.cz Microsoft Student Partner
Jakub Čermák jakub@jcermak.cz, http://www.jcermak.cz Microsoft Student Partner Co paralelizace přinese? Jak paralelizovat? Jak si ušetřit práci? Jak nedělat běžné paralelizační chyby? Race condition, deadlocky
PB161 Programování v jazyce C++ Přednáška 5
PB161 Programování v jazyce C++ Přednáška 5 Práce s pamětí Princip RAII Lehký úvod do výjimek Nikola Beneš 16. října 2018 PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října 2018 1
PB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting
Programování založené na posílání zpráv
Programování založené na posílání zpráv Standard MPI Standard pro posílání zpráv - MPI = Message Passing Interface Dostupné implementace OpenMPI - http://www.open-mpi.org/ LAM-MPI - http://www.lam-mpi.org/
Šablony, kontejnery a iterátory
11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array
Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15
Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové
PB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20
Programování v C++ 1, 5. cvičení
Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené
C++ objektově orientovaná nadstavba programovacího jazyka C
C++ objektově orientovaná nadstavba programovacího jazyka C (1. část) Josef Dobeš Katedra radioelektroniky (13137), blok B2, místnost 722 dobes@fel.cvut.cz 5. května 2014 České vysoké učení technické v
Paralelní architektury se sdílenou pamětí
Paralelní architektury se sdílenou pamětí Multiprocesory Multiprocesory se sdílenou pamětí SMP architektury Přístup do paměti OpenMP Multiprocesorové architektury I. Multiprocesor se skládá z několika
Množina v C++ (set, multiset).
Množina v C++ (set, multiset). Množina je datová struktura, ve které jsou uloženy nějaké prvky. V množině nesmí být dva stejné prvky. Naopak multimnožina může obsahovat i stejné prvky. Nad množinou lze
Základy programování (IZP)
Základy programování (IZP) Šesté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 6. týden
Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21
Stručný obsah 1. Hardware, procesory a vlákna... 19 2. Programování s ohledemna výkon... 45 3. Identifikování příležitostí pro paralelizmus... 93 4. Synchronizace a sdílení dat... 123 5. Vlákna v rozhraní
Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček
Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PRC, LS2010/11, Predn.2
Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.
Konec a tak PB173 Programování v C++11 Vladimír Štill, Jiří Weiser Fakulta Informatiky, Masarykova Univerzita 15. prosince 2014 Konec a tak PB173 15. prosince 2014 1 / 15 Náplň Perf constexpr initializer
Základní datové struktury
Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013
Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury
Paralelní architektury se sdílenou pamětí typu NUMA NUMA architektury Multiprocesorové systémy s distribuovanou pamětí I. úzkým hrdlem multiprocesorů se sdílenou pamětí je datová komunikace s rostoucím
IUJCE 07/08 Přednáška č. 1
Úvod do předmětu Literatura Záznamy přednášek a vaše poznámky Harbison, S. P., Steele, G. L.: Referenční příručka jazyka C Herout, P.: Učebnice jazyka C Kernighan, B. W., Ritchie, D. M.: The C Programming
Vícevláknové aplikace
Vícevláknové aplikace Jiří Vokřínek Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 7 B0B36PJV Programování v JAVA Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška
Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++ Proudy pro standardní vstup a výstup V jazyce C++ provádíme textový vstup a výstup prostřednictvím tzv. datových proudů Datové
Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze
Dynamika objektů Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský, Aleš Hrabalík,
Zpracoval: houzvjir@fel.cvut.cz
Zpracoval: houzvjir@fel.cvut.cz 10. Objektově orientované programování v C++. Přetěţování operátorů, generické funkce a třídy, výjimky, knihovny. (A7B36PJC) Obsah OOP v C++... 2 Pro připomenutí - Základní
Principy operačních systémů. Lekce 6: Synchronizace procesů
Principy operačních systémů Lekce 6: Synchronizace procesů Kritická sekce Při multitaskingu (multithreadingu) různé procesy často pracují nad společnou datovou strukturou (např. zápis a čtení do/z fronty)
8 Třídy, objekty, metody, předávání argumentů metod
8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním
2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.
Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv copyright To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby
Programování v C++ 1, 1. cvičení
Programování v C++ 1, 1. cvičení opakování látky ze základů programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí procvičených
PB161 Programování v jazyce C++ Přednáška 2
PB161 Programování v jazyce C++ Přednáška 2 Základy objektů Reference, const Nikola Beneš 25. září 2018 PB161 přednáška 2: objekty, reference, const 25. září 2018 1 / 30 Jak funguje std::vector? (pro zvídavé)
Doporučené postupy. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2018
Doporučené postupy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2018 Programování v C++, B6B36PJC 01/2019, Lekce 13 https://cw.fel.cvut.cz/wiki/courses/b6b36pjc/start
Základy C++ I. Jan Hnilica Počítačové modelování 18
Základy C++ I 1 Přechod z C na C++ jazyk C++ je nadmnožinou jazyka C z hlediska syntaxe se jedná o velmi podobné jazyky, spolu s dalšími jazyky "céčkovské" rodiny, jako je např. C# každý platný program
přetížení operátorů (o)
přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního