3 \prednaska{5}{Hradlové sítì}{}
11 Pomocí poèítaèù øe¹íme stále slo¾itìj¹í a rozsáhlej¹í úlohy a potøebujeme
12 k~tomu èím dál víc výpoèetního výkonu. Rychlost a kapacita poèítaèù zatím
13 rostla exponenciálnì, tak¾e se zdá, ¾e staèí chvíli poèkat. Jen¾e tento rùst
14 se urèitì nìkdy zastaví -- napøíklad není jasné, jestli pùjde vyrábìt transistory
17 Jak si tedy s~obrovskými daty poradíme? Jedna z~lákavých mo¾ností je prostì
18 do~výpoètu zapøáhnout více ne¾ jeden procesor. Ostatnì, vícejádrové procesory,
19 které dneska najdeme ve~svých stolních poèítaèích, nejsou nic jiného ne¾
20 víceprocesorový systém na jednom èipu.
22 Nabízí se tedy obtí¾nou úlohu rozdìlit na nìkolik èástí, nechat ka¾dý
23 procesor (èi jádro) poèítat jednu z~èástí a nakonec jejich výsledky spojit
24 dohromady. To se snadno øekne, ale s~výjimkou triviálních úloh u¾ obtí¾nìji
27 Pojïme se podívat na nìkolik zajímavých paralelních algoritmù. Abychom se
28 nemuseli zabývat detaily hardwaru konkrétního víceprocesorového poèítaèe,
29 zavedeme si pomìrnì abstraktní výpoèetní model, toti¾ hradlové sítì. Tento
30 model je daleko paralelnìj¹í ne¾ skuteèný poèítaè, ale pøesto se techniky,
31 které si uká¾eme, dají snadno vyu¾ít i prakticky. Konec koncù sama vnitøní
32 architektura procesorù se na¹emu modelu velmi podobá.
36 Hradlové sítì jsou tvoøeny navzájem propojenými {\I hradly.} Ka¾dé hradlo pøitom
37 poèítá nìjakou (obecnì libovolnou) funkci $\Sigma^k \rightarrow \Sigma$, kde~$\Sigma$
38 je koneèná abeceda (stejná pro celou sí») a~$k$ pøirozené èíslo (poèet vstupù hradla,
39 jinak té¾ jeho {\I arita}).
41 \s{Pøíklad:} Èasto studujeme hradla {\I booleovská} (pracující nad abecedou $\Sigma=\{0,1\}$).
42 Ta poèítají jednotlivé logické funkce, mezi nejbì¾nìj¹í patøí:
45 \:nulární funkce: to jsou konstanty ($\hbox{\csc false}=0$, $\hbox{\csc true}=1$),
46 \:unární funkce: identita a negace (\NOT,~$\lnot$),
47 \:binární funkce: logický souèin (\AND,~$\and$), souèet (\OR,~$\lor$), \dots
50 Propojením hradel pak vznikne {\I hradlová sí».} Ne¾ vyøkneme formální definici,
51 pojïme se podívat na pøíklad jedné takové sítì:
53 \figure{hradlova_sit.eps}{Hradlová sí» -- tøívstupová verze funkce {\I majorita}}{3in}
55 Na¹e sí» má tøi vstupy, pìt booleovských hradel a jeden výstup. Na výstupu
56 je pøitom jednièka právì tehdy, jsou-li jednièky pøítomny na alespoò dvou
57 vstupech. Jinými slovy vrací {\I majoritu} ze~vstupù, tedy hodnotu, která
60 Obecnì ka¾dá hradlová sí» má nìjaké vstupy, hradla a výstupy.
61 Ka¾dý vstup hradla je pøitom pøipojen buïto na~nìkterý ze~vstupù sítì
62 nebo na~výstup jiného hradla. Výstupy hradel mohou být propojeny na~vstupy
63 dal¹ích hradel (mohou se vìtvit), nebo na výstupy sítì. Libovolnì, jen nesmíme
66 Nyní toté¾ formálnìji:
68 \s{Definice:} {\I Hradlová sí»} je urèena:
70 \:{\I abecedou} $\Sigma$, co¾ je nìjaká koneèná mno¾ina symbolù;
71 \:po dvou disjunktními koneènými mno¾inami \hfil\break
72 $I$~({\I vstupy}), $O$~({\I výstupy}) a~$H$~({\I hradla});
73 \:acyklickým orientovaným multigrafem~$(V,E)$, kde~$V = I \cup O \cup H$;\foot{Proè
74 potøebujeme multigraf? Napøíklad chceme-li výstup jednoho hradla pøipojit souèasnì
75 na více rùzných vstupù jiného hradla.}
76 \:zobrazením~$F$, které ka¾dému hradlu $h\in H$ pøiøadí nìjakou funkci~$F(h):
77 \Sigma^{a(h)} \rightarrow \Sigma$, co¾ je funkce, kterou toto hradlo vykonává.
78 Èíslu $a(h)$ øíkáme {\I arita} hradla~$h$;
79 \:zobrazením~$z: E \rightarrow {\bb N}$, je¾ o~hranách vedoucích do hradel øíká,
80 kolikátému argumentu funkce odpovídají;\foot{Na hranách vedoucích do výstupù
81 necháváme hodnotu této funkce nevyu¾itu.}
84 \>Pøitom jsou splnìny následující podmínky:
87 \:Do vstupù nevedou ¾ádné hrany.
88 \:Z~výstupù nevedou ¾ádné hrany a do ka¾dého výstupu vede právì jedna hrana.
89 \:Do ka¾dého hradla vede tolik hran, kolik je jeho arita.
90 \:V¹echny vstupy hradel jsou zapojeny. Tedy pro ka¾dé hradlo~$h$ a ka¾dý
91 jeho vstup $j\in \{1,\ldots,a(h)\}$ existuje právì jedna hrana~$e$, která
92 vede do hradla~$h$ a~$z(e)=j$.
95 \s{Poznámka:} Nìkdy se hradlovým sítím také øíká {\I kombinaèní obvody} a pokud pracují
96 nad abecedou $\Sigma = \{0,1\}$, pak {\I booleovské obvody}.
98 \s{Definice:} {\I Výpoèet sítì} postupnì pøiøazuje hodnoty z~abecedy~$\Sigma$
99 vrcholùm grafu. Výpoèet probíhá po~{\I taktech.} V~nultém taktu jsou definovány
100 pouze hodnoty na~vstupech sítì a v~hradlech arity~0 (konstanty). V~ka¾dém
101 dal¹ím taktu pak ohodnotíme vrcholy, jejich¾ v¹echny vstupní hrany vedou
102 z~vrcholù s~ji¾ definovanou hodnotou.
104 Hodnotu hradla~$h$ pøitom spoèteme funkcí~$F(h)$ z~hodnot na jeho vstupech
105 uspoøádaných podle funkce~$z$. Výstup sítì pouze zkopíruje hodnotu, která do
108 Jakmile budou po~nìjakém poètu taktù definované hodnoty v¹ech výstupù, výpoèet
109 se zastaví a~sí» vydá výsledek -- ohodnocení výstupù.
111 Podle prùbìhu výpoètu mù¾eme vrcholy sítì rozdìlit do vrstev:
113 \s{Definice:} {\I $i$-tá vrstva $S_i$} obsahuje právì ty vrcholy~$v$,
114 pro~které nejdel¹í z~cest z~libovolného vrcholu se~vstupním stupnìm~0
115 do~$v$ má délku rovnou právì~$i$.
117 \figure{vypocet_site.eps}{Prùbìh výpoètu a rozdìlení sítì na vrstvy}{6cm}
119 \s{Pár pozorování} o~prùbìhu výpoètu:
122 \:V~$i$-té vrstvì jsou tedy právì ty vrcholy, které poprvé ohodnotíme v~$i$-tém
124 \:Jeliko¾ sí» je acyklická, tak platí, ¾e jakmile vrchol ohodnotíme, u¾ se
125 jeho ohodnocení nikdy nemù¾e zmìnit.
126 \:Kdy¾ se vydáme z~libovolného vrcholu proti smìru hran, po~koneènì mnoha
127 krocích dojdeme do~vrcholu s~nulovým vstupním stupnìm (vstupu sítì nebo
128 konstantního hradla). Proto ka¾dý vrchol le¾í v~nìjaké vrstvì.
129 \:Vrstvy jsou disjunktní, tak¾e poèet neprázdných vrstev je nutnì koneèný.
130 V~kombinaci s~pøedchozím pozorováním dostaneme, ¾e výpoèet sítì se v¾dy zastaví.
131 \:Navíc poslední neprázdná vrstva je právì ta, kde se výpoèet zastaví -- z~ka¾dého
132 dal¹ího vrcholu by toti¾ bylo mo¾né po~hranách dojít do vrcholu s~výstupním
133 stupnìm~0 a jediné takové vrcholy jsou výstupy sítì. Ty by tedy musely také
134 le¾et v~nìkteré z~následujících vrstev, co¾ ov¹em není mo¾né, nebo» výpoèet
138 \>To nás motivuje k~následující definici:
140 \s{Definice:} {\I Èasovou slo¾itost} sítì definujeme jako poèet jejích neprázdných
141 vrstev. Podobnì {\I prostorovou slo¾itost} polo¾íme rovnu poètu hradel v~síti.
143 \s{Poznámka o~aritách:}
144 Kdybychom pøipustili hradla s~libovolnì vysokým poètem vstupù, mohli bychom
145 jakýkoliv problém se vstupem délky~$n$ a výstupem délky~$\ell$ vyøe¹it v~jedné
146 vrstvì pomocí $\ell$~kusù $n$-vstupových hradel. Ka¾dému bychom prostì
147 pøiøadili funkci, která poèítá pøíslu¹ný bit výsledku ze~v¹ech bitù vstupu.
149 To v¹ak není ani realistické, ani pìkné. Jak z~toho ven? Pøidáme pravidlo,
150 které omezí arity v¹ech hradel nìjakou pevnou konstantou, tøeba dvojkou.
151 Budeme tedy pou¾ívat výhradnì nulární, unární a binární hradla.
153 Poznamenejme je¹tì, ¾e realistický model (by» s~trochu jinými vlastnostmi)
154 by vznikl také tehdy, kdybychom místo arity omezily typy funkcí, øeknìme
155 na \AND, \OR{} a \NOT.
157 \s{Poznámka o~uniformitì:}
158 Dodejme, ¾e od~bì¾ných výpoèetních modelù, jako je tøeba RAM, se hradlové
159 sítì li¹í jednou podstatnou vlastností -- ka¾dá sí» zpracovává výhradnì vstupy
160 jedné konkrétní velikosti. Chceme tedy najít nìjaký obecný pøedpis, který
161 pro ka¾dou velikost vstupu sestrojí pøíslu¹nou sí». Takovým výpoèetním modelùm
162 se øíká {\I neuniformní.}
164 A~co myslíme oním pøedpisem pro sestrojení sítì? Bude to pro nás prostì
165 jakýkoliv algoritmus (klasický, neparalelní) bì¾ící v~polynomiálním èase.
166 (Kdybychom dovolili i pomalej¹í algoritmy, mohli bychom bìhem konstrukce
167 provádìt nìjaký nároèný pøedvýpoèet a jeho výsledek zabudovat do struktury
168 sítì. To obvykle není ¾ádoucí.)
170 \h{Hledá se jednièka}
172 Abychom si nový výpoèetní model osahali, zkusme nejprve sestrojit obvod,
173 který zjistí, zda se mezi jeho~$n$ vstupy vyskytuje alespoò jedna jednièka.
174 To znamená vypoèítat $n$-vstupovou funkci \OR.
176 \>{\I První øe¹ení:} Zapojíme hradla za~sebe (sériovì). Èasová i prostorová
177 slo¾itost èiní $\Theta(n)$. Zde ov¹em vùbec nevyu¾íváme toho, ¾e by mohlo poèítat více
180 \>{\I Druhé øe¹ení:} Hradla budeme spojovat do~dvojic, pak výsledky tìchto dvojic opìt
181 do~dvojic a tak dále. Díky paralelnímu zapojení dosáhneme èasové slo¾itosti $\Theta(\log n)$,
182 pøièem¾ prostorová slo¾itost zùstane lineární.
184 \twofigures{hloupy_or.eps}{Sériové øe¹ení}{1in}{chytry_or.eps}{Paralelní øe¹ení}{3in}
186 \h{Sèítání binárních èísel}
188 Zajímavìj¹í úlohou, její¾ paralelizace u¾ nebude tak triviální, je obyèejné
189 sèítání dvojkových èísel. Mìjme dvì èísla $x$ a $y$ zapsané ve~dvojkové soustavì. Jejich èíslice oznaème
190 $x_{n-1}\ldots x_0$ a $y_{n-1}\ldots y_0$, pøièem¾ $i$-tý øád má váhu $2^i$.
192 Ihned se nabízí pou¾ít starý dobrý \uv{¹kolní algoritmus sèítání pod sebou}. Ten
193 funguje ve~dvojkové soustavì stejnì dobøe jako v~desítkové. Sèítáme èísla zprava doleva,
194 v¾dy seèteme~$x_i$ s~$y_i$ a~pøièteme pøenos z~ni¾¹ího øádu. Tím dostaneme jednu èíslici
195 výsledku a~pøenos do~vy¹¹ího øádu. Formálnì bychom to mohli zapsat tøeba takto:
197 z_i=x_i \oplus y_i \oplus c_i,
199 kde $z_i$ je $i$-tá èíslice souètu, $\oplus$ znaèí operaci \XOR{} (souèet modulo~2) a~$c_i$ je {\I pøenos}
200 z~$(i-1)$-ního øádu do~$i$-tého. Pøenos do vy¹¹ího øádu nastane tehdy, pokud se~nám potkají
201 dvì jednièky pod~sebou, nebo kdy¾ se~vyskytne alespoò jedna jednièka a~k~tomu
202 pøenos z~ni¾¹ího øádu. To je tehdy, kdy¾ mezi tøemi xorovanými èíslicemi jsou alespoò
203 dvì jednièky -- k~tomu se nám hodí ji¾ známý obvod pro majoritu:
207 c_{i+1} &= (x_i~\&~y_i)\lor(x_i~\&~c_i)\lor(y_i~\&~c_i).\cr
211 O~tomto pøedpisu snadno doká¾eme, ¾e funguje (zkuste si to), nicménì pokud podle
212 nìj postavíme hradlovou sí», bude pomìrnì pomalá. Sí» si mù¾eme pøedstavit tak,
213 ¾e je slo¾ena z~nìjakých podsítí (\uv{krabièek}), které budou mít na~vstupu $x_i$,
214 $y_i$ a~$c_i$ a jejich výstupem bude $z_i$ a~$c_{i+1}$:
216 \figure{hloupe_scitani.eps}{Sèítání ¹kolním algoritmem}{1.5in}
218 Ka¾dá krabièka má sama o~sobì konstantní hloubku, ov¹em k~výpoètu potøebuje pøenos
219 vypoèítaný pøedcházející krabièkou. Jednotlivé krabièky proto musí le¾et
220 v~rùzných vrstvách sítì. Vrstev tedy je $\Theta(n)$ a stejnì tak hradel.
221 Oproti sekvenènímu algoritmu jsme si bohu¾el ani trochu nepomohli.
223 \h{Pøenosy v~blocích}
225 Jak sèítání zrychlit? To, co nás pøi sèítání brzdí, jsou evidentnì pøenosy mezi
226 jednotlivými øády. Kdybychom je dokázali spoèítat rychleji, máme vyhráno -- souèet
227 u¾ získáme jednoduchým xorováním, které zvládneme paralelnì v~èase $\Theta(1)$.
228 Uva¾ujme tedy nad zpùsobem, jak pøenosy spoèítat paralelnì.
230 Podívejme se na~libovolný {\I blok} v~na¹em souètu. Tak budeme øíkat èíslùm
231 $x_j\ldots x_i$ a $y_j\ldots y_i$ v~nìjakém intervalu indexù $\left<i,j\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.
233 \figure{blok_scitani.eps}{Blok souètu}{3in}
235 Pro konkrétní sèítance se tedy mù¾eme na blok dívat jako na nìjakou funkci,
236 která dostane jednobitový vstup (pøenos zespoda) a vydá jednobitový výstup (pøenos
237 nahoru). To je nám milé, nebo» takové funkce existují pouze ètyøi:
238 $$\vbox{\halign{$f(x) = #$\hfil &\qquad # \hfil\cr
239 0&konstantní {\bo 0}, blok {\I pohlcuje} pøenos \cr
240 1&konstantní {\bo 1}, blok {\I vytváøí} pøenos \cr
241 x&identita (znaèíme {\tt <}), blok {\I kopíruje} pøenos \cr
242 \neg{x}&negace, uká¾eme, ¾e u~¾ádného bloku nenastane \cr
244 Této funkci budeme øíkat {\I chování} pøíslu¹ného bloku.
246 {\I Jednobitové bloky} se pøitom chovají velice jednodu¹e:
248 \figure{bloky_1bit.eps}{Tabulka triviálních blokù}{1.1in}
250 Blok prvního druhu v¾dy pøedává nulový pøenos, a» u¾ do~nìj vstoupí jakýkoliv
251 -- pøenos tedy pohlcuje. Poslední blok naopak sám o~sobì pøenos vytváøí,
252 a» dostane cokoliv. Oba bloky prostøední se chovají tak, ¾e samy o~sobì ¾ádný pøenos nevytvoøí,
253 ale~pokud do~nich nìjaký pøijde, tak~také odejde.
255 {\I Vìt¹í bloky} mù¾eme rozdìlit na èásti a podle chování èástí urèit,
256 jak se chová celý blok. Mìjme blok~$B$ slo¾ený z~men¹ích podblokù~$H$ (horní èást)
257 a~$D$ (dolní). Chování celku závisí na chování èástí takto:
259 \figure{tabulka_skladani_bloku.eps}{Skládání chování blokù}{1.3in}
261 Pokud vy¹¹í blok pøenos pohlcuje, pak a»~se u¾~ni¾¹í blok chová jakkoli, slo¾ení
262 obou blokù musí v¾dy pohlcovat. V~prvním øádku tabulky jsou tudí¾ nuly. Analogicky
263 pokud vy¹¹í blok generuje pøenos, tak~ten ni¾¹í na~tom nic nezmìní. V~druhém
264 øádku tabulky jsou tedy samé jednièky. Zajímavìj¹í pøípad nastává, pokud vy¹¹í blok
265 kopíruje -- tehdy zále¾í èistì na~chování ni¾¹ího bloku.
267 V¹imnìme si, ¾e~skládání chování blokù je vlastnì úplnì obyèejné skládání
268 funkcí. Nyní bychom mohli prohlásit, ¾e~budeme poèítat nad~tøíprvkovou abecedou,
269 a~¾e~celou tabulku doká¾eme spoèítat jedním jediným hradlem. Pojïme si pøeci jen
270 rozmyslet, jak~bychom takovou operaci popsali èistì binárnì.
272 Tøi stavy mù¾eme zakódovat pomocí dvou bitù, øíkejme jim tøeba $p$ a~$q$.
273 Dvojice $(p,q)$ pøitom mù¾e nabývat hned ètyø mo¾ných hodnot, my dvìma z~nich
274 pøiøadíme stejný význam:
276 (1,*) = \hbox{\tt <} \qquad
277 (0,0) = \hbox{\bo 0} \qquad
278 (0,1) = \hbox{\bo 1}.
280 Kdykoliv $p=1$, blok kopíruje pøenos. Naopak $p=0$ odpovídá tomu, ¾e blok
281 posílá do~vy¹¹ího øádu konstantní pøenos, a $q$~pak urèuje, jaký.
282 Kombinování blokù (skládání funkcí) pak mù¾eme popsat následovnì:
284 p_B &= p_H \and p_D,\cr
285 q_B &= (\neg{p_H} \and q_H) \lor (p_H \and q_D).
287 A~prùchod pøenosu blokem (dosazení hodnoty funkce) takto:
289 c_{j+1} = (p \and c_i) \lor (\neg p \and q).
291 Rozmyslete si, ¾e tyto formule odpovídají vý¹e uvedené tabulce.
293 \h{Paralelní sèítání}
295 Od~popisu chování blokù je u¾ jenom krùèek k~paralelnímu pøedpovídání pøenosù,
296 a~tím i k~paralelní sèítaèce. Bez újmy na~obecnosti budeme pøedpokládat,
297 ¾e~poèet bitù vstupních èísel je mocnina dvojky; jinak vstup doplníme zleva
300 Algoritmus bude rozdìlen na~dvì èásti:
302 {\I První èást} spoèítá chování v¹ech {\I pøirozených blokù} -- tak budeme øíkat
303 blokùm, jejich¾ velikost je mocnina dvojky a pozice je dìlitelná velikostí
304 (bloky té¾e velikosti se tedy nepøekrývají). Nejprve v~konstantním èase stanoví
305 chování blokù velikosti~1, ty pak spojí do dvojic, dvojice zase do dvojic atd.,
306 obecnì v~$i$-tém kroku spoète chování v¹ech pøirozených blokù velikosti~$2^i$.
308 {\I Druhá èást} pak dopoèítá pøenosy, a~to tak, aby v~$i$-tém kroku byly známy
309 pøenosy do~øádù dìlitelných~$2^{\log n - i}$. V~nultém kroku tedy pouze $c_0=0$
310 a~$c_n$, který spoèítá z~$c_0$ pomocí chování bloku $\left< 0,n \right>$.
311 V~prvním kroku pomocí bloku $\left< 0,n/2 \right>$ dopoèítá $c_{n/2}$,
312 v~druhém pomocí $\left< 0,n/4 \right>$ spoèítá $c_{n/4}$ a pomocí
313 $\left< n/2,3/4\cdot n \right>$ dostane $c_{3/4\cdot n}$ atd.
314 Obecnì v~$i$-tém kroku pou¾ívá chování blokù velikosti $2^{\log n - i}$.
316 \s{Sèítací sí»} tedy bude vypadat takto:
318 \:$\Theta(1)$ hladin výpoètu chování blokù velikosti~1.
319 \:$\Theta(\log n)$ hladin poèítajících chování v¹ech pøirozených blokù.
320 \:$\Theta(\log n)$ hladin dopoèítávajících pøenosy \uv{zahu¹»ováním}.
321 \:$\Theta(1)$ hladin na samotné seètení: $\forall i: z_i = x_i \oplus y_i \oplus c_i$.
324 \figure{deleni_bloku.eps}{Výpoèet pøenosu}{2.5in}
326 Algoritmus tedy pracuje v~èase $\Theta(\log n)$. Vyu¾ívá k~tomu lineárnì mnoho hradel:
327 pøi výpoètu chování blokù na jednotlivých hladinách poèet hradel exponenciálnì klesá
328 od~$n$ k~1, bìhem zahu¹»ování pøenosù naopak exponenciálnì stoupá od~1 k~$n$.
329 Obì geometrické øady se seètou na $\Theta(n)$.
331 \h{Paralelní násobení}
333 Je¹tì si rozmysleme, jak rychle by bylo mo¾né èísla násobit. Opìt se inspirujeme
334 ¹kolním algoritmem: pokud násobíme dvì $n$-ciferná èísla $x$ a~$y$, uvá¾íme
335 v¹ech~$n$ posunutí èísla~$x$, ka¾dé z~nich vynásobíme pøíslu¹nou èíslicí v~$y$
336 a výsledky posèítáme.
338 \figure{skolni_nasobeni.eps}{©kolní násobení}{2in}
340 Ve~dvojkové soustavì je to je¹tì jednodu¹¹í: násobení jednou èíslicí je prostý
341 \AND. Paralelnì tedy vytvoøíme v¹echna posunutí a spoèítáme v¹echny \AND{}y.
342 To v¹e stihneme za 1~takt výpoètu.
344 Zbývá seèíst $n$~èísel, z~nich¾ ka¾dé má $\Theta(n)$ bitù. Mohli bychom opìt
345 sáhnout po~osvìdèeném triku: sèítat dvojice èísel, pak dvojice tìchto souètù, atd.
346 Taková sí» by mìla tvar binárního stromu hloubky $\log n$, jeho¾ ka¾dý vrchol
347 by obsahoval jednu sèítaèku, a na tu, jak víme, postaèí $\Theta(\log n)$ hladin.
348 Celý výpoèet tedy bì¾í v~èase $\Theta(\log^2 n)$.
350 Jde to ale rychleji, pou¾ijeme-li jednoduchý, témìø kouzelnický trik.
351 Sestrojíme {\I kompresor} -- to bude obvod konstantní hloubky, který na~vstupu
352 dostane tøi èísla a vypoète z~nich dvì èísla mající stejný souèet jako zadaná
355 K~èemu je to dobré? Máme-li seèíst $n$~èísel, v~konstantním èase doká¾eme tento
356 úkol pøevést na seètení $\lceil 2/3\cdot n\rceil$ èísel, to pak opìt v~konstantním èase
357 na seètení $\lceil (2/3)^2\cdot n\rceil$ èísel atd., a¾ nám po $\lceil\log_{3/2} n\rceil = \Theta(\log n)$ krocích
358 zbudou dvì èísla a ta seèteme klasickou sèítaèkou. Zbývá vymyslet kompresor.
360 \s{Konstrukce kompresoru:}
361 Oznaème vstupy kompresoru $x$, $y$ a~$z$ a výstupy $p$ a~$q$.
362 Pro ka¾dý øád~$i$ spoèteme souèet $x_i + y_i + z_i$. To je nìjaké
363 dvoubitové èíslo, tak¾e mù¾eme jeho ni¾¹í bit prohlásit za~$p_i$
364 a vy¹¹í za~$q_{i+1}$.
366 Jinými slovy v¹echna tøi èísla jsme normálnì seèetli, ale místo abychom
367 pøenosy posílali do vy¹¹ího øádu, vytvoøili jsme z~nich dal¹í èíslo,
368 které má být k~výsledku èasem pøièteno.
370 \figure{add_3to2.eps}{Kompresor}{0.9in}
372 \s{Shrnutí:} Na¹e sí» pro paralelní násobení pracuje v~èase $\Theta(\log n)$
373 -- nejdøíve v~konstantním èase vytváøíme mezivýsledky, pak pou¾ijeme $\Theta(\log n)$
374 hladin kompresorù konstantní hloubky a nakonec jednu sèítaèku hloubky $\Theta(\log n)$.
375 Jistou vadou na kráse ov¹em je, ¾e na to potøebujeme $\Theta(n^2)$ hradel.
379 Je¹tì zkusíme paralelizovat jeden klasický problém, toti¾ tøídìní.
380 Budeme k~tomu pou¾ívat {\I komparátorovou sí»} -- to je hradlová sí»
381 slo¾ená z~{\I komparátorù.}
383 Jeden komparátor umí porovnat dvì hodnoty a~rozhodnout, která z~nich je vìt¹í
384 a~která men¹í. Nevrací v¹ak booleovský výsledek jako bì¾né hradlo, ale má dva
385 výstupy: na~jednom z~nich vrací men¹í ze~vstupních hodnot a~na~druhém tu vìt¹í.
387 \figure{sortnet.0}{Komparátor}{0.7in}
389 V~na¹em formalismu hradlových sítí bychom mohli komparátor reprezentovat dvojicí
390 hradel: jedno z~nich by poèítalo minimum, druhé maximum. Hodnoty, které tøídíme,
391 bychom pøitom pova¾ovali za prvky abecedy.\foot{Komparátorovou sí» mù¾eme také snadno
392 pøelo¾it na booleovský obvod. Ka¾dý prvek abecedy reprezentujeme èíslem
393 o~$b=\lceil\log_2 \Sigma\rceil$ bitech. Zpùsobem podobným paralelní sèítaèce
394 lze z~booleovských hradel sestrojit komparátor hloubky $\Theta(\log b)$. Zkuste to.}
396 Je¹tì se dohodnìme, ¾e výstupy komparátorù se nikdy nebudou vìtvit. Ka¾dý
397 z~nich pøivedeme na~vstup jiného komparátoru nebo na~výstup sítì. Vìtvení
398 by nám ostatnì k~nièemu nebylo, proto¾e na~výstupu potøebujeme vydat stejný
399 poèet hodnot, jako byl na vstupu, a nemáme ¾ádné hradlo, kterým bychom mohli
400 pøípadných vícero vìtví slouèit opìt do~jedné.
402 \s{Pøíklad:} Zkusíme do øeèi komparátorových sítí pøelo¾it {\I bublinkové tøídìní.}
403 Z~nìj získáme obvod na~levém obrázku (¹ipky pøedstavují jednotlivé komparátory).
404 Toto nakreslení ov¹em ponìkud klame -- pokud sí» necháme poèítat, mnohá porovnání
405 budou probíhat paralelnì. Skuteèný prùbìh výpoètu znázoròuje pravý obrázek,
406 na~nìm¾ jsme v¹echny operace provádìné souèasnì znázornili vedle sebe.
407 Ihned vidíme, ¾e paralelní bublinkové tøídìní pracuje v~èase $\Theta(n)$
408 a potøebuje kvadratický poèet komparátorù.
410 \twofigures{sortnet.1}{Bubblesort}{143pt}{sortnet.2}{Skuteèný prùbìh výpoètu}{143pt}
412 Nyní si pøedvedeme rychlej¹í tøídící algoritmus. Pùjdeme na nìj jak se øíká \uv{od lesa}.
413 Nejdøíve vymyslíme sí», která bude umìt tøídit jenom nìco -- toti¾ bitonické posloupnosti.
414 Pak z~ní teprve sestrojíme obecné tøidìní. Bez újmy na obecnosti pøitom budeme
415 pøedpokládat, ¾e ka¾dé dva prvky na vstupu jsou navzájem rùzné a ¾e velikost vstupu
418 \s{Definice:} Posloupnost $x_0,\dots,x_{n-1} $ je {\I èistì bitonická,} pokud ji mù¾eme
419 rozdìlit na nìjaké pozici $k\in\{0, \dots, n-1\}$ tak, ¾e prvky $x_0,\ldots,x_k$ tvoøí rostoucí
420 poslopnost, zatímco prvky $x_k,\ldots,x_{n-1}$ tvoøí posloupnost klesající.
422 \s{Definice:} Posloupnost $x_0,\dots,x_{n-1}$ je {\I bitonická}, jestli¾e ji lze získat
423 rotací (cyklickým posunutím) nìjaké èistì bitonické posloupnosti. Tedy pokud existuje
424 $0\le j<n$ takové, ¾e posloupnost $x_j,x_{(j+1) \bmod n},\dots, x_{(j+n-1) \bmod n}$
427 \s{Definice:} {\I Separátor øádu~$n$} je komparátorová sí»~$S_n$ se vstupy $x_0,\ldots,x_{n-1}$
428 a výstupy $y_0,\ldots,y_{n-1}$, která dostane-li na~vstupu bitonickou posloupnost,
429 vydá na výstup její permutaci s~následujícími vlastnostmi:
432 \:$y_0,\ldots,y_{n/2-1}$ a $y_{n/2},\ldots,y_{n-1}$ jsou bitonické posloupnosti;
433 \:$y_i < y_j$, kdykoliv $0\le i<n/2 \le j<n$.
436 \>Jinak øeèeno, separátor rozdìlí bitonickou posloupnost na dvì polovièní
437 a navíc jsou v¹echny prvky v~první polovinì men¹í ne¾ v¹echny v~té druhé.
439 \s{Lemma:} Pro ka¾dé sudé~$n$ existuje separátor~$S_n$ konstantní hloubky,
440 slo¾ený z~$\Theta(n)$ komparátorù.
442 Dùkaz tohoto lemmatu si necháme na konec kapitoly. Nejprve pøedvedeme, k~èemu jsou
445 \s{Definice:} {\I Bitonická tøídièka øádu~$n$} je komparátorová sí»~$B_n$,
446 která dostane-li na vstupu bitonickou posloupnost délky~$n$, vydá ji setøídìnou.
448 \s{Lemma:} Pro libovolné $n=2^k$ existuje bitonická tøidièka~$B_n$ hloubky $\Theta(\log n)$
449 s~$\Theta(n\log n)$ komparátory.
452 Konstrukce bitonické tøidièky je snadná: nejprve separátorem~$S_n$ zadanou bitonickou
453 posloupnost rozdìlíme na dvì bitonické posloupnosti délky $n/2$, ka¾dou z~nich pak separátorem~$S_{n/2}$
454 na dvì èásti délky $n/4$, atd., a¾ získáme jednoprvkové posloupnosti ve~správném poøadí.
455 Celkem pou¾ijeme~$\log n$ hladin slo¾ených z~$n$ separátorù, ka¾dá
456 hladina má pøitom konstantní hloubku.
459 \figure{sortnet.5}{Bitonická tøidièka $B_n$}{\epsfxsize}
461 Bitonické tøidièky nám nyní pomohou ke~konstrukci tøidièky na obecné posloupnosti.
462 Ta bude zalo¾ena na tøídìní sléváním -- nejprve se tedy musíme nauèit slít dvì
463 setøídìné posloupnosti do jedné.
465 \s{Definice:} {\I Slévaèka øádu~$n$} je komparátorová sí»~$M_n$ s~$2\times n$
466 vstupy a~$n$ výstupy, která dostane-li dvì setøídìné posloupnosti délky~$n$,
467 vydá posloupnost vzniklou jejich slitím.
469 \s{Lemma:} Pro $n=2^k$ existuje slévaèka~$M_n$ hloubky $\Theta(\log n)$
470 s~$\Theta(n\log n)$ komparátory.
473 Staèí jednu vstupní posloupnost obrátit a \uv{pøilepit} za tu druhou. Tím vznikne
474 bitonická posloupnost, jí¾ setøídíme bitonickou tøidièkou~$B_{2n}$.
477 \s{Definice:} {\I Tøídící sí» øádu~$n$} je komparátorová sí»~$T_n$ s~$n$~vstupy
478 a~$n$~výstupy, která pro ka¾dý vstup vydá jeho setøídìnou permutaci.
480 \s{Lemma:} Pro $n=2^k$ existuje tøídící sí»~$T_n$ hloubky $\Theta(\log^2 n)$
481 slo¾ená z~$\Theta(n\log^2 n)$ komparátorù.
484 Sí» bude tøídit sléváním. Vstup rozdìlí na~$n$ jednoprvkových posloupností.
485 Ty jsou jistì setøídìné, tak¾e je slévaèkami~$M_1$ mù¾eme slít do dvouprvkových
486 setøídìných posloupností. Na ty pak aplikujeme slévaèky $M_2$, $M_4$, \dots, $M_{n/2}$,
487 a¾ v¹echny èásti slijeme do jedné, setøídìné.
489 Celkem provedeme $\log n$~krokù slévání, $i$-tý z~nich obsahuje slévaèky $M_{2^i}$
490 a ty, jak u¾ víme, mají hloubku $\Theta(i)$. Celkový poèet vrstev tedy èiní
491 $\Theta(1+2+3+\ldots+\log n) = \Theta(\log^2 n)$. Ka¾dý krok pøitom potøebuje
492 $\Theta(n\log n)$ komparátorù, co¾ dává celkem $\Theta(n \log^2 n)$ komparátorù.
495 \figure{sortnet.6}{Tøidièka $T_8$}{\epsfxsize}
497 \s{Konstrukce separátoru:} Zbývá dokázat, ¾e existují separátory konstantní
498 hloubky. Vypadají pøekvapivì jednodu¹e: pro $i=0,\ldots,n/2-1$ zapojíme
499 komparátor se vstupy $x_i$, $x_{i+n/2}$, jeho¾ minimum pøivedeme na~$y_i$
500 a maximum na~$y_{i+n/2}$.
502 \figure{sortnet.3}{Konstrukce separátoru}{\epsfxsize}
504 Proè separátor separuje? Nejprve pøedpokládejme, ¾e vstupem je èistì bitonická
505 posloupnost. Oznaème~$m$ polohu maxima této posloupnosti; maximum bez újmy
506 na obecnosti le¾í v~první polovinì (jinak celý dùkaz provedeme \uv{zrcadlovì}).
507 Oznaème dále~$k$ nejmen¹í index, pro který komparátor zapojený mezi $x_k$ a~$x_{k+n/2}$
508 hodnoty prohodí, tedy $k=\min \{ i \mid x_i > x_{i+n/2} \}.$
510 Jeliko¾ maximum je jedineèné, musí platit $x_m > x_{m+n/2}$, tak¾e~$k$
511 existuje a navíc $0\le k\le m < n/2$. Také platí, ¾e pro ka¾dé~$i$ mezi
512 $k$ a~$n/2$ u¾ komparátory musí prohazovat, proto¾e od~$x_k$ je posloupnost
513 a¾ do konce klesající, a~proto $x_i > x_{i+n/2}$.
515 Separátor se tedy chová velice jednodu¹e: první polovina výstupu vznikne
516 slepením rostoucího úseku $x_0,\ldots,x_{k-1}$ s~klesajícím úsekem $x_{n/2+k},\ldots,x_{n-1}$;
517 druhou polovinu tvoøí spojení klesajícího úseku $x_{n/2},\ldots,x_{n/2+k-1}$, rostoucího
518 úseku $x_k,\ldots,x_m$ a klesajícího úseku $x_m,\ldots,x_{n/2-1}$.
520 Snadno tedy ovìøíme, ¾e se separátor chová podle definice: První polovina
521 je èistì bitonická a jeliko¾ $x_{n/2-1} > x_{n/2}$, je druhá polovina bitonická
522 (obvykle ne èistì). Navíc víme, ¾e nejvy¹¹ím bodem první èásti je~$x_k$
523 a nejni¾¹ím bodem druhé èásti~$x_{n/2+k} > x_k$, tak¾e v¹echny prvky první
524 èásti musí být men¹í ne¾ v¹echny v~té druhé.
526 \figure{sortnet.7}{Ilustrace èinnosti separátoru}{\epsfxsize}
528 Doplòme, co se stane, pokud vstup není èistì bitonický. Zde vyu¾ijeme toho,
529 ¾e separátor je symetrický, tudí¾ zrotujeme-li jeho vstup o~$p$ pozic, dostaneme
530 o~$p$ pozic zrotované i obì poloviny výstupu. Podle definice ov¹em pro ka¾dou bitonickou
531 posloupnost existuje její rotace, která je èistì bitonická, a~pro ní¾, jak
532 u¾ víme, separátor funguje. Tak¾e pro neèistou bitonickou posloupnost musí
533 vydat výsledek pouze zrotovaný, co¾ ov¹em na jeho správnosti nic nemìní.
536 \s{Závìrem:} Nalezli jsme paralelní tøídící algoritmus o~èasové slo¾itosti $\Theta(\log^2 n)$,
537 který vyu¾ívá $\Theta(n\log^2 n)$ komparátorù. Dodejme, ¾e jsou známé i tøídící sítì
538 hloubky $\Theta(\log n)$, ale jejich konstrukce je mnohem komplikovanìj¹í a dává
539 obrovské multiplikativní konstanty, které brání praktickému pou¾ití.
541 Pomocí dolního odhadu slo¾itosti tøídìní (viz minulý semestr) navíc mù¾eme
542 snadno dokázat, ¾e logaritmický poèet hladin je nejni¾¹í mo¾ný. Máme-li toti¾
543 libovolnou tøídící sí» hloubky~$h$, mù¾eme ji simulovat po~hladinách a získat
544 tak sekvenèní tøídící algoritmus. Jeliko¾ na ka¾dé hladinì mù¾e le¾et nejvý¹e~$n/2$
545 komparátorù, ná¹ algoritmus provede maximálnì $hn/2$ porovnání. My ov¹em víme, ¾e pro
546 ka¾dý tøídící algoritmus existují vstupy, na~kterých porovná $\Omega(n\log n)$-krát.
547 Proto $h=\Omega(\log n)$.