Bariéra
- místo v programu, kde se čeká až k němu dojdou všechny procesy (laicky řešeno)
- jde o synchronizační mechanismus
- zajistí, že všechny procesy dojdou do daného bodu, než se bude pokračovat dál
- řešíme pomocí sdíleného počítadla, kterého hodnotu zvýšíme vždy když daný proces dojde do místa bariéry; čekáme dokud hodnota počítadlo nebude rovna počtu procesů a poté můžeme pokračovat
- … počet procesů
- … počet procesů, které dorazili k bariéře
- … proces prošel bariérou
- problém: takto implementovanou bariéru můžeme použít pouze jednou
Info
Fetch and add Složená atomická operace
FA(var, num)
.
var
je proměnná anum
číslo.- Atomicky provede následující kroky: zjistí hodnotu
val
proměnnévar
, zvýší hodnotuvar
onum
a vrátí hodnotuval
.
# Implementace bariéry
FA(count, 1)
await count == n
Znovupoužitelná bariéry
- Máme 2 počítadla a “prohodíme” jejich roli
(Paralelní) součet prefixů
- Vstupem je pole čísel
- Výstupem je taktéž pole čísel, kde v každém políčku je následující prvkem součtem předchozích políček
Triviální přístup
- Triviálním přístupem získáme lineární časovou složitost ()
Paralelní přístup
- Postupujeme v krocích, kdy na konci kroku máme nové pole a součty v daném kroku můžeme spustit paralelně
- Sčítáme od konce vždy 2 prvky se zvětšující se vzdáleností ()
- Korektní výsledky ale dostavám od začátku až nakonec
- Stačí pokud provedem kroků, kde je délka pole ⇒ časová složitost se zlepší na
- Pseudokód:
- Náčrtek: