3 \prednaska{5}{Hradlové sítì}{}
5 \def\land{\mathbin{\&}}
7 ®ivot nám pøiná¹í stále vìt¹í problémy, které obvykle vy¾adují stále více
8 výpoèetního výkonu. Rychlost poèítaèù sice posledních pár desetiletí stále
9 roste exponenciálnì, ale tento rùst se urèitì nìkdy zastaví (napøíklad proto,
10 ¾e vesmír je koneèný) a podle v¹eho u¾ k~tomuto bodu jsme docela blízko
11 (nará¾íme na nejrùznìj¹í fyzikální limity, napøíklad není jasné, jak vyrábìt
12 transistory men¹í ne¾ jeden atom).
14 Jak si tedy s~obrovskými daty poradíme? Jedna z~lákavých mo¾ností je prostì
15 do~výpoètu zapøáhnout více ne¾ jeden procesor. Ostatnì, vícejádrové procesory,
16 které dneska najdeme ve~svých stolních poèítaèích, nejsou nic jiného ne¾
17 víceprocesorový systém na jednom èipu.
19 Nabízí se tedy obtí¾nou úlohu rozdìlit na nìkolik èástí, nechat ka¾dý
20 procesor (èi jádro) poèítat jednu z~èástí a nakonec jejich výsledky spojit
21 dohromady. To se snadno øekne, ale s~výjimkou triviálních úloh u¾ obtí¾nìji
24 Pojïme se podívat na nìkolik zajímavých paralelních algoritmù. Abychom se
25 nemuseli zabývat detaily hardwaru konkrétního víceprocesorového poèítaèe,
26 zavedeme si pomìrnì abstraktní výpoèetní model, toti¾ hradlové sítì. Tento
27 model je daleko paralelnìj¹í ne¾ skuteèný poèítaè, ale pøesto se techniky,
28 které si uká¾eme, dají snadno vyu¾ít i prakticky. Konec koncù sama vnitøní
29 architektura procesorù se na¹emu modelu velmi podobá.
33 Hradlové sítì jsou tvoøeny navzájem propojenými {\I hradly.} Ka¾dé hradlo pøitom
34 poèítá nìjakou (obecnì libovolnou) funkci $\Sigma^k \rightarrow \Sigma$, kde~$\Sigma$
35 je koneèná abeceda (stejná pro celou sí») a~$k$ pøirozené èíslo (poèet vstupù hradla,
36 jinak té¾ jeho {\I arita}).
38 \s{Pøíklad:} Èasto studujeme hradla {\I booleovská} (pracující nad abecedou $\Sigma=\{0,1\}$).
39 Ta poèítají jednotlivé logické funkce, mezi nejbì¾nìj¹í patøí:
42 \:nulární: to jsou konstanty ($\hbox{\csc false}=0$, $\hbox{\csc true}=1$),
43 \:unární: identita a negace ({\csc not},~$\lnot$),
44 \:binární: logický souèin ({\csc and},~$\land$), souèet ({\csc or},~$\lor$), \dots
47 Propojením hradel pak vznikne {\I hradlová sí».} Ne¾ vyøkneme formální definici,
48 pojïme se podívat na pøíklad jedné takové sítì:
50 \figure{hradlova_sit.eps}{Hradlová sí» -- tøívstupová verze funkce {\I majorita}}{3in}
52 Na¹e sí» má tøi vstupy, vnitøní booleovská hradla a jeden výstup. Na výstupu
53 je pøitom jednièka právì tehdy, jsou-li jednièky pøítomny na alespoò dvou
54 vstupech. Jinými slovy vrací {\I majoritu} ze~vstupù, tedy hodnotu, která
57 Obecnì ka¾dá hradlová sí» má nìjaké vstupy, hradla a výstupy.
58 Ka¾dý vstup hradla je pøitom pøipojen buïto na~nìkterý ze~vstupù sítì
59 nebo na~výstup jiného hradla. Výstupy hradel mohou být propojeny na~vstupy
60 dal¹ích hradel (mohou se vìtvit), nebo na výstupy sítì. Pøitom máme zakázáno
63 Nyní toté¾ formálnìji:
65 \s{Definice:} {\I Hradlová sí»} je urèena:
67 \:{\I abecedou} $\Sigma$, co¾ je nìjaká koneèná mno¾ina symbolù;
68 \:po dvou disjunktními koneènými mno¾inami \hfil\break
69 $I$~({\I vstupy}), $O$~({\I výstupy}) a~$H$~({\I hradla});
70 \:acyklickým orientovaným multigrafem~$(V,E)$, kde~$V = I \cup O \cup H$;\foot{Proè
71 potøebujeme multigraf? Napøíklad chceme-li výstup jednoho hradla pøipojit souèasnì
72 na více rùzných vstupù druhého hradla.}
73 \:zobrazením~$F$, které ka¾dému hradlu $h\in H$ pøiøadí nìjakou funkci~$F(h):
74 \Sigma^{a(h)} \rightarrow \Sigma$, co¾ je funkce, kterou toto hradlo vykonává.
75 Èíslu $a(h)$ øíkáme {\I arita} hradla~$h$;
76 \:zobrazením~$z: E \rightarrow {\bb N}$, je¾ o~hranách vedoucích do hradel øíká,
77 kolikátému argumentu funkce odpovídají;\foot{Na hranách vedoucích do výstupù
78 necháváme hodnotu této funkce nevyu¾itu.}
81 \>Pøitom jsou splnìny následující podmínky:
84 \:$\forall i \in I: \deg^+(i)=0$ {\sl (do~vstupù nic nevede);}
85 \:$\forall o \in O: \deg^+(o)=1, \deg^-(o)=0$ {\sl (z~výstupù nic nevede a do~ka¾dého vede právì jedna hrana);}
86 \:$\forall h \in H: \deg^+(v)=a(v)$ {\sl (do~ka¾dého hradla vede tolik hran, kolik je jeho arita);}
87 \:$\forall h \in H~\forall j \in \{1,\ldots,a(h)\}$ existuje právì jedna hrana~$e$ taková, ¾e $e$~konèí v~$h$ a~$z(e)=j$
88 {\sl (v¹echny vstupy hradel jsou zapojeny).}
91 \s{Poznámka:} Nìkdy se hradlovým sítím také øíká {\I kombinaèní obvody} a pokud pracují
92 nad abecedou $\Sigma = \{0,1\}$, pak {\I booleovské obvody}.
94 \s{Definice:} {\I Výpoèet sítì} postupnì pøiøazuje hodnoty z~abecedy~$\Sigma$
95 vrcholùm grafu. Výpoèet probíhá po~{\I taktech.} V~nultém taktu jsou definovány
96 pouze hodnoty na~vstupech sítì a v~hradlech arity~0 (konstanty). V~ka¾dém
97 dal¹ím taktu pak ohodnotíme vrcholy, jejich¾ v¹echny vstupní hrany vedou
98 z~vrcholù s~ji¾ definovanou hodnotou.
100 Hodnotu hradla~$h$ pøitom spoèteme funkcí~$F(h)$ z~hodnot na jeho vstupech
101 uspoøádaných podle funkce~$z(h)$. Výstup sítì pouze zkopíruje hodnotu, která do
104 Jakmile budou po~nìjakém poètu taktù definované hodnoty v¹ech výstupù, výpoèet
105 se zastaví a~sí» vydá výsledek -- ohodnocení výstupù.
107 Podle prùbìhu výpoètu mù¾eme vrcholy sítì rozdìlit do vrstev:
109 \s{Definice:} {\I $i$-tá vrstva $S_i$} obsahuje právì takové vrcholy~$v$,
110 pro~které nejdel¹í z~cest z~libovolného vrcholu se~vstupním stupnìm~0
111 do~$v$ má délku rovnou právì~$i$.
113 \figure{vypocet_site.eps}{Prùbìh výpoètu a rozdìlení sítì na vrstvy}{6cm}
115 \s{Pár pozorování} o~prùbìhu výpoètu:
118 \:V~$i$-té vrstvì jsou tedy právì ty vrcholy, které poprvé ohodnotíme v~$i$-tém
120 \:Jeliko¾ sí» je acyklická, tak platí, ¾e jakmile vrchol ohodnotíme, u¾ se
121 jeho ohodnocení nikdy nemù¾e zmìnit.
122 \:Kdy¾ se vydáme z~libovolného vrcholu proti smìru hran, po~koneènì mnoha
123 krocích dojdeme do~vrcholu s~nulovým vstupním stupnìm (vstupu sítì nebo
124 konstantního hradla). Proto ka¾dý vrchol le¾í v~nìjaké vrstvì.
125 \:Vrstvy jsou disjunktní, tak¾e poèet neprázdných vrstev je nutnì koneèný.
126 V~kombinaci s~pøedchozím pozorováním dostaneme, ¾e výpoèet sítì se v¾dy zastaví.
127 \:Navíc poslední neprázdná vrstva je právì ta, kde se výpoèet zastaví -- z~ka¾dého
128 dal¹ího vrcholu by toti¾ bylo mo¾né po~hranách dojít do vrcholu s~výstupním
129 stupnìm~0 a jediné takové vrcholy jsou výstupy sítì. Ty by tedy musely také
130 le¾et v~nìkteré z~následujících vrstev, co¾ ov¹em není mo¾né, nebo» výpoèet
134 \>To nás motivuje k~následující definici:
136 \s{Definice:} {\I Èasovou slo¾itost} sítì definujeme jako poèet jejích neprázdných
137 vrstev. Podobnì {\I prostorovou slo¾itost} urèíme jako poèet hradel v~síti.
139 \s{Poznámka o~aritách:}
140 Kdybychom pøipustili hradla s~libovolnì vysokým poètem vstupù, mohli bychom
141 libovolný problém se vstupem délky~$n$ a výstupem délky~$\ell$ vyøe¹it v~jedné
142 vrstvì pomocí $\ell$~kusù $n$-vstupových hradel. Ka¾dému bychom prostì
143 pøiøadili funkci, která poèítá pøíslu¹ný bit výsledku ze~v¹ech bitù vstupu.
145 To v¹ak není ani realistické, ani pìkné. Jak z~toho ven? Pøijmeme prostì
146 omezení, ¾e~arity v¹ech hradel budou omezeny nìjakou pevnou konstantou,
147 tøeba dvojkou. Budeme tedy pou¾ívat výhradnì nulární, unární a binární hradla.
149 Poznamenejme je¹tì, ¾e realistický model (by» s~trochu jinými vlastnostmi)
150 by vznikl také tehdy, kdybychom místo arity omezily typy funkcí, øeknìme
151 na {\csc and}, {\csc or} a {\csc not}.
153 \s{Poznámka o~uniformitì:}
154 Dodejme, ¾e od~bì¾ných výpoèetním modelùm, jako je tøeba RAM, se hradlové
155 sítì li¹í jednou podstatnou vlastností -- ka¾dá sí» zpracovává výhradnì vstupy
156 jedné konkrétní velikosti. Chceme tedy najít nìjaký obecný pøedpis, který
157 pro ka¾dou velikost vstupu sestrojí pøíslu¹nou sí». Takovým výpoèetním modelùm
158 se øíká {\I neuniformní.}
160 A~co myslíme oním pøedpisem pro sestrojení sítì? Bude to pro nás prostì
161 nìjaký algoritmus (klasický, neparalelní) bì¾ící v~polynomiálním èase.
162 (Kdybychom dovolili i pomalej¹í algoritmy, mohli bychom bìhem konstrukce
163 provádìt nìjaký nároèný pøedvýpoèet a jeho výsledek zabudovat do struktury
166 \h{Hledá se jednièka}
168 Abychom si nový výpoèetní model osahali, zkusme nejprve sestrojit obvod,
169 který zjistí, zda se mezi jeho~$n$ vstupy vyskytuje alespoò jedna jednièka.
170 Jinými slovy vypoèítat $n$-vstupovou funkci {\csc or}.
172 \>{\I První øe¹ení:} zapojíme hradla za~sebe (sériovì). Èasová i prostorová
173 slo¾itost èiní $\Theta(n)$. Zde ov¹em vùbec nevyu¾íváme toho, ¾e by mohlo poèítat více
176 \>{\I Druhé øe¹ení:} Hradla budeme spojovat do~dvojic, pak výsledky z~tìchto dvojic opìt
177 do~dvojic a tak dále. Díky paralelnímu zapojení dosáhneme èasové slo¾itosti $\Theta(\log n)$,
178 prostorová slo¾itost zùstane lineární.
180 \twofigures{hloupy_or.eps}{Sériové øe¹ení}{1in}{chytry_or.eps}{Paralelní øe¹ení}{3in}
182 \h{Sèítání binárních èísel}
184 Zajímavìj¹í úlohou, její¾ paralelizace u¾ nebude tak triviální, je obyèejné
185 sèítání dvojkových èísel. Mìjme dvì èísla $x$ a $y$ zapsané ve~dvojkové soustavì. Jejich èíslice oznaème
186 $x_{n-1}\ldots x_0$ a $y_{n-1}\ldots y_0$, kde $i$-tý øád má váhu $2^i$.
188 K~seètení se~ihned nabízí pou¾ít starý dobrý \uv{¹kolní algoritmus sèítání pod sebou}, který
189 funguje ve~dvojkové soustavì stejnì dobøe jako v~desítkové. Sèítáme èísla zprava doleva,
190 v¾dy seèteme~$x_i$ s~$y_i$ a~pøièteme pøenos z~ni¾¹ího øádu. Tím dostaneme jednu èíslici
191 výsledku a~pøenos do~vy¹¹ího øádu. Formálnì bychom to mohli zapsat tøeba takto:
193 z_i=x_i \oplus y_i \oplus c_i,
195 kde $z_i$ je $i$-tá èíslice souètu, $\oplus$ znaèí operaci {\csc xor} (souèet modulo~2) a~$c_i$ je {\I pøenos}
196 z~$(i-1)$-ního øádu do~$i$-tého. Pøenos pøitom nastane tehdy, pokud se~nám potkají
197 dvì jednièky pod~sebou, nebo kdy¾ se~vyskytne alespoò jedna jednièka a~k~tomu
198 pøenos z~ni¾¹ího øádu. To je tehdy, kdy¾ mezi tøemi xorovanými èíslicemi jsou alespoò
199 dvì jednièky -- k~tomu se nám hodí ji¾ známý obvod pro majoritu:
203 c_{i+1} &= (x_i~\&~y_i)\lor(x_i~\&~c_i)\lor(y_i~\&~c_i).\cr
207 O~tomto pøedpisu snadno doká¾eme, ¾e funguje (zkuste si to), nicménì pokud podle
208 nìj postavíme hradlovou sí», bude pomìrnì pomalá. Sí» si mù¾eme pøedstavit tak,
209 ¾e je slo¾ena z~nìjakých podsítí (\uv{krabièek}), které budou mít na~vstupu $x_i$,
210 $y_i$ a~$c_i$ a jejich výstupem bude $z_i$ a~$c_{i+1}$:
212 \figure{hloupe_scitani.eps}{Sèítání ¹kolním algoritmem}{1.5in}
214 Ka¾dá krabièka má sice uvnitø konstantní hloubku, ale její výstupy závisí na pøenosu
215 vypoèítaném pøedcházející krabièkou. Jednotlivé krabièky tedy musí urèitì le¾et
216 v~rùzných vrstvách sítì. Celkovì má tedy sí» $\Theta(n)$ hladin a také $\Theta(n)$
217 hradel. Oproti sekvenènímu algoritmu jsme si tedy vùbec nepomohli.
219 \h{Pøenosy v~blocích}
221 Jak sèítání zrychlit? To, co nás pøi sèítání brzdí, jsou evidentnì pøenosy mezi
222 jednotlivými øády. Kdybychom je dokázali spoèítat rychleji, máme vyhráno -- souèet
223 u¾ získáme jednoduchým {\csc xor}ováním, které zvládneme paralelnì v~èase $\Theta(1)$.
224 Uva¾ujme tedy nad zpùsobem, jak pøenosy spoèítat paralelnì.
226 Podívejme se na~libovolný {\I blok} v~na¹em souètu. Tak budeme øíkat èíslùm
227 $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.
229 \figure{blok_scitani.eps}{Blok souètu}{3in}
231 Pro konkrétní sèítance se tedy mù¾eme na blok dívat jako na nìjakou funkci,
232 která dostane jednobitový vstup (pøenos zespoda) a vydá jednobitový výstup (pøenos
233 nahoru). To je nám milé, nebo» takové funkce existují pouze ètyøi:
234 $$\vbox{\halign{$f(x) = #$\hfil &\qquad # \hfil\cr
235 0&konstantní {\bo 0}, blok {\I pohlcuje} pøenos \cr
236 1&konstantní {\bo 1}, blok {\I vytváøí} pøenos \cr
237 x&identita (znaèíme {\tt <}), blok {\I kopíruje} pøenos \cr
238 \neg{x}&negace, uká¾eme, ¾e nenastane \cr
240 Této funkci budeme øíkat {\I chování} pøíslu¹ného bloku.
242 {\I Jednobitové bloky} se pøitom chovají velice jednodu¹e:
244 \figure{bloky_1bit.eps}{Tabulka triviálních blokù}{1.1in}
246 Blok prvního druhu v¾dy pøedává nulový pøenos, a» u¾ do~nìj vstoupí jakýkoliv.
247 Poslední blok naopak sám o~sobì pøenos vytváøí, a» dostane cokoliv.
248 Oba bloky prostøední se chovají tak, ¾e samy o~sobì ¾ádný pøenos nevytvoøí,
249 ale~pokud do~nich nìjaký pøijde, tak~také odejde.
251 {\I Vìt¹í bloky} mù¾eme rozdìlit na èásti a podle jejich chování urèit,
252 jak se chová celý blok. Mìjme blok~$B$ slo¾ený z~men¹ích podblokù~$H$ (horní)
253 a~$D$ (dolní), jejich¾ chování u¾ známe. Z~toho mù¾eme odvodit, jak se chová celý blok:
255 \figure{tabulka_skladani_bloku.eps}{Skládání chování blokù}{1.3in}
257 Pokud vy¹¹í blok pøenos pohlcuje, pak a»~se u¾~ni¾¹í blok chová jakkoli, slo¾ení
258 obou blokù musí v¾dy pohlcovat. V~prvním øádku tabulky jsou tudí¾ nuly. Analogicky,
259 pokud vy¹¹í blok generuje pøenos, tak~ten ni¾¹í na~tom nic nezmìní. V~druhém
260 øádku tabulky jsou tedy samé jednièky. Zajímavìj¹í pøípad nastává, pokud vy¹¹í blok
261 kopíruje -- tehdy zále¾í èistì na~chování ni¾¹ího bloku.
263 V¹imnìme si, ¾e~skládání chování blokù je vlastnì úplnì obyèejné skládání
264 funkcí. Nyní bychom mohli prohlásit, ¾e~budeme poèítat nad~tøíprvkovou abecedou,
265 a~¾e~celou tabulku doká¾eme spoèítat jedním jediným hradlem. Pojïme si v¹ak
266 rozmyslet, jak~bychom takovouto vìc popsali èistì binárnì. Jak tedy tyto tøi stavy
267 popisovat pouze nìkolika bity?
269 Evidentnì nám k tomuto binárnímu zakódování tøí stavù budou staèit bity dva.
270 Oznaème si je jako $p$ a $q$. Tato dvojice mù¾e nabývat hned ètyø mo¾ných hodnot,
271 kterým pøiøadíme tøi mo¾ná chování bloku. Toto kódování mù¾eme zvolit zcela
272 libovolnì, ale pokud si ho zvolíme ¹ikovnì, u¹etøíme si dále práci pøi kompozici.
273 Zvolme si tedy kódování takto:
275 (1,*) = \hbox{\tt <} \qquad
276 (0,0) = \hbox{\bo 0} \qquad
277 (0,1) = \hbox{\bo 1}.
279 Tomu, ¾e blok kopíruje, odpovídá dvojice $p = 1$, $q = \<cokoliv.>$ V~ostatních
280 pøípadech bude~$p$ nulové a~$q$ nám bude øíkat, co je na~výstupu pøíslu¹ného bloku.
281 Jinými slovy $p = 0$ znamená, ¾e funkce je konstanta, pøièem¾ $q$ øíká jaká; naproti
282 tomu $p = 1$~znamená, ¾e funkce je identita, a»~u¾~je $q$ cokoli.
284 V~tomto kódování mù¾eme na¹i tabulku popsat následovnì:
286 p_B &= p_H \land p_D,\cr
287 q_B &= (\neg{p_H} \land q_H) \lor (p_H \land q_D).
290 \h{Paralelní sèítání}
292 Z~popisu chování blokù u¾ je jenom krùèek k~paralelnímu pøedpovídání pøenosù,
293 a~tím i k~paralelní sèítaèce. Bez újmy na~obecnosti budeme pøedpokládat,
294 ¾e~poèet bitù vstupních èísel je mocnina dvojky, jinak si vstup doplníme
295 nulami, co¾ výsledný èas bìhu algoritmu zhor¹í maximálnì konstanta-krát.
297 Algoritmus bude rozdìlen na~dvì èásti. V~první èásti spoèítá chování
298 v¹ech {\I pøirozených blokù} -- tak budeme øíkat blokùm, jejich¾ velikost
299 je mocnina dvojky a pozice je dìlitelná velikostí. Nejprve v~konstantním
300 èase spoèítá chování blokù velikosti~1, ty pak spojí do dvojic, dvojice
301 zase do dvojic atd., obecnì v~$i$-tém kroku spoète chování v¹ech pøirozených
302 blokù velikosti~$2^i$.
304 V~druhé èásti pak dopoèítává pøenosy, a~to tak, aby v~$i$-tém kroku byly známy
305 pøenosy do~øádù dìlitelných~$2^{\log n - i}$. V~nultém kroku tedy pouze $c_0=0$
306 a~$c_n$, který spoèítá z~$c_0$ pomocí chování bloku $\left< 0,n \right>$.
307 V~prvním kroku pomocí $\left< 0,n/2 \right>$ dopoèítá $c_{n/2}$,
308 v~druhém pomocí $\left< 0,n/4 \right>$ spoèítá $c_{n/4}$ a pomocí
309 $\left< n/2,3/4\cdot n \right>$ dostane $c_{3/4\cdot n}$ atd.
310 Obecnì v~$i$-tém kroku pou¾ívá chování blokù velikosti $2^{\log n - i}$.
312 \s{Sèítací sí»} tedy bude vypadat takto:
314 \:$\Theta(1)$ hladin výpoètu chování blokù velikosti~1.
315 \:$\Theta(\log n)$ hladin poèítajících chování pøirozených blokù velikosti~$2^i$.
316 \:$\Theta(\log n)$ hladin dopoèítávajících pøenosy \uv{zahu¹»ováním}.
317 \:$\Theta(1)$ hladin na samotné seètení: $\forall i: z_i = x_i \oplus y_i \oplus c_i$.
320 \figure{deleni_bloku.eps}{Výpoèet pøenosu}{2.5in}
322 Algoritmus tedy pracuje v~èase $\Theta(\log n)$. Hradel je pou¾ito lineárnì: pøi
323 výpoètu chování blokù na jednotlivých hladinách poèet hradel exponenciálnì klesá
324 od~$n$ k~1, bìhem zahu¹»ování pøenosù naopak exponenciálnì stoupá od~1 k~$n$.
325 Obì geometrické øady se seètou na $\Theta(n)$.
327 \h{Paralelní násobení}
329 Je¹tì si rozmysleme, jak rychle by bylo mo¾né èísla násobit. Opìt se inspirujeme
330 ¹kolním algoritmem: pokud násobíme dvì $n$-ciferná èísla $x$ a~$y$, uvá¾íme
331 v¹ech~$n$ posunutí èísla~$y$, ka¾dé z~nich vynásobíme pøíslu¹nou èíslicí v~$y$
332 a výsledky posèítáme.
334 \figure{skolni_nasobeni.eps}{©kolní násobení}{2in}
336 Ve~dvojkové soustavì je to je¹tì jednodu¹¹í: násobení jednou èíslicí je prostý
337 {\csc and.} Paralelnì tedy vytvoøíme v¹echna posunutí a spoèítáme v¹echny {\csc and}y.
338 To v¹e stihneme za 1~takt výpoètu.
340 Zbývá seèíst $n$~èísel, z~nich¾ ka¾dé má $\Theta(n)$ bitù. Mohli bychom opìt
341 pou¾ít osvìdèený trik: sèítat dvojice èísel, pak dvojice souètù dvojic, atd.
342 Taková sí» by mìla tvar binárního stromu hloubky $\log n$, jeho¾ ka¾dý vrchol
343 obsahuje jednu sèítaèku a na tu, jak víme, postaèí $\Theta(\log n)$ hladin.
344 Celý výpoèet tedy bì¾í v~èase $\Theta(\log^2 n)$.
346 Jde to ale rychleji, pou¾ijeme-li jednoduchý, témìø kouzelnický trik.
347 Sestrojíme {\I kompresor} -- to bude obvod konstantní hloubky, který na~vstupu
348 dostane tøi èísla a vypoète z~nich dvì èísla mající stejný souèet jako zadaná
351 K~èemu je to dobré? Máme-li seèíst $n$~èísel, v~konstantním èase doká¾eme tento
352 úkol pøevést na seètení $\lceil 2/3\cdot n\rceil$ èísel, to pak opìt v~konstantním èase
353 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
354 zbudou dvì èísla a ta seèteme klasickou sèítaèkou. Zbývá vymyslet kompresor.
356 \s{Konstrukce kompresoru:}
357 Oznaème vstupy kompresoru $x$, $y$ a~$z$ a výstupy $p$ a~$q$.
358 Pro ka¾dý øád~$i$ spoèteme souèet $x_i + y_i + z_i$. To je nìjaké
359 dvoubitové èíslo, tak¾e mù¾eme jeho ní¾¹í bit prohlásit za~$p_i$
360 a vy¹¹í za~$q_{i+1}$.
362 Jinými slovy jsme v¹echna tøi èísla normálnì seèetli, ale místo abychom
363 pøenosy posílali do vy¹¹ího øádu, vytvoøili jsme z~nich dal¹í èíslo,
364 které má být k~výsledku èasem pøièteno.
366 \figure{add_3to2.eps}{Kompresor}{0.9in}
368 \s{Shrnutí:} Na¹e sí» pro paralelní násobení pracuje v~èase $\Theta(\log n)$
369 -- nejdøíve v~konstantním èase vytváøíme mezivýsledky, pak pou¾ijeme $\Theta(\log n)$
370 hladin kompresorù konstantní hloubky a nakonec jednu sèítaèku hloubky $\Theta(\log n)$.
371 Jistou vadou na kráse ov¹em je, ¾e na to potøebujeme $\Theta(n^2)$ hradel.