Když chceme sekvenční úlohu přepsat na paralelní, obvykle postupujeme:
Nejprve vyřešíme úlohu sekvenčně.
Poté uděláme dekompozici sekvenční úlohy na paralelně vykonávané úlohy.
Definujeme závislosti mezi úlohami.
Je potřeba provést analýzu závislostí (dependency graph)
Jsou dva typy dekompozice:
Dekompozice úloh - rozložím na menší nezávislé paralelní úlohy
Dekompozice dat - rozdělím data na nezávislé části, které pak zpracuji paralelně
Fosterova metodologie
Vytvořil postup návrhů paralelních programů.
Postup:
Rozdělení na menší části (dekompozice)
Zabezpečení komunikace mezi částmi
Aglomerace (spojování částí do logických celků)
Mapování (technická realizace)
*Toto je navíc z předchozího ročníku.
Asynchronní programování
Nejedná se o paralelní programování, kód se ve skutečnosti vykonává sériově.
Umožňuje efektivnější využití času v aplikacích, zejména v situacích, kdy je čekání na dokončení operací neefektivní.
Např. v kontextu webových služeb, síťové komunikace, GUI, …
Asynchronní programování umožňuje spouštět operace, které trvají delší dobu, bez blokování hlavního vlákna. Místo čekání na dokončení operace může hlavní vlákno pokračovat v provádění dalších úloh.
Asynchronní programování je často spojeno s neblokujícím vstupně-výstupním zpracováním. To umožňuje programu pokračovat v provádění dalších úloh, zatímco čeká na dokončení operací I/O.
Synchronizace na úrovni funkcí. V mnoha případech jsou asynchronní operace řízeny callback funkcemi. Callback je funkce, která je spuštěna po dokončení asynchronní operace.
Korutiny
Korutiny jsou programovacím konceptem, který umožňuje řízení průběhu programu tak, aby mohl být dočasně přerušen a později obnovem, aniž by byl ztracen aktuální stav.
Kokutiny mohou být kooperativní nebo preemptivní.
V kooperativním modelu je odpovědnost za přerušení a obnovení korutiny na programátorovi.
V preemptivním modelu může být přerušení prováděno automaticky systémem, například po uplynutí časovače.
Kličové slovo yield je klíčovým prvkem v korutinách a indikuje místo, kde bude korutina dočasně přerušena a její aktuální stav bude vrácen volajícímu kódu. Při obnovení korutiny bude pokračovat od místa, kde byla posledně přerušena.
Generátory
Generátor je speciální druh korutiny nebo funkce, která umožňuje postupné generování hodnot a udržuje svůj stav mezi voláními.
Generátor je pohodlným způsobem, jak vytvářet iterovatelné sekvence, aniž by bylo nutné ukládat všechny hodnoty do paměti najednou.
V mnoha programovacích jazycích jsou generátory implementovány pomocí klíčových slov jako je yield
Příklad v jazyce Python
def generator(): yield 1 yield 2 yield 3# Vytvoření generátorugen = generator()# Iterace přes generátorfor hodnota in gen: print(hodnota)
Nativní korutiny
Nativní korutiny jsou přímo podporovány v jádře programovacího jazyka nebo runtime prostředí.
To znamená, že nemusíme používat knihovny nebo dodatečné moduly pro vytváření a správu korutin.
Nativní korutiny obvykle nabízejí efektivní správu paměti, což může být důležité při manipulaci s velkým množstvím korutin.