PARALELNÍ PROCESY A PROGRAMOVÁNÍ 8 Paralelní výpočetní modely Ing. Michal Bližňák, Ph.D. 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 1.07/2.2.00/15.0463, MOD- ERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD
OBSAH 1 Obsah 1 Parallel Random Access Machine (PRAM) model 3 1.1 Vlastnosti PRAM modelu................................. 4 1.2 Omezení PRAM modelu.................................. 4 1.2.1 Souběžný přístup do sdílené paměti....................... 4 1.3 Výpočetní síla PRAM podmodelů............................ 5 1.4 Cena, optimalita a efektivnost PRAM algoritmů.................... 6 2 Simulace velkého PRAM na malém PRAM 6 3 Simulace silnějšího PRAM na slabším PRAM 7 4 Asynchronní PRAM (APRAM) model 9 4.1 APRAM výpočet...................................... 9 4.2 Výkonostní parametry modelu APRAM......................... 10 5 Kontrolní otázky 11
OBSAH 2 STRUČNÝ OBSAH PŘEDNÁŠKY Parallel Random Access Machine (PRAM) model Simulace velkého PRAM na malém PRAM Simulace silnějšího PRAM na slabším PRAM Asynchronní PRAM (APRAM) model MOTIVACE Paralelní výpočetní modely slouží jako teoretické rámce stanovující podmínky pro výpočet časové složitosti paralelních algoritmů, kterou kromě počtu procesorů a povahy algoritmu ovlivňuje také použitá pamět ová architektura a způsob přístupu do sdílených pamět ových oblastí. Tato kapitola pojednává o modelu PRAM a jeho vlastnostech a derivátech. CÍL Obeznámit se s výpočetním modelem PRAM a jeho základními vlastnosti. Pochopit, jak jednotlivé podmodely PRAM ovlivňují časovou a prostorovou složitost paralelního algoritmu.
Parallel Random Access Machine (PRAM) model 3 1 Parallel Random Access Machine (PRAM) model PRAM model je jednoduchý model SIMD SMP systému. Vychází z klasického RAM (Random Access Machine) modelu, který je definován těmito vlastnostmi [1]: Základem RAM je výpočetní jednotka s uživatelsky definovaným programem. Pro čtení vstupních dat používá vstupní pásku a pro zápis výstupních dat výstupní pásku. Počet lokálních pamět ových buněk je neomezený. Pamět ové buňky jsou schopny obsahovat čísla neomezené velikosti. Systém podporuje instrukce pro aritmetické, logické a I/O operace a větvení toku programu. Výpočet začne první instrukcí a skončí po provedení instrukce HALT. Všechny instrukce trvají jednotkový čas bez ohledu na délku operandů. Časová složitost je definována jako počet provedených instrukcí. Pamět ová složitost je definována jako počet použitých pamět ových buněk. PRAM model je zobecněním RAM modelu; místo jednoho procesoru bude použito více procesorů připojených ke společné paměti. Tyto procesory budou pracovat synchronně jako u SIMD počítače. Další vlastnosti specifické pro PRAM model jsou: PRAM obsahuje neomezený počet procesorů P 1, P 2,..., P p. Pamět je tvořena neomezeným počtem sdílených pamět ových buněk M[1], M[2],..., M[n]. Každý P i má vlastní neomezenou lokální pamět a zná svůj index i. Každý procesor může přistupovat to kterékoliv sdílené pamět ové buňky v jednotkovém čase. Vstup a výstup PRAM algoritmu se skládá z n/n položek uložených ve sdílené paměti. PRAM instrukce tvoří vždy 3-fázové cykly: 1. Čti data ze sdílené paměti do svého registru 2. Proved lokální výpočet 3. Zapiš data ze svého registru do sdílené paměti Procesory provádějí tyto PRAM instrukce synchronně. Konflikty souběžného čtení či zápisu do sdílené paměti je zapotřebí explicitně ošetřit. Procesory mohou komunikovat pouze čtením/zápisem do sdílené paměti. P 1 má speciální aktivační registr obsahující nejvyšší index aktivního procesoru: 1. Na počátku je aktivní pouze P 1 2. P 1 spočítá počet požadovaných aktivních procesorů a nastaví aktivační registr 3. Poté začnou provádět své programy ostatní aktivní procesory Výpočet běží až do doby, kdy se P 1 zastaví (v té době již budou všechny ostatní procesory neaktivní) Paralelní časová složitost je rovna času výpočtu P 1. Prostorová složitost je rovna počtu použitých pamět ových buněk.
Parallel Random Access Machine (PRAM) model 4 1.1 Vlastnosti PRAM modelu Ačkoliv PRAM model ignoruje určitá omezení a detaily nižších vrstev paralelního systému, je pro tvůrce paralelních algoritmů důležitý, protože: je přirozený, nebot počet operací provedených v jednom cyklu na p procesorech je nejvýše p. je výpočetně silný, nebot jakýkoliv procesor může číst či zapisovat do sdílené pamět ové buňky v jednotkovém čase. je jednoduchý, nebot zanedbává komunikační a synchronizační režie. může sloužit jako zkušební model - neexistuje-li pro daný problém rozumný/efektivní PRAM model, nemá smysl se snažit vymýšlet rozumný/efektivní řešení na reálném paralelním systému. je užitečný, nebot je idealizací existujících paralelních počítačů se sdílenou pamětí (SMP). 1.2 Omezení PRAM modelu Prakticky použitelné PRAM algoritmy musí počítat s omezeními, kterými je nutné korigovat některé velkorysé předpoklady základního PRAM modelu a to zejména: Omezení velikosti slova: velikost slova procesorů nebo pamět ová buňky je omezena. Malé PRAM: počet procesorů je v reálném světe omezen. Pokud je počet procesorů PRAM modelu vyšší, fyzické procesory se musí mezi nimi přepínat v režimu sdílení času. PRAM s malou pamětí: počet buněk sdílené paměti je omezen. Konflikty přístupu do paměti: pro současný přístup z více procesorů do jedné sdílené pamět ové buňky jsou definovány jasné omezující podmínky, kterým se budeme věnovat v následující kapitole. 1.2.1 Souběžný přístup do sdílené paměti Z hlediska nutnosti ošetření souběžného přístupu ke sdíleným pamět ovým buňkám bylo definováno několik podmodelů stanovujících podmínky omezující souběžné přístupy k jedné pamět ové buňce. Jedná se o podmodely Exclusice Read Exclusive Write (EREW) PRAM - Žádným dvěma procesorům není povoleno číst ani zapisovat do téže pamět ové buňky současně. Concurent Read Exclusive Write (CREW) PRAM - Současné čtení téže pamět ové buňky je povole, zapisovat však může v daný okamžik pouze jeden procesor. Exclusive Read Concurent Write (ERCW) PRAM - Číst sdílenou pamět ovou buňku může v daný omakžik pouze jeden procesor, současné zápisy do sdílené paměti je povoleno víc procesorům. Concurent Read Concurent Write (CRCW) PRAM - Jsou povolena jak současná čtení, tak i zápisy do sdílené pamět ová buňky. Je zřejmé že případy souběžného zápisu (Concurent Write) je nutné dále upřesnit pomocí rozšiřujících podmodelů:
Parallel Random Access Machine (PRAM) model 5 Prioritní (Priority) CRCW - Procesorům jsou přiděleny pevné priority a fyzický zápis je povolen pouze procesoru s nejvyšší prioritou ve skupině žadatelů. Náhodný (Arbitrary) CRCW - Ukončit zápis je povoleno náhodně vybranému procesoru. Shodný (Common) CRCW - Existuje-li více žádostí o zápis do dané pamět ové buňky, musí být zapisovaná hodnota ve všech žádostech shodná. Výše uvedené podmodely ovlivňují také celkový paralelní čas algoritmu. Uved me si jednoduchý příklad. Příklad Uvažujme p procesorový PRAM kde p < n a pole n nesetříděných hodnot uložených ve sdílené paměti obsahující n různých položek. Procesor P 1 vlastní hodnotu x. Úkolem je oznámit procesoru P 1, zda se hodnota x nalézá ve vstupním poli. 1. EREW PRAM algoritmus: (a) Procesor P 1 rozešle procesorům P 2,..., P p hodnotu x v log p krocích pomocí binární distribuce kopií. (b) Každý procesor provede lokální hledání v n/p položkách v n/p krocích. (c) Každý procesor nastaví příznak Nalezeno a všechny procesory povedou paralelní redukci hodnot těchto příznaků pomocí binárního redukčního stromu v čase O(log p). Celkový paralelní čas je tedy T (n, p) = O(log p + n/p). 2. CREW PRAM algoritmus: Řešení je podobné jako u EREW podmodelu pouze s tím rozdílem, že procesory P 2,..., P n si mohou načíst hledanou hodnotu souběžně ze sdílené pamět ové buňky v čase O(1). Paralelní čás závěrečné redukce však zůstává stejný a pro se nemění ani asymptotické vyjádření celkového paralelního času, které je tedy stejně jako minule T (n, p) = O(log p+n/p). 3. Shodný CRCW PRAM algoritmus: V této modifikaci trvá také závěrečný krok algoritmu konstantní čas O(1) nebot ty procesory, které nastavily příznak Nalezeno na hodnotu 1, mohou provést zápis do sdílené výsledkové pamět ové buňky procesoru P 1 současně v jednom kroku. Celkový paralelní čas poté bude T (n, p) = O(n/p), čímž jsme se dostali k optimálnímu řešení. 1.3 Výpočetní síla PRAM podmodelů Jak bylo patrné z příkladu v kapitole 1.2.1, omezení uvalená na jednotlivé podmodely PRAM ovlivňují také časovou složitost algoritmů a proto můžeme hovořit o výpočetní síle jednotlivých PRAM podmodelů. Definice 1 PRAM podmodel A je výpočetně silnější než podmodel B, psáno A B, jestliže jakýkoliv algoritmus napsaný pro PRAM počítač B poběží na stejně velkém PRAM počítači A beze změny a s tímtéž paralelním časem. Lemma 1 Prioritní CRCW Náhodný CRCW Shodný CRCW CREW EREW
Simulace velkého PRAM na malém PRAM 6 1.4 Cena, optimalita a efektivnost PRAM algoritmů Definice 2 Necht K je problém s množinou vstupních dat o velikosti n. Předpokládejme, že K lze řešit na p-procesorovém PRAM počítači algoritmem A v čase T (n, p). Pak řekneme, že 1. A je efektivní, jestliže T (n, p) = O(log O(1) n) a C(n, p) = O(SU(n) log O(1) n) 2. A je cenově optimální, jestliže T (n, p) = O(log O(1) n) a C(n, p) = O(SU(n)) 3. A je plně paralelní, jestliže T (n, p) = O(1) a p = O(SU(n)) Plně paralelní algoritmy jsou tedy cenově optimální. 2 Simulace velkého PRAM na malém PRAM Model PRAM neomezuje návrháře paralelních algoritmů ani z hlediska počtu procesorů ani z hlediska počtu sdílených pamět ových buněk. Situace se však může radikálně změnit při implementaci takového PRAM algoritmu na reálném PRAM počítači (SMP), který nedisponuje potřebným počtem procesorů nebo buněk sdílené paměti. V takovém případě je potřeba přistoupit k simulaci velkého PRAM počítače na malém. Věta 1 Předpokládejme, že p < p. Uvažujme algoritmus A, který běží na p-procesorovém PRAM v t krocích. Pak lze A simulovat na p -procesorovém PRAM v t = O(t p/p ) krocích za předpokladu, že velikost sdílené paměti je stejná. Důkaz. 1. Rozdělme p simulovaných procesorů do p skupin o velikosti p/p. 2. Přiřad me každému z p simulujících procesorů jednu skupinu. 3. Každý simulující procesor simuluje jeden krok své skupiny procesorů: (a) provedením nejdříve všech jejích operací READ a lokálních výpočtů, (b) provedením jejich operací WRITE poté. Důležitým důsledkem je, že Každý PRAM algoritmus s cenou C(n, p) lze provést sekvenčně v čase T (n, 1) = C(n, p). Pokud jsme navrhli PRAM algoritmus s cenou C(n, p) = o(su(n)), pak jsme automaticky navrhli nový nejlepší sekvenční algoritmus. V případě, že omezení reálného PRAM počítače spočívá v nedostatečném velikosti sdílené paměti, je možné chybějící pamět ové buňky simulovat v lokální paměti procesorů. Simulující procesory tak budou simulovat jak procesory původní, tak také chybějící velkou sdílenou pamět pomocí svých malých lokálních pamětí. Věta 2 Předpokládejme, že m < m a uvažujme algoritmus A, který běží na p-procesorovém PRAM s m pamět ovými buňkami v t krocích. Pak lze A simulovat na p = max(p, m )-procesorovém PRAM s m pamět ovými buňkami v t = O(t m/m ) krocích.
Simulace silnějšího PRAM na slabším PRAM 7 Důkaz. Pamět ové buňky simulovaného a simulujícího počítače budeme označovat M[1,..., m] a M [1,..., m ]. 1. Rozdělme m simulovaných sdílených pamět ových buněk do m souvisejících úseků S i o velikosti m/m. 2. Každý simulující procesor P i, 1 i p, bude simulovat P i původního PRAM. 3. Každý simulující procesor P i, 1 i m, uloží počáteční obsah S i do své lokální paměti a bude používat M [i] jako pomocnou pamět ovou buňku pro simulování přístupu k buňkám S i. 4. Simulace jedné původní operace READ: Každý procesor P i, i = 1,..., max(p, m ), opakuje pro k = 1,..., m/m : (a) je-li i 1,..., m, zapiš hodnotu k-té buňky svého úseku S i do M [i]. (b) je-li i 1,..., p a v nějakém M [j] se objevila hodnota, kterou by simulovaný procesor P i četl v tomto simulovaném kroku, přečti ji. 5. Lokální výpočetní krok procesoru P i, i = 1,..., p, je simulován procesorem P i v jednom kroku. 6. Simulace jedné operace WRITE je analogická simulaci operace READ. Časová složitost simulace pak plyne z faktu, že jeden krok původního algoritmu je simulován v t = O(m/m ) + 1 + O(m/m ) = O(m/m ) krocích. 3 Simulace silnějšího PRAM na slabším PRAM Jak již bylo zmíněno v kapitole 1.3, různé podmodely PRAM mají různou výpočetní sílu. Při návrhu paralelního algoritmu se může stát, že výpočetní síla použitého podmodelu je vyšší, než výpočetní síle reálného PRAM počítače, např. pokud HW počítače neumí ošetřit konflikty přístupu do sdílených pamět ových buněk. V takovém případě je nutné přikročit k SW řešení konfliktních situací, tj. k simulaci výpočetně silnější PRAM podmodelu na výpočetně slabším PRAM počítači. Vzhledem k tomu, že možných simulačních kombinací je velké množství, zaměříme se na extrémní případ simulace výpočetně nejsilnějšího prioritního CRCW PRAM na výpočetně nejslabším EREW PRAM. Uved me si dvě možné simulační metody. Věta 3 Uvažujme Prioritní CRCW PRAM s prioritním systémem založeným na indexování procesorů a to takovým, že procesory s nižším indexem mají vyšší prioritu. Jeden krok p-procesorového Prioritního CRCW PRAM s m buňkami sdílené paměti lze simulovat na p-procesorovém EREW PRAM s m p buňkami sdílené paměti v t = O(log p) krocích. Důkaz. 1. Každý procesor P k, k = 1,..., p, v Prioritním CRCW je simulován EREW procesorem P k. 2. Každá buňka sdílené paměti M[i], i = 1,..., m, v Prioritním CRCW je simulována polem p buněk sdílené paměti M [i, k], k = 1,..., p, na EREW. M [i, 1] hraje roli M[i]. M [i, 2],..., M [i, p] jsou pomocné buňky organizované jako vnitřní uzly úplného binárního stromu T i s p listy, i = 1,..., m. Výška stromu T i je log p. 3. Simulace kroku prioritní WRITE. Každý EREW procesor musí zjistit, zda je procesorem s nejmenším indexem v rámci skupiny procesorů, žádajících o zápis do téže buňky. Pokud ano, je vítězem skupiny a může provést zápis. Postup je následující:
Simulace silnějšího PRAM na slabším PRAM 8 (a) Všechny buňky pomocných polí M [i, ] mají nastavený příznak s na prázdný. (b) Pokud chce P k zapisovat do M[i], procesor P [k] se stane aktivním a stane se k-tým listem stromu T i. Ví, zda je pravým či levým listem vzhledem ke svému rodiči, tj. dané buňce pomocného pole M [i, ]. (c) Každý aktivní levý procesor uloží své ID do rodičovské buňky ve svém stromě, nastaví její příznak s na obsazená a zůstane aktivní. (d) Každý aktivní pravý procesor zkontroluje svou rodičovskou buňku. Je-li s = prázdná, uloží do ní své ID, nastaví s na obsazená a zůstane aktivní. V opačném případě se přepne do stavu neaktivní. (e) Toto se opakuje log p-krát na dalších hladinách stromu. (f) Procesor, kterému se podařilo postoupit do kořene T i se stává vítězem, který může zapsat do M [i, 1]. Procesory, které používaly strom T i ho pak musí projít dolů v opačném pořadí a vynulovat příznak s. 4. Simulace kroku Prioritní READ je podobná. (a) Paralelně se provedou stejné průchody stromy T i směrem nahoru, aby se určili vítězové ve skupinách. (b) Vítězové přečtou hodnotu z buněk M [, 1]. (c) Během zpětného průchodu stromy T i směrem dolů si procesory, které prohrály, kromě nastavování příznaku s kopírují načtenou hodnotu. Druhý simulační algoritmus má stejně jako předchozí optimální časovou složitost (i když skrytá konstanta je větší), ale vyžaduje pomocné pole, kde stačí pouze jedna buňka na jeden simulovaný procesor. Věta 4 Uvažujme Prioritní CRCW PRAM, kde procesory s nižším indexem mají vyšší prioritu. Jeden krok Prioritního CRCW PRAM s p procesory a m buňkami sdílené paměti lze simulovat na EREW PRAM s p procesory a m + p buňkami sdílené paměti v t = O(log p) krocích. Důkaz. 1. Každý procesor P k, k = 1,..., p, v Prioritním CRCW je simulován EREW procesorem P k. 2. Každá buňka M[i], i = 1,..., m, v Prioritním CRCW je simulována EREW buňkou M [i]. 3. EREW používá pomocné pole A s p buňkami. 4. Chce-li P k přístup do M[i], procesor P k zapíše do buňky A[k] dvojici (i, k), v opačném případě zapíše dvojici (0, k). 5. Všech p procesorů provede paralelní setřídění pole A podle indexů procesorů lexikograficky vhodným EREW algoritmem s časovou složitostí O(log p)). 6. Každý P k připojí k buňce A[k] příznak s, kde: 0 je-li první položka dvojice A[k] bud rovna 0 nebo je-li shodná s první položkou s = předchozí dvojice A[k-1], 1 jinak. Další kroky se liší podle toho, zde simulujeme WRITE nebo READ.
Asynchronní PRAM (APRAM) model 9 7. Prioritní WRITE: (a) Každý P k přečte trojici (i, j, s) ze své buňky A[k] a zapíše ji do A[j] (tato permutace je bezkonfliktní). V tomto okamžiku má každý procesor P k ve své buňce A[k] zpět svoji trojici (, k, ). (b) Každý P k přečte trojici (i, k, s) ze své buňky A[k]. Je-li s = 1, stal se vítězem a může zapsat do M[i] svoji hodnotu. 8. Prioritní READ: (a) Každý P k přečte trojici (i, j, s) ze své buňky A[k]. (b) Každý P k s s = 1 přečte hodnotu v i z M [i] a uloží ji do trojice (i, j, v i ). Jelikož ale díky předchozímu třídění došlo k permutaci trojic, není prozatím v A[k] jeho vlastní výsledek. (c) Sémantika operace Prioritní READ je taková, že každý, kdo požádal o čtení, by měl obsah požadované buňky dostat. Vzhledem k tomu, že sousední buňky v setříděném poli A obsahují požadavky na stejné pamět ové buňky, provedou všechny procesory pomocí EREW algoritmu binárního zdvojování jednoduše rozkopírování trojice (i,, v i ) do všech (i,, 0) v O(log p) krocích. (d) Každý P k přečte trojici (i, j, v i) ze své buňky A[k] a uloží ji do A[j]. Tím se požadavek dostává do buňky svého původce. (e) Každý P k, který žádal o READ si přečte hodnotu v i z trojice (i, k, v i ) ze své buňky A[k]. 4 Asynchronní PRAM (APRAM) model Reálné paralelní počítače se vetšinou od idealizovaného PRAM modelu liší v několika důležitých skutečnostech: jednak jejich procesory nepracují synchronně a navíc přístup do sdílené paměti je časově náročnější než přístup do lokálních registrů. Z tohoto důvodu je užitečné mít k dispozici model, který bude lépe reflektovat možnosti reálných počítačů. Tím může být například model APRAM (Asynchronous PRAM), který se od klasického PRAM odlišuje těmito vlastnostmi: procesory pracují asynchronně, procesory je potřeba explicitně synchronizovat, a doba přístupu do sdílené paměti není jednotková. 4.1 APRAM výpočet APRAM výpočet může provádět instrukce 4 typů: 1. Globální čtení - přečte obsah sdílené pamět ové buňky do lokální paměti. 2. Lokální výpočet - provede jakoukoliv RAM instrukci s operandy a výsledky uloženými v lokální paměti. 3. Globální zápis - zapíše hodnotu z lokální paměti do sdílené paměti. 4. Bariérová synchronizace - každý proces se v bodě bariéry zastaví až do doby, než k ní dorazí všechny zbývající procesy, pro které byla bariéra definována. Výpočet na APRAM je pak definován jako posloupnost asynchronně prováděných globálních fází oddělených bariérovou synchronizací. V rámci daných globálních fází musí být zápis do sdílených pamět ových buněk exkluzivní.
Asynchronní PRAM (APRAM) model 10 4.2 Výkonostní parametry modelu APRAM Složitost jednotlivých APRAM operací je následující: Složitost lokální operace je 1. Složitost globální operace čtení nebo zápisu je obecně d. Pro jednoduchost předpokládáme, že d 2 je konstanta. Složitost implementace bariéry b(p) je vždy neklesající funkcí p, kde d b(p) p. Typické hodnoty jsou b(p) = Θ(d log p) pro implementaci pomocí binárního redukčního stromu nebo b(p) = Θ(d p) pro implementaci pomocí centrálního čítače [1]. k po sobě jdoucích operací globálního čtení nebo zápisu má složitost d + k 1, ne d k, jak by se dalo předpokládat, což odráží vlastnosti současných sběrnicových systémů [1].
Kontrolní otázky 11 5 Kontrolní otázky Co je to výpočetní model PRAM a k čemu slouží? Jaké rozličujeme výpočetní podmodely PRAM z hlediska řízení souběžného přístupu k pamět ovým buňkám? Jakým způsobem ovlivňuje simulace většího PRAM na menším časovou a pamět ovou složitost algoritmu? Jakým způsobem ovlivňuje simulace silnějšího PRAM na slabším časovou a pamět ovou složitost algoritmu?
REFERENCE 12 Reference [1] Pavel Tvrdík. Paralelní systémy a algoritmy. Vydavatelství ČVUT, Praha, 2005.