3 \prednaska{5}{Paralelní sèítání, bitonické tøídìní}{(zapsal: Petr Jankovský)}
5 \h{Sèítání binárních èísel}
7 Mìjme dvì èísla $x$ a $y$ zapsané ve~dvojkové soustavì. Jejich èíslice nazývejme
8 jako $x_{n-1}\ldots x_0$ a $y_{n-1}\ldots y_0$, kde $i$-tý øád má váhu $2^i$. Nyní budeme chtít tato èísla
11 K tomuto úèelu se~ihned nabízí pou¾ít starý dobrý \uv{¹kolní algoritmus}, který
12 funguje ve~dvojkové soustavì stejnì dobøe jako v~desítkové. Zkrátka sèítáme èísla
13 od~prava doleva. V¾dy seèteme pøíslu¹né èíslice pod~sebou a~pøièteme pøenos z~ni¾¹ího
14 øádu. Tím dostaneme jednu èíslici výsledku a~pøenos do~vy¹¹ího øádu. Formálnì
15 bychom to mohli zapsat tøeba takto:
17 z_i=x_i \oplus y_i \oplus c_i,
19 kde $z_i$ je $i$-tá èíslice souètu, $\oplus$ znaèí operaci {\sc xor} (souèet modulo~2) a~$c_i$ je {\I pøenos}
20 z~$(i-1)$-ního øádu do~$i$-tého. Pøenos pøitom nastane tehdy, pokud se~nám potkají
21 dvì jednièky pod~sebou, nebo kdy¾ se~vyskytne alespoò jedna jednièka a~k~tomu
22 pøenos z~ni¾¹ího øádu. Jinými slovy tehdy, kdy¾ ze~tøí xorovaných èíslic jsou alespoò
27 c_{i+1} &= (x_i~\&~y_i)\lor(x_i~\&~c_i)\lor(y_i~\&~c_i).\cr
31 Takovéto sèítání sice perfektnì funguje, nicménì je bohu¾el pomìrnì pomalé.
32 Pokud bychom stavìli hradlovou sí» podle tohoto pøedpisu, byla by slo¾ená z~nìjakých
33 podsítí (\uv{krabièek}), které budou mít na~vstupu $x_i$, $y_i$ a~$c_i$, jejich výstupem
34 bude $z_i$ a~$c_{i+1}$.
35 \figure{hloupe_scitani.eps}{Sèítání ¹kolním algoritmem.}{1.5in}
36 V¹imìme si, ¾e~ka¾dá krabièka závisí na~výstupu té pøedcházející. V¹echny
37 krabièky tedy musí le¾et urèitì na~rùzných hladinách. Celkovì bychom museli pou¾ít
38 $\Theta{(n)}$ hladin a~jeliko¾ je ka¾dá krabièka konsantnì velká, také $\Theta{(n)}$ hradel. To dává
39 lineární èasovou i~prostorovou slo¾itost, èili oproti sekvenènímu algoritmu jsme si nepomohli.
41 Zamysleme se nad tím, jak by se proces sèítání mohl zrychlit.
44 Jediné, co nás pøi sèítání brzdí, jsou pøenosy mezi jednotlivými øády. Ka¾dý øád,
45 aby~vydal souèet, musí poèkat na~to, a¾~dopoèítají v¹echny pøedcházející øády.
46 Teprve pak se~toti¾ dozví pøenos. Kdybychom ov¹em pøenosy dokázali spoèítat
47 nìjakým zpùsobem paralelnì, máme vyhráno. Jakmile známe v¹echny pøenosy, souèet
48 u¾~zvládneme dopoèítat na~konstantnì mnoho hladin - tedy v~konstantním èase.
50 Podívejme se na~libovolný {\I blok} v~na¹em souètu. Tak budeme øíkat èíslùm
51 $x_j\ldots x_i$ a $y_j\ldots y_i$ v~nìjakém intervalu indexù $\left<j,i\right>$. Pøenos $c_{j+1}$ vystupující z~tohoto bloku závisí mimo hodnot sèítancù u¾ pouze na~pøenosu $c_{i}$, který do bloku vstupuje.
52 \figure{blok_scitani.eps}{Blok souètu.}{3in}
53 Z tohoto pohledu se mù¾eme na blok také dívat jako na nìjakou funkci, která
54 dostane jednobitový vstup a vydá jednobitový výstup. To je nám pøíjemné, nebo»
55 takových funkcí existují jenom ètyøi typy:
59 \:$f(x) = x$, ~~~~($<$)
62 Jak se za~chvíli uká¾e, poslední pøípad, kdy by~nìjaký blok pøedával opaèný
63 pøenos, ne¾ do~nìj vstupuje, navíc nikdy nemù¾e nastat. Pojïme si to rozmyslet.
64 Jednobitové bloky se chovají velice jednodu¹e:
66 \figure{bloky_1bit.eps}{Tabulka triviálních bitù.}{1.1in}
68 Z prvního bloku evidentnì v¾dy vyleze 0, a»~do~nìj vstoupí jakýkoli pøenos.
69 Poslední blok naopak sám o~sobì pøenos vytváøí, a»~ji¾ do~nìj vleze jakýkoliv.
70 Bloky prostøední se chovají stejnì a~to tak, ¾e~samy o~sobì ¾ádný pøenos nevytvoøí,
71 ale~pokud do~nich nìjaký pøijde, tak~také odejde.
73 Mìjme nyní nìjaký vìt¹í blok~$C$ slo¾ený ze~dvou men¹ích podblokù $A$ a~$B$, jejich¾
74 chování u¾ známe. Z~toho mù¾eme odvodit, jak se chová celý blok:
76 \figure{tabulka_skladani_bloku.eps}{Skládání chování blokù}{1.3in}
78 Pokud vy¹¹í blok pøenos pohlcuje, pak a»~se u¾~ni¾¹í blok chová jakkoli, slo¾ení
79 tìchto blokù musí v¾dy pohlcovat. V~prvním øádku tabulky jsou tudí¾ nuly. Analogicky,
80 pokud vy¹¹í blok generuje pøenos, tak~ten ni¾¹í na~tom nic nezmìní. V~druhém
81 øádku tabulky jsou tedy samé jednièky. Zajímavìj¹í pøípad nastává, pokud vy¹¹í blok
82 kopíruje - tehdy zále¾í èistì na~chování ni¾¹ího bloku.
84 V¹imnìme si, ¾e~skládání chování blokù je vlastnì úplnì obyèejné skládání
85 funkcí. Nyní bychom mohli prohlásit, ¾e~budeme poèítat nad~tøíprvkovou abecedou,
86 a~¾e~celou tabulku doká¾eme spoèítat jedním jediným hradlem. Pojïmì si v¹ak
87 rozmyslet, jak~bychom takovouto vìc popsali èistì binárnì. Jak tedy tyto tøi stavy
88 popisovat pouze nìkolika bity?
90 Evidentnì nám k tomuto binárnímu zakódování tøí stavù budou staèit bity dva.
91 Oznaème si je jako $p_i$ a $q_i$. Tato dvojice mù¾e nábývat hned ètyø mo¾ných hodnot,
92 kterým pøiøadíme tøi mo¾ná chování bloku. Toto kódování mù¾eme zvolit zcela
93 libovolnì, ale pokud si ho zvolíme ¹ikovnì, u¹etøime si dále práci pøi kompozici.
94 Zvolme si tedy kódování takto:
102 Tomu, ¾e blok kopíruje, odpovídá dvojice $p_i = 1$; $q_i = cokoliv$. V~ostatních
103 pøípadech bude~$p_i$ nulové a~$q_i$ nám bude øíkat, co je na~výstupu pøíslu¹ného bloku.
104 Jinými slovy $p_i = 0$ znamená funkce je konstanta, pøièem¾ $q_i$ øíká jaká, $p_i = 1$~znamená
105 funkce je identita, a»~u¾~je $q_i$ cokoli.
107 Pojïme si nyní ukázat, jak bude celé skládání blokù vypadat. Rozmysleme si,
108 kdy je~$p$ celého dvojbloku jednièkové, tedy kdy celý dvojblok kopíruje. To nastane
109 tehdy, pokud kopírují obì jeho èásti a tedy $p = p_a~\&~p_b$. Dále $q$ bude rovno jednièce,
110 pokud $q = (\neg{p_a}~\&~q_a) \lor (p_a~\&~q_b)$.
112 Skládání chování blokù lze tedy popsat buï ternárnì -- tabulkou, ale lze to
113 i~binárnì vý¹e uvedeným pøedpisem.
115 Nyní si tedy mù¾eme dopøedu vypoèítat chování bloku velikosti jedna, poté
116 z~nich skládáním blokù velikosti dva, dál velikosti ètyøi, osm, atd...
118 \h{Paralelní sèítání}
120 Paralelní algoritmus na~sèítání u¾~zkonstruujeme pomìrnì snadno. Bez újmy
121 na~obecnosti budeme pøedpokládat, ¾e~poèet bitù vstupních èísel je mocnina dvojky,
122 jinak si vstup doplníme nulami, co¾ výsedný èas bìhu algoritmu zhor¹í maximálnì
126 \:Spoèteme chování blokù velikosti~1. ($\O(1)$ hladin)
127 \:Postupnì poèítáme chování blokù velikosti 2, 4, 8, ..., $2^k$.
128 ($\O(\log n)$ hladin, na~nich¾ se skládají bloky)
129 \:$c_0 \leftarrow 0$ (pøenos do nejni¾¹ího øádu je v¾dy 0)
130 \:Urèíme $c_n$ podle $c_0$ a chování (jediného) bloku velikosti~$n$.
131 \:Postupnì dopoèítáme pøenosy na~hranicích dìlitelných $2^k$ \uv{zahu¹»ováním}:
132 jakmile víme $c_{2^k}$, mù¾eme dopoèítat $c_{2^k-2^{k-1}}$ podle
133 chování bloku $\left< 2^k-2^{k-1},2^k\right>$. ($\O(\log n)$ hladin,
134 na~nich¾ se dosazuje)
135 \:$\forall i: z_i = x_i \oplus y_i \oplus c_i$.
138 \figure{1_9_deleni_bloku.eps}{Výpoèet pøenosu}{8cm}
140 Algoritmus pracuje v~èase $\O(\log n)$. Hradel je pou¾ito lineárnì: na~jednotlivých
141 hladinách kroku~2 poèet hradel exponenciálnì klesá od~$n$ k~1, na~hladinách kroku~5
142 exponenciálnì stoupá od~1 k~$n$, tak¾e dohromady se seète na~$\Theta(n)$.
146 \s{Definice:} {\I Komparátorová sí»} je kombinaèní obvod, jeho¾ hradla jsou
149 \figure{sortnet.0}{Komparátor.}{0.9in}
151 Komparátor umí porovnat dvì hodnoty a~rozhodnout, která z~nich je vìt¹í
152 a~která men¹í. Nevrací v¹ak booleovský výsledek jako bì¾né hradlo, ale má dva
153 výstupy, pøièem¾ na~jednom vrátí men¹í ze~vstupních hodnot a~na~druhém vìt¹í.
155 \>Výstupy komparátorù se nevìtví.
157 \s{Pøíklad:} {\sl Bubble sort}
159 Obrázek Bubble\_1 ilustruje pou¾ití komparátorù pro tøídìní bubble sortem.
160 ©ipky pøedstavují jednotlivé komparátory. Výpoèet v¹ak je¹tì mù¾eme vylep¹it.
162 \twofigures{sortnet.1}{Bubble\_1}{143pt}{sortnet.2}{Bubble\_2}{143pt}
164 Sna¾íme se výpoèet co nejvíce paralelizovat (viz obrázek Bubble\_2).
165 Jak je vidìt, komparátory na sebe nemusejí èekat. Tím mù¾eme výpoèet urychlit a místo èasu $\Theta{(n^2)}$ docílit èasové slo¾itosti $\Theta{(n)}$. V obou pøípadech je zachován kvadratický prostor.
168 \s{Definice:} Øekneme, ¾e posloupnost $x_0,\dots,x_{n-1} $ je {\I èistì bitonická}, právì tehdy, kdy¾
169 pro nìjaké $x_k\in\{1, \dots, n-1\} $ platí, ¾e~v¹echny prvky pøed ním (vèetnì jeho samotného)
170 tvoøí rostoucí poslopnost, kde¾to prvky stojící za~ním, tvoøí poslopnost klesající.
171 Formálnì zaspáno musí platit, ¾e:
172 $$x_0\leq x_1\leq \dots \leq x_k \geq x_{k+1}\geq\dots \geq x_{n-1}.$$
174 \s{Definice:} Posloupnost je {\I bitonická}, právì kdy¾ $\exists~j\in \{1,\dots ,n-1\}$, pro
175 které je rotace pùvodní posloupnosti o $j$ prvkù (posloupnost
176 $x_j,x_{(j+1) \bmod n},\dots, x_{(j+n-1) \bmod n}$) èistì bitonická.
178 \s{Definice:} {\I Separátor $S_n$} je sí», ve které jsou v¾dy~$i$-tý a~$(i+{n/2})$-tý prvek vstupu
179 (pro $i=0,\dots, {n/2}-1$) propojeny komparátorem. Minimum pak bude~$i$-tým,
180 maximum $(i+{n/2})$-ním prvkem výstupu.
181 \figure{sortnet.3}{$(y_i, y_{i+{n/2}}) = CMP(x_i, x_{i+{n/2}})$} {300pt}
183 \s{Lemma:} Pokud vstup separátoru je bitonická posloupnost, pak výstup
184 $y_0,\dots, y_{n-1}$ je posloupnost, která splòuje:
186 (i) $y_0,\dots, y_{n/2 -1}$ a~$y_{n/2},\dots, y_{n-1}$ jsou
187 bitonické posloupnosti,
189 (ii) Pro v¹echna $i,j< {n/2}$ platí $y_i < y_{j + {n/2}}$.
191 Separátor nám tedy jednu bitonickou posloupnost na~vstupu rozdìlí na~dvì
192 bitonické posloupnosti, pøièem¾ navíc ka¾dý prvek první poslopnosti ($y_0,\dots, y_{n/2 -1}$)
193 je men¹í nebo roven prvkùm druhé posloupnosti.
195 \>Ne¾ pøistoupíme k dùkazu lemmatu, uka¾me si, k èemu se nám bude hodit.
198 \s{Definice:} {\I Bitonická tøídièka $B_n$} je obvod sestavený ze separátorù, který dostane-li na vstupu bitonickou posloupnost délky $n$ (BÚNO konstruujeme tøídièku pro $n=2^k$), vydá setøídìnou posloupnost délky $n$.
200 \centerline{\epsfbox{sortnet.5}}
202 Jak je vidìt, bitonická tøídièka nám libovolnou bitonickou posloupnost délky~$n$
203 setøídí na~$\Theta(\log n)$ hladin.
205 Nyní se dá odvodit, ¾e pokud umíme tøídit bitonické posloupnosti, umíme setøídit v¹echno.
206 Vzpomeòme si na~tøídìní sléváním -- Merge sort. To funguje tak, ¾e zaène s~jednoprvkovými posloupnostmi, které jsou evidentnì setøídìné a~poté v¾dy dvì setøídìné posloupnosti slývá do~jedné. Kdybychom nyní umìli paralelnì slévat, mohli bychom vytvoøit i~paralelní Merge sort. Jinými slovy, potøebujeme dvì rostoucí posloupnosti nìjak efektivnì slít do~jedné setøídìné. Uvìdomme si, ¾e to zvládneme jednodu¹e -- staèí druhou z~posloupností obrátit a~\uv{pøilepit} za~první, èím¾ vznikne bitonická posloupnost, kterou poté mù¾eme setøídit na¹í bitonickou tøídièkou.
208 \s{Pøíklad:} {\sl Merge sort}
210 Bitonická tøídièka se tedy dá pou¾ít ke~slévání setøídìných posloupností.
211 Uka¾me si, jak s~její pomocí sestavíme souèástky {\I slévaèky} $M_n$:
213 Setøídìné posloupnosti $x_0,\dots, x_{n-1}$ a~$y_0,\dots, y_{n-1}$ spojíme do jedné bitonické
214 posloupnosti $x_0,\dots, x_{n-1},y_{n-1},\dots, y_0$. Z~této posloupnosti vytvoøíme pomocí bitonické tøídièky
215 $B_{2n}$ setøídìnou posloupnost. Vytvoøíme tedy blok $M_{2n}$, který se ov¹em sestává de~facto pouze z~bloku $B_{2n}$, jeho¾ druhá polovina vstupù je zapojena v~obráceném poøadí.
216 \figure{sortnet.6}{Slévaèka $M_n$.}{3in}
218 Nyní se pokusme odhadnout èasovou slo¾itost. Na¹e slévaèka, bude mít øádovì hloubku $\log n$.
219 V ka¾dém bloku $M_n$ je navíc ukryta bitonická tøídièka s takté¾ logaritmickou hloubkou.
220 Celková hloubka tedy bude $\log 2 + \log4 + \dots + \log 2^{2^k} + \dots + \log n$.
221 Po seètení nakonec dostáváme výslednou èasovou slo¾itost $\Theta (\log^2 n)$.
223 Dodejme je¹tì, ¾e existuje i~tøídicí algoritmus, kterému staèí jen ${\O}(\log n)$ hladin.
224 Jeho multiplikativní konstanta je v¹ak pøíli¹ veliká, tak¾e je v~praxi nepou¾itelný.
229 (i) Nejprve nahlédneme, ¾e lemma platí, je-li vstupem èistì bitonická
230 posloupnost. Dále BÚNO pøedpokládejme, ¾e vrchol posloupnosti je v~první polovinì (kdyby
231 byl vrchol za~polovinou, staèilo by zradlovì obrátit posloupnost s~komparátory a~øe¹ili
232 bychom stejný problém). Nyní si definujme $k := \min j: x_j > x_{j+n/2}$. (Pokud
233 by~takové~$k$ neexistovalo, znamenalo by~to, ¾e vstupní posloupnost je monotónní.
234 Separátor by tedy nic nedìlal a~pouze zkopíroval vstup na~výstup.) Nyní si v¹imìme,
235 ¾e jakmile jednou zaène palatit, ¾e prvek na~levé stranì je men¹í ne¾ na~pravé, bude
236 nám tato relace platit a¾~do~konce. Oznaème $x_m$ jako maximum vstupní posloupnosti.
237 Pak~$k$ bude jistì men¹í ne¾~$m$ a~$k+{n/2}$ bude vìt¹í ne¾~$m$. Mezi~$k$ a~$m$ je tedy
238 vstupní posloupnost neklesající, mezi $k+{n/2}$ a~$n-1$ nerostoucí.
240 Do pozice~$k$ tedy separátor bude pouze kopírovat vstup na~výstup, od~pozice~$k$
241 dál pak u¾~jen prohazuje. Pro ka¾dé~$i$, $k\leq i\leq {n/2}-1$ se prvky
242 $x_i$ a~$x_{i+{n/2}}$ prohodí. Úsek mezi~$k$ a~${n/2}-1$ tedy
243 nahradíme nerostoucí posloupností, první polovina výstupu tedy bude
244 (dokonce èistì) bitonická. Podobnì úsek $k+{n/2}$ a¾~$n-1$ nahradíme èistì
245 bitonickou posloupností. Obì poloviny tedy budou bitonické.
247 Dostaneme-li na vstupu obecnou bitonickou posloupnost, pøedstavíme si,
248 ¾e je to èistì bitonická posloupnost zrotovaná o~$r$ prvkù (BÚNO
249 doprava). Zjistíme, ¾e v~komparátorech se porovnávají tyté¾ prvky
250 jako kdyby zrotovaná nebyla. Výstup se od výstupu èistì bitonické
251 posloupnosti zrotovaného o~$r$ bude li¹it prohozením úsekù $x_0$ a¾
252 $x_{r-1}$ a~$x_{n/2}$ a¾ $x_{{n/2}+r-1}$. Obì výstupní
253 posloupnosti tedy budou zrotované o~$r$ prvkù, ale na jejich
254 bitoniènosti se nic nezmìní.
256 (ii) Z dùkazu (i) pro èistì bitonickou posloupnost víme, ¾e $y_0\dots y_{n/2-1}$ je èistì bitonická a bude rovna $x_0\dots x_{k-1},x_{k+n/2}\dots x_{n-1}$ pro vhodné $k$ a navíc bude mít maximum v $x_{k-1}$ nebo $x_k+{n/2}$. Mezi tìmito body ov¹em ve vstupní posloupnosti urèitì nele¾el ¾ádný $x_i$ men¹í ne¾ $x_k-1$ nebo $x_k+{n/2}$ (jak je vidìt z obrázku) a posloupnost $x_k \dots x_{k-1+{n/2}}$ je rovna $y_{n/2}\dots y_{n-1}$. Pro obecné bitonické posloupnosti uká¾eme stejnì jako v (i).
260 \centerline{\epsfbox{sortnet.7}}