| Termín odevzdání: | 15. října 2012, 19:00 |
| Forma odevzdání: | Osobní demonstrace vyučujícímu. |
| Zadání: | Cílem projektu je přeložit a instalovat do svého domovského adresáře knihovnu OpenMPI, a poté s touto knihovnou přeložit a spustit (distribuovaně) na počítačích nymfe* paralelní program DiVinE pro vybrané vstupní modely, jež jsou součástí instalačního balíčku DiVinE. (Poslední vývojové verze nástroje DiVinE zde.) |
| Termín odevzdání: | 22. října 2012, 19:00 |
| Forma odevzdání: | Odevzdává se soubor IV112_02_UCO.tar.gz, který obsahuje sbalený stejnojmenný adresář se zdrojovými kódy a souborem Makefile tak, aby po provedením příkazu make v daném adresáři na stroji nymfe* se aplikace přeložily a spustily. Výpisy na obrazovku by měly být samovysvětlující a dokumentující probíhající úkony. |
| Zadání: |
Napište paralelní aplikaci, která spustí 12 vláken nebo
procesů. Každé vlákno/proces vygeneruje náhodné číslo v rozmezí 1--100,
aplikace potom spočítá, které vlákno/proces vygenerovalo největší číslo,
které vlákno/proces nejmenší číslo, a jaký je průměr všech vygenerovaných
čísel. Tuto aplikaci realizujte pomocí standardů POSIX
Threads, OpenMP a MPI. Dobrovolně je též možné vypracovat tutéž aplikaci využivající rozhraní UNIX SYS V. |
| Termín odevzdání: | 29. října 2012, 19:00 |
| Forma odevzdání: | Odevzdává se soubor IV112_03_UCO.tar.gz, který obsahuje sbalený stejnojmenný adresář se zdrojovými kódy a souborem Makefile tak, aby po provedením příkazu make v daném adresáři na stroji nymfe* se aplikace přeložily a spustily. Výpisy na obrazovku by měly být samovysvětlující a dokumentující probíhající úkony. |
| Zadání: |
V tomto projektu je vaším úkolem implementovat bariéru pracující ve
sdílené paměti a využívající POSIX Thread Library. Bariéra je základní
synchronizační primitivum, které zaručuje, že každé vlákno bude
pokračovat v provádění příkazů za bariérou až v případě, že všechna
ostatní vlákna tuto bariéru dosáhnou. Abyste splnili tento projekt, je potřeba implementovat tyto 4 druhy (mode) bariéry:
|
| Termín odevzdání: | 5. listopadu 2012, 19:00 |
| Forma odevzdání: | Odevzdává se soubor IV112_04_UCO.tar.gz, který obsahuje sbalený stejnojmenný adresář se zdrojovými kódy a souborem Makefile tak, aby po provedením příkazu make v daném adresáři na stroji nymfe* se aplikace přeložily a spustily. Výpisy na obrazovku by měly být samovysvětlující a dokumentující probíhající úkony. |
| 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.
Jako součást zadání jsou k dispozici soubory Makefile, main.cpp a
common.h, zadani.txt a adresáře input/ a expected/
(IV112_04_template.tgz).
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(logn)
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í: | 12. listopadu 2012, 19:00 |
| Forma odevzdání: | Odevzdává se soubor IV112_05_UCO.tar.gz, který obsahuje sbalený stejnojmenný adresář se zdrojovými kódy a souborem Makefile tak, aby po provedením příkazu make v daném adresáři na stroji nymfe* se aplikace přeložily a spustily. Výpisy na obrazovku by měly být samovysvětlující a dokumentující probíhající úkony. |
| 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: (podrobnější popis vlastností je možné vyčíst v [1])
Odevzdávaný tarball bude obsahovat
Navrhované alokátory (možno vybrat i jiné)
Reference:
|
| Termín odevzdání: | 19. listopadu 2012, 19:00 |
| Forma odevzdání: | Odevzdává se soubor IV112_06_UCO.tar.gz, který obsahuje sbalený stejnojmenný adresář se zdrojovými kódy a souborem Makefile tak, aby po provedením příkazu make v daném adresáři na stroji nymfe* se aplikace přeložily a spustily. Výpisy na obrazovku by měly být samovysvětlující a dokumentující probíhající úkony. |
| 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 ve stejném pořadí vybírat. Jako součást zadání (fifos.tar.gz)jsou k dispozici soubory Makefile, driver.cpp, adresář wibble/ a dvě "vzorové" implementace, naive.hpp a ring.hpp. Vaším ú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) alespoň 21000 položek/ms. Očekávaný výkon dodaných příkladů (naive a ring) je zhruba 8000 a 15000 položek/ms. (Dosažitelná propustnost na stroji nymfe* je kolem 42000 položek/ms.) 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. |
| Termín odevzdání: | 26. listopadu 2012, 19:00 |
| Forma odevzdání: | Odevzdává se soubor IV112_07_UCO.tar.gz, který obsahuje sbalený stejnojmenný adresář se zdrojovými kódy a souborem Makefile tak, aby po provedením příkazu make v daném adresáři na stroji nymfe* se aplikace přeložily a spustily. Výpisy na obrazovku by měly být samovysvětlující a dokumentující probíhající úkony. |
| 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
(mmx.tar.gz), 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 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. |