| Termín odevzdání: | 7. října 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | Třída RWlock reprezentuje sdílený zámek, který umožní přístup ke
	  sdílené paměti vícero vláknům v režimu čtení, ale exkluzivní přístup
	  vláknu, které chce do sdílené paměti zapisovat. Implementujte poskytnuté rozhraní třídy RWlock za použití funkcí, které vám poskytuje standardní knihovna jazyka C++ verze 11. Je zakázáno použít při implementaci přímo funkce z POSIX Thread Library. Algoritmy pro RWLOCK se můžete inspirovat například na wikipedii. Dle standardu musí být zámek uvolněn stejným vláknem, které zámek zamklo, jinak dojde k nedefinovanému chování. Ačkoliv implementace STD knihovny na Linuxu je benevolentní, STD knihovna poskytnutá spolu s programem Visual Studio 2013 kontroluje vlastnictví zámku při odemykání. Projekt můžete řešit na serveru aisa. V takové případě je nutné přidat si modul gcc-4.8.2 abyste získali překladač s podporou C++11. Projekt:rwlock_student.zip | 
| Termín odevzdání: | 14. října 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | Napište paralelní aplikaci, která spustí vícero vláken nebo procesů
	  tak, že každé vlákno/proces vygeneruje náhodné číslo v rozmezí
	  1--100. Poté aplikace spočítá, které vlákno/proces vygenerovalo
	  největší číslo a ustanoví toto vláno/proces jako vedoucí
	  vlákno/proces. Aplikace musí řešit problém volby shodného čísla
	  různými vlákny/procesy. Aplikace o volbě vedoucího informuje
	  participující vlákna/procesy a volbu vypíše na výstup. Tuto aplikaci
	  realizujte pomocí standardů POSIX Threads, a MPI. Dobrovolně je též možné vypracovat tutéž aplikaci s využitím rozhraní UNIX SYS V a OpenMP. Projekt můžete řešit na strojích nymfe50-nymfe55. V takovém případě je možné přidat si modul gcc-4.8.2 abyste získali překladač s podporou C++11. Navíc pro účely distribuovaného počítání, doporučuji zařídit si přihlašování mezi stanicemi bez nutnosti zadávání hesla, a stejně tak si i zařídit přidání modulu s gcc-4.8.2 automaticky po přihlášení. Projekt:leader_student.zip | 
| Termín odevzdání: | 21. října 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | V tomto projektu je vaším úkolem implementovat datovou
strukturu (frontu) pro jednosměrnou komunikaci dvou vláken. Vlákno A
bude do fronty vkládat hodnoty a vlákno B je z této fronty bude ve
stejném pořadí vybírat. Jako součást zadání jsou k dispozici soubory Makefile, driver.cpp, pomocné hlavičkové soubory tools.h a compatibilityHeader.h a dvě "vzorové" implementace, naive.hpp a ring.hpp. Vašim úkolem je dodat soubor student.hpp a modifikovat soubor driver.cpp, a to tak, aby na počítači nymfe* byla propustnost vaší implementace (měřená programem driver) konzistentně výrazně vyšší než výkon dodaných příkladů (naive a ring) - alespoň 100 000 položek/ms, je ovšem možné dosáhnout výkonu přes 250 000 položek/ms. Minimální dosažitelná propustnost na stroji nymfe80 je 5000 položek/ms v případě naive.hpp a cca 55000 položek/ms pro ring.hpp. V souboru student.hpp dodejte také textový popis implementace a stručné odůvodnění korektnosti (zejména použití nebo nepoužití klíčového slova volatile a/nebo paměťových bariér). Požadavky na rozhraní a chování vaší implementace odvoďte z dodaných příkladů. Kód který je vám k dispozici v driver.cpp krom měření propustnosti také kontroluje základní správnost implementace. Projekt:fifo_student.zip | 
| Termín odevzdání: | 28. října 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | V přiloženém archivu máte zdrojové soubory k programu, který umí na
	  základě vstupních parametrů vygenerovat detail Mandelbrotova fraktálu
	  do souboru typu BMP. Vaším úkolem je program analyzovat a vhodně
	  paralelizovat.  K paralelizaci můžete využít libovolný z nástrojů:
	  POSIX Thread Library, C++11 thread, OpenMP, MPI. Odevzdávejte pouze
	  zdrojové soubory a Makefile, nikoliv soubory *.bmp. Program umí načíst konfigurační soubor config.txt, ve kterém jsou informace o detailu fraktálu, který se má vykreslit. Odevzdávejte i zajímavé vlastní konfigurace config.txt. Projekt:fraktal_student.zip | 
| Termín odevzdání: | 4. listopadu 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | Cílem tohoto projektu je seznámit se s problematikou alokace paměti v
	  kontextu návrhu a implementace paralelních aplikací. Vaším úkolem je v krátké zprávě zhodnotit kvalitu minimálně čtyř paměťových alokátorů v kontextu programování paralelních aplikací. Za tímto účelem budete implementovat sadu testovacích programů, které k vyhodnocení alokátorů použijete. Vaše testovací sada musí testovat alokátory minimálně na následující vlastnosti: 
 Překrytí standardního alokátoru lze realizovat pomocí proměnné prostředí: 
 Odevzdávaný tarball/zip bude obsahovat 
 Navrhované alokátory (možno vybrat i jiné) 
 | 
