PARALELNÍ PROCESY A PROGRAMOVÁNÍ 12 Paralelní algoritmy - paralelní prefixové součty Ing Michal Bližňák, PhD Zlín 2013 Tento studijní materiál vznikl za finanční podpory Evropského sociálního fondu (ESF) a rozpočtu české republiky v rámci řešení projektu: CZ 107/2200/150463, MOD- ERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD
OBSAH 1 Obsah 1 Motivace pro paralelizaci redukce 3 2 Sekvenční a paralelní redukce 3 3 Sekvenční a paralelní prefixová redukce 3 31 Sekvenční prefixový součet 4 32 Paralelní prefixový součet na CdT n 5 33 Paralelní prefixový součet na Q n 6 34 Paralelní prefixový součet na EREW PRAM 6 341 Neškálovaný paralelní prefixový součet na EREW PRAM 6 342 Škálovaný paralelní prefixový součet na EREW PRAM 6 35 Segmentový paralelní prefixový součet 9 4 Aplikace paralelní prefixové redukce 9 41 Zhušt ovací problém a paralelní PrefixSort 9 42 Binární sčítačka 10 43 Paralelní QuickSort 11 5 Kontrolní otázky 13
OBSAH 2 STRUČNÝ OBSAH PŘEDNÁŠKY Motivace pro paralelizaci redukce Sekvenční a paralelní redukce Sekvenční a paralelní prefixová redukce Aplikace paralelní prefixové redukce MOTIVACE Redukce a prefixové redukce jsou jedněmi z nejčastěji používaných (a implementovaných) paralelních algoritmů sloužících jako základ dalších, složitějších algoritmů V této přednášce se seznámíme se základními vlastnostmi a implementacemi redukčních algoritmů na různých paralelních systémech CÍL Seznámit se se základními vlastnostmi a implementačními aspekty některých paralelních redukčních algoritmů
Motivace pro paralelizaci redukce 3 1 Motivace pro paralelizaci redukce Obecná redukce prvků množiny/pole je velmi častým algoritmickým problémem Operátorem redukce můžeme chápat téměř jakoukoliv (matematickou) operaci schopnou zredukovat 2 operandy do jedné výsledkové hodnoty Typicky se může jednat o součet nebo násobení, obecně však lze redukční operátor nadefinovat libovolným způsobem (např sloučení bitmap, součet prvků vícerozměrných polí, atd) Je zřejmé že časová složitost redukce se bude úzce odvíjet o od časové složitosti samotného redukčního operátoru Je-li časová složitost redukčního operátoru dostatečně vysoká, bývá výhodné redukci více prvků paralelizovat, čímž lze dosáhnout zajímavého (ideálně lineárního) zrychlení Samozřejmě je nutné brát v úvahu vhodnou granularitu a škálovatelnost problému 2 Sekvenční a paralelní redukce Obecnou redukci více operandů lze definovat následovně: Necht je dáno vstupní pole X = {x 0, x 1,, x n 1 } prvků množiny D a binární operace nad D Pak cílem redukce je vypočítat hodnotu například tak, je je uvedeno v algoritmu 1 Algoritmus 1 Triviální sekvenční redukce S 0 for i = 0 to n 1 do S = S X[i] S = x 0 x 1 x n 1 (1) Dolní i horní mez tohoto problému je SL(n) = SU(n) = Θ(n), je-li problém řešen sekvenčně Vhodnou paralelizací redukce však lze celou operaci provést v čase O(log n) při zachování cenové optimality, jak bylo diskutováno v kapitole zabývající se analýzou časové složitosti paralelních algoritmů Příklady implementace paralelní redukce na různých paralelních systémech jsou uvedeny na obrázku 1 Jak je patrné, všechny systémy byly schopny z redukovat 8 hodnot, ve 3 krocích, čili v logaritmickém čase Pseudokód paralelní redukce implementované na EREW PRAM je uveden v algoritmu 2 Algoritmus 2 Triviální paralelní redukce for j = 1,, log n do sequentially for all i = 0 to n 1 step 2 j do in parallel P i : X[i] = X[i] X[i + 2 j 1 ] S X[0] 3 Sekvenční a paralelní prefixová redukce Prefixová redukce (prefixový součet) je zobecněním redukce diskutované v kapitole 2 a má stejné časové charakteristiky Zatímco u klasické redukce je výsledkem operace pouze jedna hodnota, u prefixové redukce n hodnot dostaneme po ukončení výpočtu n výsledků
Sekvenční a paralelní prefixová redukce 4 Obrázek 1: Implementace paralelní redukce na různých typech paralelních systémů [1] Mějme vstupní pole X = x 0, x 1,, x n 1 z množiny D a asociativní binární operaci nad D Výstupem výpočtu je stejně velké pole Y, kde y i je rovno redukci počátečních i hodnot z X Čili úkolem je vypočítat pole Y = y 0, y 1,, y n 1 všech prefixů pole X tak, že y i = x 0 x 1 x i, jak je naznačeno no obrázku 2 Obrázek 2: Vstup a výstup prefixové redukce [1] Pro jednoduchost budeme v dalších kapitolách jako redukční operátor uvažovat součet, nebude-li řečeno jinak 31 Sekvenční prefixový součet Sekvenční prefixový součet je velmi triviálním algoritmem a nepotřebuje bližšího zkoumání Časová složitost je opět Θ(n) a jeho pseudokód je uveden v algoritmu 3 Algoritmus 3 Sekvenční prefixová redukce Require: i: int; sum, X[n], Y[n] : D sum X[0]; Y [0] sum for i = 1 to n 1 do sum = sum X[i] Y [i] sum
Sekvenční a paralelní prefixová redukce 5 32 Paralelní prefixový součet na CdT n Implementace paralelního prefixového součtu (PPS) na topologii d-árního stromu CdT n je již daleko zajímavější Předpokládejme ICNW nepřímého stromu kde koncové listové uzly obsahují hodnoty, z nichž má být spočten PPS Pak PPS N vstupních hodnot v listech binárního stromu CBT výšky h(cbt ) lze vypočítat ve 2h(CBT ) krocích Je-li CBT úplný, pak PPS potřebuje O(log N) kroků Celá operace PPS se na CBT rozloží do několika vzestupných a sestupných vln Každá vzestupná vlna vygeneruje další vzestupnou vlnu (pokud jsme již nedosáhli kořene stromu) a h(cbt ) sestupných vln Obrázek 3: Vzestupné a sestupné vlny na CdT [1] Při vzestupné vlně se rodičovskému listu odesílá součet hodnot přicházejících od synů Zároveň je generována sestupná vlna tak, jak je patrné z obrázku 3 Hodnoty, které v rámci sestupných vln dorazí až ke konečným listům jsou přičteny k jejich aktuální hodnotě Po doznění všech vln obsahují koncové listové uzly kompletní PPS Celý algoritmus je ilustrován na obrázku 4 Obrázek 4: Paralelní prefixový součet na CBT [1]
Sekvenční a paralelní prefixová redukce 6 33 Paralelní prefixový součet na Q n Paralelní prefixový součet na hyperkrychli je implementován jako jednoduché rozšíření algoritmu vysílání všichni-ke-všem Předpokládejme že PPS bude sčítat N hodnot Dále předpokládejme binární hyperkrychli Q n kde n = log N PPS pak bude pomocí algoritmu 4 spočítán v čase O(log N) Princip výpočtu je jednoduchý Každý procesor P i bude obsahovat dva pomocné registry: zelený a žlutý Nejprve budou oba registry v daném procesoru inicializovány stejnou vstupní hodnotou Poté následuje n paralelních fází, ve kterých si procesory vzájemně vymění obsahy zelených registrů a přičtou je k obsahům svých vlastních zelených registrů Procesor, který má v rámci dimenze, po které data putovala, vyšší adresu, přičte příchozí hodnotu také ke svému žlutému registru Po vykonání všech n fází, při kterých byla data zasílána postupně přes všechny dimenze, budou žluté registry procesorů obsahovat kompletní hodnoty PPS Adresy konkrétních procesorů představují indexy výsledků v pomyslném výstupním poli Algoritmus 4 Paralelní prefixový součet na Q n Require: i: int; zeleny, zluty, X[N] : D for all P i, i = 0,, 2 n 1 do in parallel zeleny zluty X[i] for j = 0 to n 1 do sequentially send zeleny i P i XOR 2 j receive novyzeleny P i XOR 2 j zeleny i = zeleny i + novyzeleny if i XOR 2 j < i then zluty i = zluty i + novyzeleny end if Celý postup je ilustrován na obrázku 5 34 Paralelní prefixový součet na EREW PRAM V případě paralelního prefixového součtu na EREW PRAM si budeme demonstrovat dva typy vhodných algoritmů V prvním případě se bude jednat o neškálovaný PPS kde předpokládáme, že paralelní systém disponuje stejným množstvím procesorů, jako je počet sčítaných hodnot Je zřejmé, že takový algoritmus bude cenově neoptimální a tudíž neefektivní a proto si zde uvedeme také optimální škálovaný PPS 341 Neškálovaný paralelní prefixový součet na EREW PRAM Mějme n procesorů P 0,, P n 1 a pole X = x 0,, x n 1 uložené ve sdílené paměti M[0],, M[n 1] Každý P i má pomocný registr y i Neškálovaný výpočet PPS na EREW PRAM s časovou složitostí O(log n) je uveden v algoritmu 5 a jeho průběh je ilustrován na obrázku 6 342 Škálovaný paralelní prefixový součet na EREW PRAM Jak je patrné z obrázku 6, velké množství procesorů nemá v průběhu neškálovaného EREW PRAM PPS dostatek užitečné práce, čímž za předpokladu malé časové složitosti redukční operace narůstá podíl paralelní režie ve výpočtu a tím i paralelní cena Abychom dosáhli efektivní paralelizace, bude zapotřebí zvolit lepší granularitu a tím zajistit dostatek práce pro všechny procesory v průběhu celého výpočtu O to se snaží škálovaná varianta EREW PRAM PPS
Sekvenční a paralelní prefixová redukce 7 Obrázek 5: Paralelní prefixový součet na Q n [1] Obrázek 6: Neškálovaný paralelní prefixový součet na EREW P RAM [1] Uvažujme vstupní pole X = {x 0, x 1,, x n 1 } a p procesorů P 0,, P p 1 Necht q = n p Rozdělíme X do p subpolí X 0,, X p 1 po q prvcích a přidělíme každé X i příslušnému P i V první fázi každý P i vypočte prefixový součet nad X i sekvenčně Tato fáze zabere O( n p ) kroků Ve druhé fázi bude vypočten prefixový součet nad pravými krajními hodnotami všech p subpolí X i Jelikož je počet subpolí stejný jako počet procesorů, lze tuto fázi implementovat pomocí neškálovaného EREW PRAM PPS a provést ji v O(log p) krocích V závěrečné třetí fázi bude ke všem hodnotám subpolí X i, i = 1,, p 1 s výjimkou nejpravějšího prvku přičtena hodnota nejpravějšího prvku subpole X i 1 Tato operace bude trvat opět O( n p ) kroků Po této operaci bude pole X obsahoval kompletní PPS všech vstupních hodnot Celková časová složitost výpočtu bude T (n, p) = O( n p + log p), což za předpokladu n p zaručuje cenovou opti-
Sekvenční a paralelní prefixová redukce 8 Algoritmus 5 Neškálovaný paralelní prefixový součet na EREW P RAM Require: i, j : int; y i, M[n] : D for all P i, i = 0 to n 1 do in parallel y i M[i] for j = 0 to log n 1 do sequentially for all P i, i = 2 j to n 1 do in parallel y i = y i + M[i 2 j ] for all P i, i = 2 j to n 1 do in parallel M[i] = y i malitu výpočtu i při nízké časové složitosti redukční operace Pseudokód škálovaného PPS na EREW PRAM je uveden v algoritmu 6 Algoritmus 6 Škálovaný paralelní prefixový součet na EREW P RAM Require: i, j : int; S i [q], X[n], Z[p] : D for all P i, i = 0 to p 1 do in parallel P i sekvenčně výpočte pole S i = prefixový součet nad X i Z[i] S i [q 1] všechny P i vypočtou paralelně PPS nad Z pomocí algoritmu 5 for all P i, i = 1 to p 1 do in parallel for j = 0 to j < q 1 do S i [j] = S i [j] + Z[i 1] S i X i Průběh algoritmu 6 je ilustrován na obrázku 7 Obrázek 7: Škálovaný paralelní prefixový součet na EREW P RAM [1]
Aplikace paralelní prefixové redukce 9 35 Segmentový paralelní prefixový součet Segmentový paralelní prefixový součet (SPPS) je takovou modifikací základního algoritmu, kdy je vstupní pole o velikosti n rozděleno na s nestejně velkých segmentů S i a prefixové součty jsou spočteny pro segmenty Tabulka 1: Vstupní a výstupní pole segmentového PS Vstup 2 1 3 5 2 7 3 9 4 5 6 2 8 4 3 1 Výstup 2 3 6 11 2 9 12 9 13 18 24 2 10 14 17 18 Znaménko u operandů v tabulce 1 představuje krajní hodnoty u hranic segmentů Řešení tohoto problému je několik Uvažujme p jako počet procesorů P i Je-li s = p pak lze jednotlivé segmenty S i přidělit procesorům P i, které nad nimi spočtou prefixový součet v čase Θ(q i ) kde q i je počet prvků v segmentu S i Jelikož mají segmenty obecně různou velikost (a v extrémním případě budou všechny prvky obsaženy v jednom segmentu), bude celkový čas výpočtu T (n, p) = Θ(max{q i }) = O(n) Je-li n = p pak lze SPPS vypočíst v celkovém čase T (n, p) = O(log n) pomocí algoritmu 5 a modifikovaného operátoru jehož chování je popsáno v tabulce 2 Tabulka 2: Modifikovaný redukční operátor b b a a b b a (a b) b 4 Aplikace paralelní prefixové redukce Význam prefixového součtu (PS) není ani tak v implementaci samotného algoritmu ale v tom, že PS slouží jako základ dalších, složitějších algoritmů V následujících kapitolách si představíme některé z nich 41 Zhušt ovací problém a paralelní RadixSort Jednou z typických aplikací PS je implementace zhušt ovacího problému zmíněného v kapitole pojednávající o směrování v ICNW Uvažujme, že jistá podmnožina z p procesorů připojených ke vstupům nepřímé vícestupňové sítě typu n-rozměrný motýlek obf n má paket, který je nutno dopravit na druhou výstupní stranu sítě tak, aby i-tý paket, počítáno na vstupech odshora, skončil na i-tém výstupním vodiči shora Díky aplikaci PPS lze u zhušt ovacího problému rychle (v čase O(log p)) spočíst indexy cílových uzlů, tak jak je naznačeno na obrázku 8 Každý uzel, který drží paket bude obsahovat také hodnotu 1 ve vstupním poli PPS, uzel bez paketu bude obsahovat hodnotu 0 Z těchto hodnot bude spočten PS (např pomocí PPS implementovaného na stromě vnořeného do motýlka) čímž bude po závěrečné normalizaci indexů každý uzel vědět, kam má poslat svůj paket, aby byly na konci permutace zhuštěny do horní poloviny sítě Samotný zhušt ovací problém je pak základem dalšího algoritmu určeného pro paralelní třídění binárních hodnot nazvaného RadixSort Principem algoritmu je postupné třídění na základě zkoumání hodnot bitů jednotlivých řádů Necht X je posloupnost n k-bitových čísel, nultý bit je vpravo RadixSort je třídicí algoritmus, který není založen na porovnávání dvojice čísel, ale na permutaci, kterou značíme Split(X,i): čísla s
Aplikace paralelní prefixové redukce 10 Obrázek 8: Zhušt ovací problém na obf n a) počáteční hodnoty příznaků a jeden možný nepřímý strom, b) pole příznaků po PPS, c) konečné hodnoty indexů cílových řádků [1] nulovým i-tým bitem jsou zhuštěna doleva, čísla s jedničkovým i-tým bitem jsou zhuštěna doprava tak, jak je ilustrováno na obrázku 9 Algoritmus 7 Implementace paralelního třídění RadixSort Require: i: int; X[0,, 2 k 1] : D for i = 0 to k 1 do sequentially Split(X,i) Obrázek 9: Implementace paralelního RadixSortu pomocí zhušt ovacího problému [1] 42 Binární sčítačka Další z možných aplikací PS je rychlá binární sčítačka Mějme 2 n-bitová binární slova která chceme sečíst po bitech a p = n procesorů Díky existenci přenosu mezi vyššími řády při sčítání bitů binárních slov je dolní i horní sekvenční mez tohoto
Aplikace paralelní prefixové redukce 11 problému SL(n) = SU(n) = Θ(n) Paralelizací jsme schopni tento problém vyřešit v čase T (n, p) = O(1) + O(log n) Princip algoritmu je následující: Mějme dvě binární slova o velikosti n organizovaná jako bitová pole X = {x 0,, x n 1 } a Y = {y 0,, y n 1 } Výstupem bude součet těchto slov uložený v n-bitovém slovu Z = {z 0,, z n 1 } Postup výpočtu bude následující: 1 Všechny procesory P i vypočtou paralelně obsah slova B = {b 0,, b n 1 } tak, že porovnají bity x i a y i pomocí níže uvedeného předpisu: { (g)enerate ifxi = y i = 1 b i =, (s)top if x i = y i = 0, (p)ropagate jinak Doba trvání této operace bude T (n, p) = O(1) 2 Pomocí PPS a operátoru z tabulky 3 nad polem B vypočti pole B v čase T (n, p) = O(log n) Tabulka 3: Modifikovaný redukční operátor pro binární sčítačku s p g s s s s p s p g g g g g 3 Všechny procesory P i vypočtou přenosové slovo C = {c 0,, c n 1 } tak, že c 0 = 0 a c i = 1 b i 1 = g v čase T (n, p) = O(1) 4 Všechny procesory P i vypočtou výsledné slovo Z = {z 0,, z n 1 } tak, že z i = x i y i c i kde operátor představuje binární součet bez přenosu Doba této operace bude T (n, p) = O(1) Celý algoritmus je ilustrován na obrázku 10 Obrázek 10: Implementace paralelní binární sčítačky [1] 43 Paralelní QuickSort Využití SPPS si ukážeme na příkladu jedné z možných implementací paralelního třídicího algoritmu QuickSort Předpokládejme nesetříděné pole A[n] a p = n procesorů Princip činnosti algoritmu je pak následující:
Aplikace paralelní prefixové redukce 12 Algoritmus 8 Implementace paralelního třídicího algoritmu QuickSort pomocí SPPS Require: i: int; e: bool; A[n], S n [n], F [n], b s : D start: for all i = 0 to n 2 do in parallel f i = (a + i a i+1 ) Proved paralelní redukci hodnot f i pomocí operace AND a výsledek ulož do e if e = T RUE then EXIT end if for all aktuální segmenty S v A do in parallel vyber pivot b s S i [0] pošli b s všem procesorům uvnitř segmentu for all a i S do in parallel g i = (a i <> b s ), kde g i { <, =, > } /* každý S rozdělíme na 3 podsegmenty S <, S = a S > */ pomocí SPPS vypočti nové indexy prvků a i : g i = < uvnitř všech S pošli hodnoty maximálního indexu (= S < ) uvnitř všech S /* S < je rovno indexu začátku S = */ pomocí SPPS vypočti nové indexy prvků a i : g i = = uvnitř všech S pošli hodnoty maximálního indexu (= S = ) uvnitř všech S /* S < + S = je rovno indexu začátku S > */ pomocí SPPS vypočti nové indexy prvků a i : g i = > uvnitř všech S permutací segmentu S vytvoř 3 nové segmenty S = {S < S = S > } goto start
Kontrolní otázky 13 5 Kontrolní otázky Jaký je rozdíl mezi redukcí a prefixovou redukcí? Uved te alespoň 3 příklady implementace paralelní redukce na různých typech paralelních systému Uved te alespoň 3 příklady implementace paralelní prefixové redukce na různých typech paralelních systému Jaký je princip segmentové paralelní prefixové redukce? Uved te některé možné aplikace paralelní prefixové redukce
REFERENCE 14 Reference [1] Pavel Tvrdík Paralelní systémy a algoritmy Vydavatelství ČVUT, Praha, 2005