Hotfix release available: 2025-05-14b "Librarian".
upgrade now! [56.2] (what's this?)
Hotfix release available: 2025-05-14a "Librarian".
upgrade now! [56.1] (what's this?)
New release available: 2025-05-14 "Librarian".
upgrade now! [56] (what's this?)
Hotfix release available: 2024-02-06b "Kaos".
upgrade now! [55.2] (what's this?)
Hotfix release available: 2024-02-06a "Kaos".
upgrade now! [55.1] (what's this?)
New release available: 2024-02-06 "Kaos".
upgrade now! [55] (what's this?)
Hotfix release available: 2023-04-04b "Jack Jackrum".
upgrade now! [54.2] (what's this?)
users:martin.kocicka:pdp:8b
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| users:martin.kocicka:pdp:8b [2017/06/13 10:18] – vytvořeno martin.kocicka | users:martin.kocicka:pdp:8b [2017/06/13 11:01] (current) – martin.kocicka | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== PDP - Vyřešené zkouškové příklady za 8 bodů ====== | ====== PDP - Vyřešené zkouškové příklady za 8 bodů ====== | ||
| - | ====== Paralelní architektury a výpočetní modely (2. přednáška)====== | + | ====== Vnořování ====== |
| - | + | ||
| - | ===== Polylogaritmicky složitá simulace prioritního CRCW PRAM na paměťovém EREW PRAM ===== | + | |
| - | + | ||
| - | Popište polylogaritmicky složitou simulaci prioritního CRCW PRAM algoritmu na < | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[.: | + | |
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | :!://Viz skripta | + | |
| - | CZ [2006] str. 45, věta 3.13; | + | |
| - | EN [2009] str. 27// | + | |
| - | + | ||
| - | Počet procesorů na < | + | |
| - | + | ||
| - | Rozlišíme operace //READ//, //WRITE// a lokální výpočet. Simulace lokálního výpočtu je pro < | + | |
| - | + | ||
| - | Operace //READ// a //WRITE// řešíme takto: | + | |
| - | - Chce-li procesor < | + | |
| - | - Všechny procesory < | + | |
| - | - Každý procesor < | + | |
| - | - Další kroky se liší pro //READ// a // | + | |
| - | * // | + | |
| - | - procesor < | + | |
| - | - každý procesor < | + | |
| - | * //READ//: | + | |
| - | - < | + | |
| - | - hodnota < | + | |
| - | - provede se permutace < | + | |
| - | - každý procesor přečte < | + | |
| - | + | ||
| - | => Složitost je daná operací řazení < | + | |
| - | + | ||
| - | **=> Jeden krok simulujeme se zpomalením** < | + | |
| - | + | ||
| - | ===== Polylogaritmicky složitá simulace prioritního CRCW PRAM na paměťovém EREW PRAM ===== | + | |
| - | + | ||
| - | Popište polylogaritmicky složitou simulaci prioritního CRCW PRAM algoritmu na < | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[.: | + | |
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | :!://Viz skripta | + | |
| - | CZ [2006] str. 45, věta 3.11; | + | |
| - | EN [2010] str. 27, theorem 2.16// | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | FIXME | + | |
| - | + | ||
| - | ===== Simulace PRAMu na PRAMu s menší pamětí ===== | + | |
| - | + | ||
| - | PRAM(n,p) skončí výpočet < | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[.: | + | |
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | FIXME | + | |
| - | + | ||
| - | ====== Vnořování | + | |
| ===== Vnoření Qn do M(2^k,2^k) ===== | ===== Vnoření Qn do M(2^k,2^k) ===== | ||
| Line 109: | Line 45: | ||
| {{: | {{: | ||
| - | + | ====== Základní paralelní algoritmy ====== | |
| - | ====== Směrování, | + | |
| - | ===== Konstrukce směrovací funkce v obecném G ===== | + | |
| - | + | ||
| - | Je zadán obecný jednoduchý neorientovaný souvislý N-uzlový graf G. Popište algoritmus konstrukce směrování funkce odolné vůči zablokování (deadlock-free) na přímé a propojovací síti a topologii grafu G s plně duplexními kanály a všeportovými směrovači a uzly s označením 1..n. Konstrukci popište nejprve v obecné a odvoďte důkaz okolností směrovací funkce proti zablokování a pak teprve demonstrujte na příkladu sítě na obrázku vyslovte tvrzení o minimalitě této směrovací funkce. | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2015-01-13|2015-01-13]], | + | |
| - | ==== Řešení ==== | + | |
| - | [[https:// | + | |
| - | + | ||
| - | Lze použít algoritmus Nahoru* / Dolů* z přednášky 6 2015/16, slajd 33. | + | |
| - | + | ||
| - | V grafu bychom si průchodem do šířky od zvoleného uzlu vytvořili kostru. Všechny uzly by byly v nějaké hladině vůči kořenu. Uzly mají nějaké svoje číselné ID. Hrana, která vede mezi uzly, které nejsou ve stejné hladině, vede do uzlu, co je v nižší hladině. Hrana mezi uzly ve stejné hladině vede k uzlu s nižším id. | + | |
| - | + | ||
| - | Důkaz je uvedený v přednášce a nese se v tom duchu, že nad kořenem už nic není, že každý uzel má jednoznačné ID a že v grafu neexistuje orientovaná kružnice. | + | |
| - | + | ||
| - | Ze script: Jakmile se někdy otočíme dolů, už se nesmíme otočit nahoru. Toto pravidlo zaručí, že v grafu kanalových závislostí nemohou existovat cykly. | + | |
| - | + | ||
| - | :!: Dodatek by voho: Já sem jen hodím pseudokód Up*/Down*, ať ho nemusíte hledat... | + | |
| - | + | ||
| - | < | + | |
| - | 10: očísluj uzly v grafu | + | |
| - | 20: vytvoř kostru grafu G průchodem do šířky od nějakého uzlu r | + | |
| - | 30: orientuj hrany | + | |
| - | a) hrany v kostře: od potomka k předkovi | + | |
| - | b) zbývající hrany (mimo kostru): orientuj směrem k uzlu, který je nejblíž kořenu, pokud je takových uzlů více, potom k tomu s nižším ID | + | |
| - | </ | + | |
| - | + | ||
| - | A ještě pár obrázků: | + | |
| - | + | ||
| - | 1) vytvoří se kostra pomocí BFS z nějakého vybraného uzlu (zde 8) (čísla u hran jsou čísla kroků, ve kterém byla do kostry přidána); pořadí expanze bylo dáno ID | + | |
| - | + | ||
| - | {{.: | + | |
| - | + | ||
| - | Hrany v kostře se orientují od potomků k předkovi. | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | Ostatní hrany se orientují od vyššího ID k nižšímu. | + | |
| - | + | ||
| - | {{.: | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | Pozn. by Štefan: ten spodní obrázek je špatně! dle českých skript str. 148 se strana orientuje směrem k uzlu blíže kořenu (tak aby případná cesta byla kratší), pokud je těchto uzlů více, pak zvolí ten s menším ID, tedy od 3 -> 5 a 10 -> 11 | + | |
| - | + | ||
| - | Edit: Nesouhlasím se Štefanem. Česká skripta nemám a možná je v nich chyba, ale podle aktuálních slidů a podle selského rozumu je správně postup na obrázku. Orientace hran je definována takto: Je-li hloubka koncových uzlů v kostře různá, orientace je směrem k menší hloubce. Je-li stejná, orientace je k uzlu s menším ID. To je vše, žádné další kritérium tam není. | + | |
| - | + | ||
| - | Edit 2016: souhlasim se štefanem, zjednodušení podle logiky z editu výše = 2 body | + | |
| - | + | ||
| - | Směrovací funkce R je definována takto:\\ | + | |
| - | Dovolené jsou pouze cesty, které se skládají z 0 nebo více linek směrem nahoru, následovaných 0 nebo více linkami směrem dolů. (CZ skripta 147-148) | + | |
| - | + | ||
| - | Ešte k tvrdeniu o minimalite: Tvrdík mi povedal, že to nie je minimálne smerovanie. | + | |
| - | + | ||
| - | Edit: Jasně že není minimální, | + | |
| - | + | ||
| - | **Edit: Vysledek z diskuse - obrazek neni spatne.** | + | |
| - | + | ||
| - | Edit2: Pokud platí směrování směrem do nižší hloubky pak je uzel 10 v hloubce 4 a uzel 11 v hloubce 3 tzn. hrana je opačně, stejně tak uzel 5 je v hloubce 1 a uzel 3 v hloubce 2 tedy opět opačně. Tedy obrázek je špatně. | + | |
| - | + | ||
| - | **EDIT3: Souhlas s Edit2. Obrázek možná bude fungovat, ale není vystavěn dle algoritmu z přednášek, | + | |
| - | + | ||
| - | EDIT4: Algoritmus dle skript neni potreba, staci popsat jak se tvori DAG z grafu. | + | |
| - | + | ||
| - | EDIT5: Když si obrázek překreslíte do stromu, tak to vypadá takto. Pokud zachováváme směrování k nižší hloubce, tak je 3. obrázek špatně | + | |
| - | + | ||
| - | EDIT5 by vd 06/16: Myslím, že slajd hovoří jasně: hrana se orientuje od větší k menší hloubce (tj. směrem ke kořenu). Pokud mají dva kořeny stejnou hloubku, hrana se orientuje směrem k uzlu s menším ID. Poslední obrázek je tedy **špatně**. | + | |
| - | + | ||
| - | Zde je opravený obrázek, modře je kostra grafu: | + | |
| - | + | ||
| - | {{https:// | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | ====== Základní paralelní algoritmy | + | |
| - | + | ||
| - | ===== Algoritmus pro očíslování listů stromu na eulerovské cestě ===== | + | |
| - | + | ||
| - | Popište EREW PRAM algoritmus pro výpočet **pořadí listů** při průchodu do **hloubky** // | + | |
| - | + | ||
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | === Algoritmus === | + | |
| - | + | ||
| - | Uvažujme počet hran stromu **m = 2n-2** a počet procesorů **p = m**. | + | |
| - | + | ||
| - | Část A: | + | |
| - | <code c> | + | |
| - | for i in 0..m-1 do_in_parallel { | + | |
| - | maList[i] = 0 | + | |
| - | if (EA[i].Dvojče = EA[i+1]) { | + | |
| - | // Jsou-li dvě po sobě jdoucí hrany dvojčaty, musí být mezi nimi list. | + | |
| - | maList[i] = 1 | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Poté provést paralelní prefixový součet hodnot //maList// ze všech procesorů do pole //X// o //m// prvcích. Hodnota //X[m-1]// je hledané //q//. | + | |
| - | + | ||
| - | Část B: | + | |
| - | <code c> | + | |
| - | for i in 0..m-1 do_in_parallel { | + | |
| - | if (maList[i] = 1) { | + | |
| - | List[ X[i] -1 ] = EA[i].endNode | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Stejný kód zapsaný v alternativní syntaxi: | + | |
| - | <code python> | + | |
| - | # edges - pole hran EA [pořadové číslo hrany => hrana] | + | |
| - | # leafs - pole listů [pořadové číslo listu => uzel] | + | |
| - | def countLeafs(edges) { | + | |
| - | hasLeaf = array(edges.length); | + | |
| - | leafPS = array(edges.length); | + | |
| - | + | ||
| - | for i in range(0, edges.length -1) do_in_parallel { | + | |
| - | hasLeaf[i] = 0; | + | |
| - | # jsou-li po sobě jdoucí hrany dvojčaty, je mezi nimi list | + | |
| - | if (edges[i].sibling == edges[i+1]) { | + | |
| - | hasLeaf[i] = 1; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | doPPS(hasLeaf, | + | |
| - | leafsCount = leafPS[-1]; | + | |
| - | + | ||
| - | leafs = array(leafsCount); | + | |
| - | + | ||
| - | for i in range(0, edges.length -1) do_in_parallel { | + | |
| - | if (hasLeaf[i] == 1) { | + | |
| - | leafs[ leafPS[i] -1 ] = edges[i].endNode; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | return leafs, leafsCount; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Každý procesor má hodnotu //list//. Mohou to být buď jako lokální proměnné, nebo mohou být uloženy v hlavní paměti v polích o velikosti //m// (každý procesor pracuje pouze se svým prvkem pole). | + | |
| - | + | ||
| - | === Složitost === | + | |
| - | + | ||
| - | Máme pouze **p** procesorů a < | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | === Alternativní řešení === | + | |
| - | + | ||
| - | (klimic) Já bych na to šel jinak: | + | |
| - | + | ||
| - | * List <=> Velikost podstromu = 1 (viz algoritmus v přednášce/ | + | |
| - | * Udělám preorder číslování (viz algoritmus v přednášce/ | + | |
| - | * Zapsání výsledného pole pak bude: | + | |
| - | + | ||
| - | for all xy in EA do_in_parallel: | + | |
| - | { | + | |
| - | if (xy.Direction = Down && SubtreeSize[y] == 1) List[y] = EA[xy].Weight; | + | |
| - | } | + | |
| - | ===== PRAM algoritmus číslování uzlů podstromu postorder ===== | + | |
| - | + | ||
| - | **Eulerův strom a jeho reprezentaci polem, mám hotovou Eulerovu cestu.** | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2012-06-26|2012-06-26]], | + | |
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | <code c> | + | |
| - | for každou hranu e do_in_parallel | + | |
| - | if (Rank[e] < Rank[EL[e].Dvojče]) { | + | |
| - | Dir[e] = F; Weight[e] = 0; | + | |
| - | }; else { | + | |
| - | Dir[e] = R; Weight[e] = 1; | + | |
| - | } | + | |
| - | call PPS na pole Weight[]; | + | |
| - | for každou hranu <xy> do_in_parallel | + | |
| - | if (Dir[< | + | |
| - | Postorder[x] = Weight[< | + | |
| - | } | + | |
| - | + | ||
| - | Postorder[root]=n-1; | + | |
| - | </ | + | |
| - | + | ||
| - | Stejný kód v alternativní syntaxi: | + | |
| - | <code python> | + | |
| - | # eulerPath - pole EA s ukazateli na hrany v AA v pořadí Eulerovské cesty | + | |
| - | # postorder - pole [číslo uzlu => pořadí postorder] | + | |
| - | def buildPostorder(eulerPath) { | + | |
| - | weights = array(eulerPath.length); | + | |
| - | postorder = array( eulerPath.length/ | + | |
| - | + | ||
| - | for edge in eulerPath do_in_parallel { | + | |
| - | if (edge.rank < edge.sibling.rank) { | + | |
| - | # hrana jdoucí směrem od kořene | + | |
| - | edge.dir = ' | + | |
| - | else { | + | |
| - | # dvojče jdoucí směrem ke kořeni | + | |
| - | edge.dir = ' | + | |
| - | } | + | |
| - | } | + | |
| - | doPPS(weights); | + | |
| - | + | ||
| - | for edge in eulerPath do_in_parallel { | + | |
| - | if (edge.dir == ' | + | |
| - | postorder[ edge.startNode ] = weights[ edge ] -1; | + | |
| - | } | + | |
| - | } | + | |
| - | postorder[ROOT] = eulerPath.length/ | + | |
| - | + | ||
| - | return postorder; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | {{.: | + | |
| - | + | ||
| - | Vzestupná_hrana.váha = 1, sestupná_hrana.váha = 0. Řešením je spočítat PPS nad vzestupnými hranami. Hrany jsou uloženy v poli ve směru průchodu Eulerovou kružnicí. Na konci výpočtu se musí zvlášť dopočítat kořen, protože z něj nevede žádná vzestupná hrana. | + | |
| - | + | ||
| - | Počet kroků je odvozen v následujícím příkladu (PRAM Preorder), zde vychází stejně. | + | |
| - | + | ||
| - | 2014 byl příklad za 6 b. 2 za alg, 2 za čas složitost viz příklad níže a dva za popis datových struktur. | + | |
| - | + | ||
| - | ===== EREW PRAM algoritmus pro pořadí uzlů v průchodu preorder | + | |
| - | + | ||
| - | **Popište EREW PRAM algoritmus pro výpočet pořadí uzlů při průchodu preorder (kořen, levý, pravý) všech **< | + | |
| - | + | ||
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | === Algoritmus === | + | |
| - | + | ||
| - | Algoritmus pro **p = n** má následující podobu: | + | |
| - | <code c> | + | |
| - | for all e in EA do_in_parallel { | + | |
| - | if (Rank[e] < Rank[EL[e].Dvojče] { | + | |
| - | Dir[e] = ' | + | |
| - | } else { | + | |
| - | Dir[e] = ' | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | call PPS nad polem Weight[]; | + | |
| - | + | ||
| - | for all <xy> in EA do_in_parallel { | + | |
| - | if (Dir[< | + | |
| - | Preorder[y] = Weight[< | + | |
| - | } | + | |
| - | Preorder[root] = 0; | + | |
| - | </ | + | |
| - | + | ||
| - | Stejný kód zapsaný v alternativní syntaxi: | + | |
| - | <code python> | + | |
| - | # eulerPath - pole EA s ukazateli na hrany v AA v pořadí Eulerovské cesty | + | |
| - | # preorder - pole [číslo uzlu => pořadí preorder] | + | |
| - | def buildPreorder(eulerPath) { | + | |
| - | weights = array(eulerPath.length); | + | |
| - | preorder = array( eulerPath.length/ | + | |
| - | + | ||
| - | for edge in eulerPath do_in_parallel { | + | |
| - | if (edge.rank < edge.sibling.rank) { | + | |
| - | # hrana jdoucí směrem od kořene | + | |
| - | edge.dir = ' | + | |
| - | else { | + | |
| - | # dvojče jdoucí směrem ke kořeni | + | |
| - | edge.dir = ' | + | |
| - | } | + | |
| - | } | + | |
| - | doPPS(weights); | + | |
| - | + | ||
| - | for edge in eulerPath do_in_parallel { | + | |
| - | if (edge.dir == ' | + | |
| - | preorder[ edge.endNode ] = weights[ edge ]; | + | |
| - | } | + | |
| - | } | + | |
| - | preorder[ROOT] = 0; # kořen je prvním uzlem | + | |
| - | + | ||
| - | return preorder; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Uvedený algoritmus je založený na tom, že Preorder ohodnocování uzlu je dáno počtem dopředných hran z kořene do uzlu v Eulerově cestě. Pokud mám **p < m** procesorů, každý má na starost < | + | |
| - | + | ||
| - | === Složitost === | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | + | ||
| - | Je třeba vyřešit složitost algoritmu PPS pro **m** prvků s **p** procesory na EREW PRAM. Ten probíhá v následujících 4 fázích: | + | |
| - | - procesor **P< | + | |
| - | - provede se PPS na **p** číslech (každý procesor má svůj lokální PS) < | + | |
| - | - každý procesor si přečte výsledek fáze 2 procesoru < | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | Výsledný celkový čas je tedy | + | |
| - | < | + | |
| ===== Paralelní prefixový součet na PRAM ===== | ===== Paralelní prefixový součet na PRAM ===== | ||
| Line 479: | Line 115: | ||
| RE:UPDATE: Žádné dvě čtení tam nebudou, stačí se podívat na algoritmus. Vždy z paměti čte pouze nové číslo, předchozí, | RE:UPDATE: Žádné dvě čtení tam nebudou, stačí se podívat na algoritmus. Vždy z paměti čte pouze nové číslo, předchozí, | ||
| - | ===== Výpočet pořadí od konce ===== | ||
| - | Popište **časově optimální** paralelní algoritmus pro výpočet **pořadí od konce** prvků (//list ranking//, LR) ve **zřetězeném seznamu** o velikosti //n// na počítači CREW PRAM s //p = n// procesory. Vstupem algoritmu je zřetězený seznam ve sdílené paměti PRAM reprezentovaný pomocí **pole následníků** < | ||
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2013-01-16|2013-01-16]] a [[par_zkouska_2012-02-03|2012-02-03]]// | ||
| - | ==== Řešení ==== | ||
| - | |||
| - | Přednáška 7, slide 32 [2015/16] | EN skripta, strana 104 (6.6.3) | ||
| - | === Časově optimální algoritmus === | ||
| - | |||
| - | Časově optimální algoritmus je popsaný v příkladu [[par_řešené_příklady_6b# | ||
| - | |||
| - | CREW je potřeba, protože více procesorů čte najednou hodnotu následníka posledního prvku. < | ||
| - | |||
| - | |||
| - | Edit by vd: V EN skriptech na straně 104 nahoře je psáno, že: < | ||
| - | === Cenově optimální algoritmus === | ||
| - | |||
| - | Budeme mít zřetězený seznam s **n' = n/log(n)** prvky a použijeme PU pomocí **p = n/log(n)** procesorů, pak dostaneme **T(n', | ||
| - | |||
| - | Máme seznam **L** s **n** prvky a pořídíme si < | ||
| - | - Transformujeme **L** na kratší seznam **L'** velikosti < | ||
| - | - Provedeme přeskakování ukazatelů na **L' | ||
| - | - Reverzí kroků z fáze 2 restaurujeme z **L'** původní seznam **L** a vypočteme konečné pořadí pro prvky v **L - L'** s toutéž složitostí jako v kroku 1 \\ < | ||
| - | |||
| - | Popis cenově optimálního algoritmu je špatně. Podívejte se raději do EN skript 6.6.3 strana 104. \\ Re: Myslím, že už je to správně. | ||
| - | |||
| - | |||
| - | **Pozorování 6.11:** Uvažujme spojový seznam s < | ||
| ===== Segmentový PPS na nepřímém SF CBT_log(p) ===== | ===== Segmentový PPS na nepřímém SF CBT_log(p) ===== | ||
| Line 543: | Line 152: | ||
| Podíváme se na poslední dva sloupečky. Je vidět, že se rovnají právě za podmínky, že původní operace plus v kruhu je asociativní. Tím je tvrzení dokázáno a příklad snad kompletní. | Podíváme se na poslední dva sloupečky. Je vidět, že se rovnají právě za podmínky, že původní operace plus v kruhu je asociativní. Tím je tvrzení dokázáno a příklad snad kompletní. | ||
| - | ====== Řadící algoritmy (8. přednáška)====== | + | ====== Kolektivní komunikační algoritmy ====== |
| - | + | ||
| - | ===== Bitonic sort na krychli Qlogp ===== | + | |
| - | + | ||
| - | Popište algoritmus Bitonický MergeSort na p-procesorové hyperkrychli < | + | |
| - | Zhodnoťte jeho škálovatelnost. | + | |
| - | Lze udržet konstantní efektivitu při < | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[.: | + | |
| - | + | ||
| - | [[https:// | + | |
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | :!://Viz skripta CZ [2006] str. 127// | + | |
| - | + | ||
| - | Algoritmus pro p = N | + | |
| - | <code c> | + | |
| - | for i=1..log N do_sequentially | + | |
| - | for j=i; | + | |
| - | for all P_k do_in_parallel | + | |
| - | if (k XOR 2^(i+1) == 0) { | + | |
| - | CEplus(P_k, P_(k XOR 2^j)) | + | |
| - | } | + | |
| - | else { | + | |
| - | CEminus(P_k, | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Tento algoritmus odpovídá následujícímu schématu | + | |
| - | + | ||
| - | {{.: | + | |
| - | + | ||
| - | Časová složitost je: log N fází, první trvá 1 krok, druhá 2, ..., poslední trvá log N kroků. | + | |
| - | + | ||
| - | Počet kroků je vysvětlen na obrázku - nejdřív jeden, pak dva, pak tři, atd. To je pro p=N, pokud je p<N, pak si musí posloupnosti ještě lokálně setřídit, poté se provádí MS. | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | pro n = 16 schématicky: | + | |
| - | + | ||
| - | {{http:// | + | |
| - | + | ||
| - | => < | + | |
| - | + | ||
| - | * Pokud uvažujeme p < N, pak každý procesor má na starosti N/p čísel => operace CE je nahrazena operací MS (merge-split) jejíž složitost je < | + | |
| - | * Celkový počet kroků bude v paralelní fázi < | + | |
| - | * Před tím je třeba data lokálně setřídit. | + | |
| - | + | ||
| - | < | + | |
| - | C(N,p) = p \cdot T(N,p) \\ | + | |
| - | E(N,p) = \frac {SU(N)}{C(N, | + | |
| - | </ | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | < | + | |
| - | \frac {\log N} {\log \frac N p + \log^2 p} = E_0 \\ | + | |
| - | \log N = E_0 \log N + E_0 ( \log^2 p - \log p) \\ | + | |
| - | => \log N ( 1 - E_0) = E_0 ( \log^2 p - \log p) \\ | + | |
| - | log N = \underbrace {\frac {E_0}{1-E_0}}_{\kappa} (\log^2 p - \log p) = \kappa ( \log^2 p - \log p) = \kappa \log p(\log p -1) \\ | + | |
| - | N = (2^{\log p -1})^{\kappa \log p} = (\frac {2^{\log p}} {2})^{\kappa \log p} = (\frac p 2)^{\kappa \log p} </ | + | |
| - | + | ||
| - | + | ||
| - | < | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | < | + | |
| - | => log N = \kappa (\log^2 p - \log p) = \kappa \log p (\log p - 1 )</ | + | |
| - | + | ||
| - | Zajímá nás asympotické chování => -1 zanedbáme | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | p = 2^{\sqrt{(\kappa' | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | \psi_2 (N) = N ^ {\sqrt {\frac {\kappa' | + | |
| - | </ | + | |
| - | + | ||
| - | => funkce < | + | |
| - | + | ||
| - | Pro < | + | |
| - | + | ||
| - | V hyperkrychli spolu v každém kroku postupně komunikují dimenze a provádějí C&E (M&S) operaci: | + | |
| - | 0 \\ | + | |
| - | 0 1 \\ | + | |
| - | 0 1 2 \\ | + | |
| - | ... \\ | + | |
| - | 0 1 2 ... n - 1 n \\ | + | |
| - | + | ||
| - | Vychází to z implementace bitonic sortu na obyčejném motýlkovi, který algoritmus dokáže provádět implicitně bez jakýchkoliv simulací nebo zpomalení. Čili výše uvedené vzorce jsou platné i na hyperkrychli. Chce to tam nakreslit tu postupnou komunikaci dimenzí a myslim že OK | + | |
| - | + | ||
| - | Edit: K plnému počtu bodů je potřeba nakreslit, jak tento algoritmus funguje na hyperkrychli. Výše dané obrázky mohou být použity jen jako vysvětlení principu. Jako důkaz korektnosti stačí uvést, že dochází k rekurzivnímu bitonickému rozdělení (nakreslit!) a tím k setřídění. | + | |
| - | + | ||
| - | Edit2: **Podstatná poznámka ke škálovatelnosti**! < | + | |
| - | + | ||
| - | VasekJ: souhlas s Edit2, tady je můj důkaz:\\ | + | |
| - | Pokud chci dokázat konstantní efektivitu < | + | |
| - | + | ||
| - | < | + | |
| - | E(N, | + | |
| - | </ | + | |
| - | není konstantní! | + | |
| - | + | ||
| - | VasekJ po zk: Oproti zadání na wiki letos (2016) nechtěl zhodnocovani skalovatelnosti, | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | ===== Uveďte definici 0-1 třídicí lemma a dokažte ho ===== | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[.: | + | |
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | :!://Viz skripta CZ [2006] str. 117 nebo ENG [2010] str. 114 nebo přednáška 8 FIT [2014/2015] slajdy 8, 9// | + | |
| - | + | ||
| - | :!://Pozn.: Jen pro pořádek - "Lemma 2" není žádný obecně známý název toho lemmatu. V přednáškách je to označeno jako "Lemma 2" jenom proto, že na předchozích slajdech je "Věta 1" a na následujících slajdech "Lemma 3", "Věta 4" atd. Tzn. nedává dobrý smysl to v písemce označovat jako "Lemma 2" i když formálně to je samozřejmě v pořádku.// | + | |
| - | + | ||
| - | **Lemma 2** | + | |
| - | + | ||
| - | Nechť f = monotonně rostoucí funkce na lineárně uspořádané množině S, čili < | + | |
| - | + | ||
| - | Pak: | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | **Důkaz. (Indukcí přes hloubku sítě.)** | + | |
| - | + | ||
| - | - Samotný komparátor je datově necitlivý vzhledem k jakékoli m.r. funkci < | + | |
| - | - Indukční krok: Nese-li určitý vodič v třídící síti hodnotu < | + | |
| - | + | ||
| - | **0-1 Třídící Lemma** | + | |
| - | + | ||
| - | Jestliže **datově necitlivý třídící algoritmus** dokáže setřídit **libovolnou binární** vstupní posloupnost, | + | |
| - | + | ||
| - | **Důkaz. (Sporem.)** | + | |
| - | * Předpokládejme, | + | |
| - | * Předpokládejme ale, že nesetřídí správně nebinární posloupnost < | + | |
| - | * Definujme | + | |
| - | * < | + | |
| - | * < | + | |
| - | * < | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ----- | + | |
| - | FIXME | + | |
| - | PS: no, to jsou moc pěkně zkopírovaný slidy. Dovedl by to někdo dovysvětlit lidsky (jednodušejš) | + | |
| - | + | ||
| - | **V každé části je to naprosto přímočaré, | + | |
| - | + | ||
| - | * Samotný důkaz //0-1 třídícího lemmatu// je sporem, jak je napsáno výše, na vstupy aplikujeme monotónně rostoucí funkci < | + | |
| - | * K tomu jsme použili //pomocné Lemma 2//, které je teď potřeba také dokázat - i když je intuitivní. | + | |
| - | * Potřebujeme dvě pomocné věty: | + | |
| - | - Vodič je datově necitlivý k < | + | |
| - | - Komparátor je datově necitlivý k < | + | |
| - | * Důkaz //Lemmatu 2// je indukcí: | + | |
| - | * Základním krokem jsou samotné vstupy v hloubce 0, kde použijeme //1. pomocnou větu//. | + | |
| - | * Indukční krok znamená, že vlastnost předpokládáme u vodičů do hloubky < | + | |
| - | + | ||
| - | ====== Permutace (9. přednáška)====== | + | |
| - | + | ||
| - | ===== Důkaz proveditelnosti bezkolizní monotonní permutace na oBF, algoritmus, složitost ===== | + | |
| - | + | ||
| - | Uvažujte **WH** síť **přímý obyčejný motýlek** < | + | |
| - | + | ||
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | //Řešení obdobného příkladu: [[par_řešené_příklady_6b# | + | |
| - | + | ||
| - | Každý uzel si musí spočítat svoji cílovou polohu => k tomu se hodí použít PPS - zhušťování (operace +, každý uzel patřící do chtěné podmnožiny má váhu 1, ostatní 0). | + | |
| - | + | ||
| - | Permutace je potom použití zhuštění, | + | |
| - | + | ||
| - | K provedení PPS potřebujeme < | + | |
| - | + | ||
| - | K provedení zhuštění, | + | |
| - | + | ||
| - | Celkem je to tedy O(5n) kroků. | + | |
| - | + | ||
| - | Důkaz bezkoliznosti - skripta str.161. Stručně: Jednoduchý motýlek je bezkolizní, | + | |
| - | + | ||
| - | EDIT: důkazem zde si nejsem jistý, napsal jsem přesně to co je ve slajdech. | + | |
| - | Tak jak to teď je mi bylo uznáno za plný počet bodů. | + | |
| - | + | ||
| - | :?: Dotaz 06/2016: Má u tohoto příkladu vliv SF vs WH? Přijde mi, že je to jinak naprosto stejné jako příklad SF za 6 bodů ( [[par_řešené_příklady_6b# | + | |
| - | ===== Proč je permutace prohození na motýlku kolizní | + | |
| - | + | ||
| - | Proč je permutace prohození na motýlku kolizní? | + | |
| - | + | ||
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | :!://Viz skripta CZ [2006] str. 157, 158// | + | |
| - | + | ||
| - | Prohození je definováno jako: | + | |
| - | - < | + | |
| - | - < | + | |
| - | + | ||
| - | Neboli vezmu polovinu řetězce (u liché délky tu menší) z konce řetězce a přesunu ji na začátek řetězce. | + | |
| - | + | ||
| - | Z vlastností minimálního směrování plyne, že v k-tém kroku se posune do takového uzlu, aby k-tý bit zprava byl stejný. | + | |
| - | Pro < | + | |
| - | + | ||
| - | < | + | |
| - | (0, u_{n-1} ... u_k ... u_0) \rightarrow (1,u_{n-1} ... u_k ... u_{k+1}) \rightarrow (2, u_{n-1} ... u_k ... u_{k+2} u_{k+1}) \rightarrow\\ | + | |
| - | ...\\ | + | |
| - | \rightarrow (k, u_{n-1} ... u_k \underline{u_{n-1} u_{n-2} ... u_{k+1}}) \rightarrow (k+1, u_{n-1} ... u_k \underline{u_{n-1} ... u_{k+1}}) \rightarrow \\ | + | |
| - | ...\\ | + | |
| - | \rightarrow (n, u_{k-1} u_{k-2} ... u_0 u_k u_{n-1} ... u_{k+1})</ | + | |
| - | + | ||
| - | Všechny uzyl ve stavu < | + | |
| - | + | ||
| - | **pozn.** Vypadá to hrozně, ale vlastně se děje tohle: Postupně jdu motýlkem e-cube směrováním, | + | |
| - | + | ||
| - | Těchto uzlů je < | + | |
| - | + | ||
| - | Toto lze řešit za pomoci třídění | + | |
| - | - Setřídit pakety na vstupech motýlku podle cílové adresy permutace | + | |
| - | - Je-li to úplná permutace, provedeme identitu | + | |
| - | - Pokud ne, nahradím prázdné < | + | |
| - | + | ||
| - | Časová složitost závisí na složitosti setřídění. | + | |
| - | + | ||
| - | EDIT: | + | |
| - | Myslím, že důkaz je zbytečně složitý a navíc klame, protože ke kolizi nedojde až po **k** krocích, ale hned v prvním. IMHO tedy stačí dokázat proč vždy dojde ke kolizi v prvním kroku (to lze snadno ukázat například pro první dva uzly 0 (0...0) a 1 (0...1)). | + | |
| - | + | ||
| - | JDU: Souhlasím s EDIT | + | |
| - | + | ||
| - | :?: Můžete to prosím vysvětlit polopatěji? | + | |
| - | + | ||
| - | EDIT by vd: Souhlasím s výše uvedenými edity, že ke konfliktu dojde už v nultém sloupci. Zde je obrázek konfliktu pro první dva uzly: | + | |
| - | + | ||
| - | {{http:// | + | |
| - | + | ||
| - | Tedy oba uzly chtějí routovat v nultém kroku na nulu, což znamená, že chtějí použít stejnou hranu. | + | |
| - | ===== Základní síťové zpoždění permutace otočení na indBFn ===== | + | |
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2012-01-17|2012-01-17]]// | + | |
| - | + | ||
| - | Odvoďte základní síťové zpoždění permutace otočení < | + | |
| - | + | ||
| - | {{ .: | + | |
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | Jedná se o varianci na stejné téma, které je vyřešené v | + | |
| - | [[.: | + | |
| - | + | ||
| - | Nejdřív znázorníme, | + | |
| - | + | ||
| - | {{.: | + | |
| - | + | ||
| - | Ke konfliktům bude docházet v první polovině přepínačů. Pak přichází nejvytíženější část (nejužší hrdlo), které nám určí, kolik komunikací bude zároveň probíhat (protože WH blokuje oproti SF celou trasu). Důležité je všimnout si, že za nejužší částí je komunikace vždy bezkonfliktní. | + | |
| - | + | ||
| - | Celkem tedy máme < | + | |
| - | + | ||
| - | Celkový vzorec (po zanedbání < | + | |
| - | + | ||
| - | + | ||
| - | Časovou složitost lze zlepšit setříděním paketů podle cílové adresy, bude to potom trvať len log^2 N krokov. | + | |
| - | ===== Cyklický posun na WH hyperkrychli ===== | + | |
| - | + | ||
| - | Pro zadané přirozené číslo < | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2012-01-31|2012-01-31]]// | + | |
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | Cyklický posun je **složení* dvou operací zhuštění na stejné síti**. | + | |
| - | + | ||
| - | //*) V přednášce 9 [2015/16], slide 36 je uvedeno, že CP je složení **částečných** permutací... netuším, co je myšleno tím částečných.// | + | |
| - | + | ||
| - | Edit by kuchta: Libovolné hranově disjunktní permutační směrování na SF oBFn je ekvivaletní permutačnímu směrování s nulovým zahlcením na WH plně-duplexní všeportové < | + | |
| - | + | ||
| - | Edit by vd: Souhlasím, že pokud je CP bezkolizní na přímém oBF, pak je bezkolizní i na < | + | |
| - | + | ||
| - | **Řešení by plech.d: | + | |
| - | + | ||
| - | Pozor na cyklický posun, viděl jsem stejný nedostatek i v jiném příkladě tady na wiki. Nestačí tvrdit, že jsou to dvě zhušťovací permutace, a tedy že stačí dokázat bezkoliznost jedné. Z toho přeci nemusí nutně plynout, že se nemůžou srazit ty dvě zhušťovací permutace, když se vyměňují. Je potřeba indukční předpoklad rozšířit o jednu novou situaci. | + | |
| - | + | ||
| - | Edit by vd: Doplním jednu podstatnou vlastnost k analogii s CP na motýlkovi. Pokud jdou v motýlkovi I.) pakety křížem (inverze), pak se v hyperkrychli prohodí sousedi; II.) pokud jdou v motýlkovi rovně (identita), pak v hyperkrychli **zůstávají pakety na místě**, nic se nikam nepřesouvá (Tvrdík tomu říká //vnitřní komunikace// | + | |
| - | + | ||
| - | **1. krok:** | + | |
| - | + | ||
| - | Při e-cube směrování je v prvním kroku použita jen 0-tá dimenze. Kolize může nastat mezi dvěma sousedními uzly v této dimenzi, z nichž jeden by přeskočil k druhému a druhý zůstal. Sousední pár má v 0-tém bitu vždy jeden 0 a jeden 1. | + | |
| - | + | ||
| - | Mohou nastat dvě hlavní možnosti: Packety jsou součástí stejné zhušťující permutace, nebo jsou packety součástí každý jiné. | + | |
| - | + | ||
| - | V prvním případě, protože zhušťovací permutace je monotónní a packety tedy na druhém konci budou opět těsně za sebou, mohou nastat dvě podmožnosti: | + | |
| - | + | ||
| - | --------------------- | + | |
| - | + | ||
| - | aaaa0 -> bbbb0 | + | |
| - | + | ||
| - | aaaa1 -> bbbb1 - 0-tý bit se neinvertuje, | + | |
| - | + | ||
| - | --------------------- | + | |
| - | + | ||
| - | aaaa0 -> bbbb1 | + | |
| - | + | ||
| - | aaaa1 -> bbbb0 - 0-tý bit se invertuje u obou, packety se vymění, žádná kolize | + | |
| - | + | ||
| - | --------------------- | + | |
| - | + | ||
| - | V druhém případě, když jsou packety každý součástí jiné zhušť. permutace, vždy vede první ze dvou uzlů do úplně posledního ze všech, který jistě končí 1, a druhý do úplně prvního ze všech, který jistě končí 0. To znamená, že situace bude vždy tato: | + | |
| - | + | ||
| - | aaaa0 -> bbbb1 | + | |
| - | + | ||
| - | aaaa1 -> bbbb0 - 0-tý bit se invertuje u obou, packety se vymění, žádná kolize | + | |
| - | + | ||
| - | :!: Pozor: zde je drobná chyba v tom, že takto to bude vždy jen tehdy, pokud má slovo, o které posouváme, lichou paritu. Pokud má sudou paritu, nastane ještě situace: | + | |
| - | + | ||
| - | aaaa1 -> bbbb1 | + | |
| - | + | ||
| - | aaaa0 -> bbbb0 | + | |
| - | + | ||
| - | Nicméně ani toto není kolizní, protože v tomto případě nedochází ke komunikaci a pakety zůstávají ve svých uzlech. | + | |
| - | + | ||
| - | Žádná z těchto tří možností není kolizní, 1. krok je tedy bezkolizní. | + | |
| - | + | ||
| - | **Indukční krok:** | + | |
| - | + | ||
| - | Po předchozím kroku se packety nacházejí na dvou disjunktních podkrychlích (< | + | |
| - | + | ||
| - | JDU: ad bezkoliznost sousedů z různých zhuštění: | + | |
| - | + | ||
| - | Edit by vd to JDU: Máš pravdu, tohle může nastat. Nicméně pokud toto nastane, v hyperkrychli to znamená, že nedochází k žádné komunikaci (výměně) a tudíž kolize stejně nemůže nastat. | + | |
| - | ===== Offline algoritmus pro permutaci na SF 2D mřížce ===== | + | |
| - | + | ||
| - | Popište a vysvětlete offline algoritmus pro bezkolizní realizaci libovolné zadané permutace π na SF plně duplexní **M(z< | + | |
| - | + | ||
| - | | ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ | + | |
| - | ^ a | b,3 | c,3 | a,5 | d,3 | d,1 | | + | |
| - | ^ b | d,5 | b,4 | c,4 | c,1 | d,2 | | + | |
| - | ^ c | b,5 | a,3 | a,4 | b,2 | d,4 | | + | |
| - | ^ d | c,2 | c,5 | a,2 | a,1 | b,1 | | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2011-06-30|2011-06-30]] a [[par_zkouska_2012-01-24|2012-01-24]] | + | |
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | :!://Viz skripta CZ [2006] str. 154// | + | |
| - | + | ||
| - | **Pro naučení doporučuji záznam z 9. přednášky 2014/2015 cca od 40:00 do 58:00, je to tam skvěle vysvětlené.** Stačí si pamatovat ty 4 fáze a umět vysvětlit první, tj. párování v bipartitním grafu, které se snadno pamatuje i bez vzorců. | + | |
| - | + | ||
| - | Off-line algoritmus, který pro libovolnou permutaci < | + | |
| - | + | ||
| - | Algoritmus má 4 fáze: | + | |
| - | + | ||
| - | < | + | |
| - | Fáze 1: Ve ∀ sloupcích, předpočítej permutace takové, aby v každém řádku M (n, n) | + | |
| - | ∃ nejvýše 1 paket určený pro daný sloupec. | + | |
| - | Fáze 2: Realizuj tyto permutace ve všech sloupcích paralelně. (∗ n − 1 kroků ∗) | + | |
| - | Fáze 3: Paralelně ve ∀ řádkách, zpermutuj pakety do správných sloupců. (∗ n − 1 kroků ∗) | + | |
| - | Fáze 4: Paralelně ve ∀ sloupcích, zpermutuj pakety do správných řádků. (∗ n − 1 kroků ∗) | + | |
| - | </ | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | Obrázek: Směrovací graf a párování pro SF mřížku. Postup: počáteční konfigurace je zadání, v jednotlivých uzlech jsou pakety a adresy, kam chtějí jít. Sestavím směrovací graf – v jeho levém sloupci jsou < | + | |
| - | + | ||
| - | + | ||
| - | Je důležité popsat, jak vlastně tu první fázi uděláte. Na to se používá Hallova věta o párování, | + | |
| - | + | ||
| - | **Věta 5, Hallova věta o párování** | + | |
| - | + | ||
| - | Libovolný < | + | |
| - | + | ||
| - | (Konkrétně Hallova věta je dobře vysvětlena na záznamu 10. přednáška roku 2008, viz [[https:// | + | |
| - | + | ||
| - | {{https:// | + | |
| - | + | ||
| - | Obrázek: Příklad bipartitního párování aka // | + | |
| - | ==== Řešení konkrétního příkladu ze zadání ==== | + | |
| - | {{: | + | |
| - | + | ||
| - | Směrovací graf | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | Vytvořená úplná párování | + | |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | Postup algoritmu po fázích (1. je po provedení permutací ve sloupcích) | + | |
| - | + | ||
| - | **Hint (by zatretom): | + | |
| - | + | ||
| - | Na termínu 9. 2. 2015 jsme měli provést permutaci podle konkrétního zadání - co si pamatuju, tak v zadání nebylo úplně napsaný, že chce popsat tu konstrukci permutace, co se dělá offline (spíš jsem to pochopil jako popsání, co mají splňovat ty tři permutace a proč to bude fungovat). Ano, pochopil jsem to špatně, chtěl tam tu konstrukci mít (bez ní dával 4/8 nebo i 0/8). Krokovat procházku je IMHO zdlouhavý, zkuste to takhle: | + | |
| - | + | ||
| - | Na směrovací graf se hodí pravítko, čar je tam hodně nevyznáte se v tom (nebo to musíte nakreslit hrozně velký) - jako náhrada pravítka dobře poslouží ISIC. Procházku jenom popiště, ale krokovat ji je hrozně zdlouhavý. Spíš si vezměte i tužku a gumu, nakreslete si mřížku a zkuste tu první fázi tipnout tužkou okometricky (metodou kouknu a vidím, dá se to do dvou minut). Ten rozpad na úplná párování můžete zpětně dokreslit podle toho, co jste vyšpekulovali. | + | |
| - | + | ||
| - | ===== Operace přeložení na indBFn, odvodit zakladní síťové zpoždení ===== | + | |
| - | + | ||
| - | indBF4 - operace prelozeni n=2k, odvodit zakladni sitove spozdeni | + | |
| - | + | ||
| - | ★ //Bylo ve zkoušce: [[par_zkouska_2012-01-17|2012-01-17]] ??// | + | |
| - | + | ||
| - | ==== Řešení ==== | + | |
| - | + | ||
| - | operace přeložení je na indBFn bezkolizní, | + | |
| - | + | ||
| - | Edit by plech.d: Přeložení je definováno jako xor n-bitovým řetězcem w. Operace je na motýlkovi bezkolizní, | + | |
| - | + | ||
| - | Cesty se tedy sestaví automatickým směrováním od začátku do konce bez překážky a jsou dlouhé n+1 kroků. | + | |
| - | + | ||
| - | Pro SF tedy platí: | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | Pro WH: | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | :?: t_d? to je asi chyba, predpokladam, | + | |
| - | + | ||
| - | Poznámka: Předpokládám, | + | |
| - | + | ||
| - | Poznámka 2: Pořád si nejsem jist, zda je hran n+1 nebo n. Zda se počítá hrana před 0-tým stupněm motýlka. Ale nevidím důvod, proč by se nepočítala, | + | |
| - | + | ||
| - | ====== Kolektivní komunikační algoritmy | + | |
| ===== Multicast na 2D mřížce ve WH síti ===== | ===== Multicast na 2D mřížce ve WH síti ===== | ||
| Line 1010: | Line 195: | ||
| Edit: Algoritmus upraven podle EN skript, str 159, text neodpovídal obrázkům. V CZ skriptech je zjevná chyba. | Edit: Algoritmus upraven podle EN skript, str 159, text neodpovídal obrázkům. V CZ skriptech je zjevná chyba. | ||
| Složitost algoritmu upravena podle náročnosti na hyperkrychli na str 158, měla by být stejná jako pro mřížku. | Složitost algoritmu upravena podle náročnosti na hyperkrychli na str 158, měla by být stejná jako pro mřížku. | ||
| - | ===== Binární výměna pro AAS v mřížce===== | ||
| - | |||
| - | Popište algoritmus binární výměny pro All to All Scatter (AAS) v | ||
| - | < | ||
| - | |||
| - | ★ //Bylo ve zkoušce: [[.: | ||
| - | |||
| - | ==== Řešení ==== | ||
| - | // | ||
| - | |||
| - | {{: | ||
| - | |||
| - | Algoritmus binární výměny je simulace AAS pro SF hyperkrychli. To dobře funguje, pokud délky stran jsou mocniny dvou. Do testu je třeba explicitně napsat, že se jedná o hyperkubický algoritmus. | ||
| - | |||
| - | - Mřížka se vždy rekurzivně půlí, např. střídavě ve směrech X a Y | ||
| - | - Celkový počet **fází, ale nikoliv kroků** je < | ||
| - | |||
| - | < | ||
| - | |||
| - | V každém kroku se mezi partnery vymění < | ||
| - | |||
| - | - fáze < | ||
| - | - fáze < | ||
| - | |||
| - | poslední fáze: < | ||
| - | |||
| - | vysvětlení vzorečku: 2 znamená dimenzi X a Y, v každé dimenzi proběhne < | ||
| - | |||
| - | < | ||
| - | |||
| - | Počet kroků (tedy < | ||
| - | |||
| - | Pozn: zacatek vysvetlen dobre v 20080520_X36PAR_cviceni11.avi, | ||
| ===== AAB na 2D toroidu, SF, všeportový, | ===== AAB na 2D toroidu, SF, všeportový, | ||
| Line 1076: | Line 228: | ||
| Najdeme dvě hranově disjunktní Hamiltonovské kružnice. Každý uzel rozdělí svůj paket na poloviny. Jednu polovinu pošle po jedné Hamiltonovské kružnici (oběma směry), druhou polovinu pošle po druhé Hamiltonovské kružnici (oběma směry). každá polovina putuje oběma směr, tj. stačí jí dojít jen do půlky kružnice. Počet kroků i čas vyjdou stejně. | Najdeme dvě hranově disjunktní Hamiltonovské kružnice. Každý uzel rozdělí svůj paket na poloviny. Jednu polovinu pošle po jedné Hamiltonovské kružnici (oběma směry), druhou polovinu pošle po druhé Hamiltonovské kružnici (oběma směry). každá polovina putuje oběma směr, tj. stačí jí dojít jen do půlky kružnice. Počet kroků i čas vyjdou stejně. | ||
| - | |||
| - | ===== Multicast na Qn ===== | ||
| - | |||
| - | ==== Řešení ==== | ||
| - | |||
| - | :!://Viz skripta CZ [2006] str. 178 nebo EN [2009] str. 157 a 155// | ||
| - | |||
| - | === Algoritmus === | ||
| - | |||
| - | Z cílové množinu uzlů < | ||
| - | |||
| - | - Použiji algoritmus RD (rekurzivní zdvojování) | ||
| - | - rozdělím pole na dvě poloviny. Pošlu ze zdroje zprávu nejbližšímu uzlu z druhé poloviny (přepokládám zdroj 0000) | ||
| - | - rekurzivně aplikuju to samé pořád dokola, dokud nejsou všichni informovaní - čili vzniklé dvě poloviny zase rozdělím na poloviny a posílám z informovaných uzlů do nových polovin zprávu | ||
| - | |||
| - | Informovaných uzlů musí být < | ||
| - | |||
| - | Pro směrování je použito e-cube směrování, | ||
| - | |||
| - | Pozn: Jelikož ADOC není standardní pojem v grafech, je nutné jej vysvětlit a poté i dokázat bezkoliznost na řetězci u,v,w,z jako ve skriptech. | ||
| ===== OAS na 2D toroidu | ===== OAS na 2D toroidu | ||
| Line 1353: | Line 485: | ||
| </ | </ | ||
| - | ====== Lineární algebra | + | ====== Lineární algebra ====== |
| ===== Transpozice na 2D mřízce, SF ===== | ===== Transpozice na 2D mřízce, SF ===== | ||
| Line 1437: | Line 569: | ||
| {{tag> | {{tag> | ||
| + | x | ||
users/martin.kocicka/pdp/8b.1497349099.txt.gz · Last modified: 2017/06/13 10:18 by martin.kocicka