| Termín odevzdání: | 11. listopadu 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | V tomto projektu je vaším úkolem implementovat paralelní výpočet
	  tranzitivního uzávěru orientovaného grafu, zadaného jako matici
	  sousednosti. Je nutné pro tuto paralelní implementaci použít systém
	  OpenMP.
	  Vaším úkolem je dodat soubory parallel.cpp a sequential.cpp (viz
	  Makefile), které demonstrují rozdíl ve výpočtu sekvenčním a výpočtu
	  paralelním, implementovaném pomocí primitiv OpenMP. Stačí
	  implementovat metodu "Matrix::closure()" která z dané matice napočítá
	  její tranzitivní uzávěr. Pro násobení dvojice matic použijte naivní
	  O(n^3) algoritmus, pro výpočet tranzitivního uzávěru aplikujte
	  algoritmus, který použije O(log n) násobení.
	  Soubor common.h deklaruje a částečně implementuje datovou strukturu
	  Matrix, soubor main.cpp obsahuje "ovladač" který spustí výpočet. Jako
	  parametr lze použít název souboru, v takovém případě bude tento soubor
	  načten, nebo dvojici čísel, které spustí program pro náhodnou matici
	  velikosti dané prvním číslem a random seed daným druhým číslem
	  (nepovinné). 
	  Krom implementace sequential.cpp a parallel.cpp je vašim úkolem
	  doplnit Makefile o target "check" který zkontroluje, že binárky
	  sequential a parallel dávají očekávané výsledky pro testovací data
	  dostupné v input/ a expected/.  (Tzn. že výstup ./sequential input/c
	  by se měl shodovat s obsahem souboru expected/c.) Navíc cíl check bude
	  kontrolovat, že implementace je idempotentní: ./sequential expected/c
	  nesmí změnit vstupní matici.
	  Poslední částí úkolu je textově popsat přínosy paralelizace tohoto
	  problému, stručný návrh na další možné přístupy mimo vámi zvoleného
	  (existují-li) a úvaha o efektivitě reprezentace matic použité v
	  souboru common.h (včetně odhadu její paměťové náročnosti v závislosti
	  na n, v bajtech; pomůcka: konzultujte dokumentaci, případně hlavičkové
	  soubory STL). Součástí textové zprávy bude také výpis časů
	  srovnávajících sekvenční a paralelní výpočet pro matice velikosti 500,
	  1000 a 1200.
	  Výstupem tedy bude tarball, který obsahuje: 
 | 
| Termín odevzdání: | 18. listopadu 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | V tomto projektu je vaším úkolem aplikovat multimediální rozšíření
	  procesoru (SIMD paralelizmus) na jednoduchý problém výpočtu průměrné
	  hodnoty pole náhodných čísel. V zadání dostáváte soubor main.cpp,
	  který není potřeba dále měnit. Dodejte soubory scalar.h a vector.h,
	  které budou implementovat třídu Average s rozhraním požadovaným v
	  main.cpp. Důležitá omezení: hodnoty předávané v poli jsou vždy menší než 4096. Použijte tedy vhodný datový typ (16b). Dávejte pozor na přetečení. Statická metoda "init" ve třídě Average vytvoří (alokuje) pole zadané velikosti (v případě vektorové implementace pozor na zarovnání). Metoda reset() vynuluje stav objektu a metoda process bude brát *referenci* na hodnotu typu Data který byl předem inicializovaný pomocí init (viz main.cpp). Metoda process může být (je) volaná opakovaně a výsledná hodnota average() musí odpovídat průměru všech hodnot jí předaných od posledního volání reset(). Celkově musí být třída Average schopna zpracovat aspoň 134217728 hodnot (ale pokud možno, i tomuto omezení se vyhněte). Při implementaci souboru vector.h použijte vestavěné funkce a datové typy pro SIMD z hlavičkového souboru emmintrin.h (součást GCC). Výstupní tarball/zip bude obsahovat: 
 V defaultním Makfile se překládá také binárka "auto", která vznikne překladem vaší "skalární" verze kódu s automatickou vektorizací v GCC. Ve zprava.txt srovnejte chování všech tří přístupů (scalar, vector a auto) a rozdíly kvantifikujte. Projekt:mmx_student.zip | 
| Termín odevzdání: | 25. listopadu 2015, 18:00 | 
| Forma odevzdání: | Odevzdárna v ISu. | 
| Zadání: | Vaším úkolem je implementovat detekci ukončení v distribuované
	  paměti. Vycházejte z algoritmu známého jako Safrův algoritmus
	  (Safra's algorithm). K dispozici máte dva soubory - main.cpp a communication.h. V souboru communication.h je k dispozici třída Communication, která zastřešuje funkce z knihovny MPI a poskytuje wrappery pro asynchronní bufferované operace poslání a přijímání zpráv. Není povinné tuto třídu použít. V souboru main.cpp je třída Worker, která náhodně generuje čísla, která posílá náhodným příjemcům v systému. Aby bylo zaručeno, že algoritmus skončí, je postupně snižována pravděpodobnost, že bude vygenerováno další číslo. Po určitém čase se tedy činnost v systému zastaví a jednotlivé procesy budou čekat. Vaším úkolem je implementovat detekci této situace a korektně algoritmus ukončit. Pro splnění tohoto úkolu potřebujete implementovat metodu `bool finish()` a trochu upravit metody `void receive()`, `void next( double )`, konstruktor a destruktor. Dále bude nutné rozšířit třídu Worker o další atributy, případně definice další třídy/struktury. K implementaci a testování použijte stanice nymfe*, kde je předinstalováno prostředí MPI. Detaily Safrova algorimu pro dynamickou detekci ukončení načtěte třeba zde: cdp-8-mpi-2-4up.pdf. Projekt:safra_student.zip |