Dva dráty dovnitř, jeden ven
Mikrovlnka se nerozjede, dokud nezavřete dvířka a nezmáčknete start. To pravidlo není nikde naprogramované, je zadrátované. Počítač se rozhoduje úplně stejně, jen má takových pravidel miliardy.
Tohle je třetí díl série Jak funguje počítač. Od jediného drátu v ní poskládáme celý počítač a skončíme u toho, proč provoz umělé inteligence stojí, co stojí. Každý díl vysvětlí jednu věc a staví na předchozím.
Otevřete dvířka mikrovlnky uprostřed ohřevu a trouba se zastaví dřív, než stihnete ucuknout rukou. Není to tím, že by někde běžel program, který si všiml otevřených dvířek. Ve dvířkách je páčka, a ta při otevření rozpojí kontakt, kterým jde proud do magnetronu, tedy do součástky, která jídlo ohřívá. To rozhodnutí je kus plechu.
Výrobci to navíc dělají dvakrát. Předpis, podle kterého se mikrovlnky certifikují pro americký trh, žádá dvě nezávislá blokování dvířek a k tomu podmínku, že selhání jediné součástky nesmí vyřadit obě najednou. Softwarová kontrola by takový požadavek nesplnila.
Všimněte si toho slovíčka „a“. Magnetron se rozběhne, když jsou dvířka zavřená a zároveň je zmáčknutý start. Dvě podmínky, jeden výsledek. Tohle je všechno, co počítač při rozhodování dělá. Jen to dělá v mnoha vrstvách nad sebou a velmi rychle.
Dva díly zpátky jsme se dohodli, že drát pod proudem znamená jedničku a drát bez proudu nulu. Minule k tomu přibyl tranzistor, tedy vypínač, který místo prstu ovládá jiný drát. Víc věcí dneska potřebovat nebudete, všechno ostatní z těch dvou postavíme.
Než začnu cokoli vysvětlovat, zkuste si to.
Dva vypínače na jednom drátu a na konci žárovka. Zkuste ji rozsvítit a sledujte, jak se vám vedle schématu plní tabulka. Hotovo je, až v ní budou všechny řádky.
Čtyři. Víc jich být nemůže. Každý drát je v ustáleném stavu buď pod proudem, nebo není, nic mezi tím se za platnou hodnotu nepočítá, a dva dráty se tedy dají poskládat přesně čtyřmi způsoby.
Tím se ta tabulka stává zvláštní věcí. Není to ukázka ani příklad, je to úplný popis toho, jak se krabička rozhoduje. Krabička si totiž nic nepamatuje, takže jakmile znáte všechny čtyři řádky, dalším pokusem se o ní nic nového nedozvíte. Až obvodům v pozdějším dílu přidáme paměť, přestane to platit a budeme to muset řešit znovu.
Takové tabulce se říká pravdivostní tabulka a krabičce, která se podle ní chová, hradlo (anglicky gate). To vaše se rozsvítilo jen při obou vypínačích zapnutých a jmenuje se AND.
Čtyři pravidla, která stačí
Z té tabulky plyne ještě něco. Řádky jsou čtyři a do každého můžete nezávisle napsat nulu, nebo jedničku. Možností je tedy dva krát dva krát dva krát dva, dohromady šestnáct, a víc pravidel pro dva vstupy vymyslet nejde.
Šest z nich je k ničemu. Jedno vrací vždycky nulu, jiné vždycky jedničku a další čtyři prostě opíšou nebo obrátí jeden ze vstupů a druhý ignorují. Zbývá deset použitelných a z nich si tady ukážeme tři. Čtvrté hradlo, bez kterého se taky neobejdete, do téhle šestnáctky vůbec nepatří.
Čtyři různá pravidla v jedné krabičce. Přepínejte typ hradla a sledujte, jak se mění tabulka vedle schématu. U posledního z nich se změní i počet vstupů.
AND znáte z mikrovlnky. Dva vypínače za sebou na jednom drátu, proud musí projít oběma, takže stačí jeden rozpojený a je konec.
OR je dvojice vypínačů vedle sebe, každý na vlastním drátu. Proud si vybere, kudy poteče, a sepnout stačí kterýkoli z nich. V autě takhle funguje stropní světlo: rozsvítí se, když otevřete dveře řidiče, a stejně tak, když otevřete kterékoli jiné.
XOR vypadá ze čtveřice nejpodivněji. Rozsvítí se tehdy, když se oba vstupy liší, což zní jako pravidlo vymyšlené pro nic. Je to ale hradlo, kterým se porovnává, a umí i něco víc. Blízko má k domovnímu schodišťovému vypínači, kde přehození kteréhokoli ze dvou vypínačů změní stav světla. Doopravdy to XOR není, podle zapojení z něj vyjde i jeho přesný opak, ale ta jedna vlastnost na něm sedí.
NOT do šestnáctky nepatří, protože má jediný vstup. Dělá to nejjednodušší, co jde, prohodí jedničku za nulu. Tím padá představa „dva dráty dovnitř, jeden ven“ z titulku tohohle článku, a je lepší, že padne hned. Na hradle nezáleží na počtu vstupů. Záleží na tom, že výstup je jednoznačně daný tabulkou.
Uvnitř té krabičky nejsou vypínače, které by někdo přepínal prstem. Jsou tam tranzistory z minulého dílu.
Co je uvnitř té krabičky doopravdy
Tranzistory se v hradlech používají ve dvou doplňujících se typech. Jeden sepne, když je na řídicím drátu jednička, druhý, když je tam nula. Z nich se postaví dvě skupiny: jedna umí vytáhnout výstup k jedničce, druhá ho umí stáhnout k nule, a zapojení se navrhne tak, aby byla vždycky sepnutá právě jedna z nich. Odtud jméno CMOS, kde to C znamená komplementární. Při samotném přepnutí jsou na okamžik sepnuté obě a čipem nakrátko proteče proud, což je jeden ze zdrojů spotřeby.
Skupina, která výstup vytahuje nahoru, přitom sepne při nule na vstupu. Výsledek proto vychází vždycky obrácený a standardní CMOS hradlo umí jen invertující funkce. Invertor, tedy NOT, potřebuje dva tranzistory. NAND, což je AND s obráceným výstupem, čtyři. A obyčejné AND šest, protože se staví jako NAND a za ním invertor. AND je tedy doslova dražší než NAND, přesně naopak, než by člověk čekal.
Výstup jednoho je vstup druhého
Výstup hradla je obyčejný drát. Buď je pod proudem, nebo není. Nic víc o něm vědět nepotřebujete, a tak může jít rovnou do dalšího hradla. Jediné, co se musí hlídat, je kolik dalších vstupů jeden výstup utáhne. Za určitým počtem se mezi ně vkládá zesilovač.
NOT je zapojený napevno, protože do něj vede jediný drát. Vyberte druhé hradlo a ověřte si ho na všech čtyřech kombinacích vstupů, ne jen na té zobrazené.
Řešení je NOT a za ním AND. Slovo „není“ v zadání si vezme NOT, které obrátí drát se správným kódem, a slovo „a zároveň“ si vezme AND, do kterého jde hlídací režim a výsledek toho NOT. Jedna česká věta se tím změnila na dvě krabičky zapojené za sebou.
A to je celý princip. Vezmete pravidlo, napíšete si ho jako tabulku, a tu tabulku poskládáte z hradel. Postup je mechanický a funguje pro libovolné pravidlo, které závisí jen na tom, co je na vstupech právě teď, při libovolném počtu vstupů.
Vstupů přitom nemusí být jen dva. Se třemi má tabulka osm řádků, se čtyřmi šestnáct a s každým dalším drátem se počet řádků zdvojnásobí. Hradla se tím nemění, jen jich je potřeba víc a zapojí se do víc pater za sebou. Ručně se takhle dá zvládnout zhruba pět vstupů, pak už to za člověka dělá software.
Když přidáváte vstupy a patra, nikde nenarazíte na hranici, za kterou by bylo potřeba vymyslet nový druh součástky. Pravidlo o pěti vstupech i pravidlo o pěti stech vstupech se staví ze stejných čtyř krabiček a liší se jen počtem. Sčítačka, paměť, procesor i grafická karta, které čekají na další díly, jsou tohle poskládané ve větším měřítku a chytřeji.
Proč se v praxi všechno staví z NAND
Samotné NAND stačí na všechno ostatní. NOT z něj uděláte tak, že oba vstupy spojíte dohromady. AND je NAND a za ním to NOT. OR dostanete z De Morganových pravidel, když obrátíte oba vstupy a pošlete je do NAND. Jediný typ hradla tedy teoreticky stačí na jakýkoli obvod.
Praktický důvod jeho četnosti je ale jiný, protože univerzální je úplně stejně i NOR a tolik ho na čipech není. NAND je nejlevnější hradlo, které umí invertovat, a syntéza do invertující logiky na něj mapuje přirozeně. Hlavně ale má v sérii ty tranzistory, které vedou lépe. NOR by musel mít v sérii ty horší, a byl by proto širší a pomalejší. Tím NAND nad NOR vyhrál.
Jméno po tomhle hradle dostala i paměť v telefonu. NAND flash, kterou v roce 1987 navrhl Fudžio Masuoka v Toshibě, má paměťové buňky zapojené v řadě za sebou, stejně jako tranzistory v hradle NAND. Řetězec potřebuje mnohem méně kontaktů než samostatně adresovaná buňka, takže se jich na stejnou plochu vejde víc. Platí se za to tím, že se z takové paměti špatně čte jediný bajt a čte se po celých stránkách.
Od podmínky k drátu
Vývojář napíše if (a && b), což se čte „když platí a a zároveň b“, a nepřemýšlí o tom. Ta podmínka se přeloží na strojové instrukce a ty v procesoru vyhodnotí obvody z hradel. Cesta tam je klikatější, než by se hodilo do pěkného příběhu, ale vede.
Proč se if (a && b) na hradlo AND nepřeloží
Operátor && se v C, Javě, JavaScriptu i PHP vyhodnocuje zkráceně. Když je a nepravdivé, b se vůbec nevyhodnotí, protože výsledek je už rozhodnutý. Překladač z toho proto obvykle neudělá hradlo AND, ale podmíněný skok: otestuje a, a pokud neprošlo, zbytek přeskočí. Rozhoduje o tom překladač, ne procesor, a pokud b nemá vedlejší efekty, umí z toho udělat i variantu bez skoku.
I ten skok ale nakonec rozhodnou hradla, jen o patro jinde: podmínka se vyčíslí, zapíše do příznakového registru a větvicí jednotka ho vyhodnotí kombinační logikou.
Do obvodu z hlavního textu se trefíte spíš bitovým &. Ten žádné zkracování nedělá, vezme oba operandy celé a provede AND nad každou dvojicí bitů zvlášť. Nad 64bitovými čísly je to 64 hradel AND vedle sebe, všechna pracují současně.
Jedno místo v procesoru ovšem poznáte podle hradla okamžitě. Když se porovnávají dvě celá čísla na shodu, pustí se každá dvojice odpovídajících si bitů do vlastního XOR. To vrátí jedničku všude, kde se bity liší. Pak už stačí zkontrolovat, že z žádného XOR jednička nevyšla. Hradlo, které na první pohled vypadalo nejpodivněji, je tedy to, které leží pod porovnáváním čísel na rovnost, ať už jako samostatný komparátor, nebo schované uvnitř sčítačky.
Zapojení hradel dnes skoro nikdo nekreslí ručně. Návrhář popíše, co má obvod dělat, a nástroj z toho sám vygeneruje konkrétní zapojení z knihovny dané výrobní technologie. Ručně se kreslí samotné buňky té knihovny, paměti a pár nejkritičtějších bloků. Pravidlo, tabulka, hradla: pořád ten samý postup, jen ho dělá počítač pro počítač.
Měřítko je jediné, co se od vaší hádanky liší. Těch 184 miliard tranzistorů, které Apple uvádí u čipu M3 Ultra z minulého dílu, z velké části sedí v pamětech a v grafické části, takže hradel je výrazně míň, ale pořád jde o miliardy krabiček, které dělají přesně to, co ty vaše dvě.
Proč hradlo nepřepne okamžitě a co to dělá s taktem
Mezi okamžikem, kdy se změní vstup, a okamžikem, kdy se ustálí výstup, uběhne měřitelný čas. Tranzistor musí nabít nebo vybít kapacitu dalšího hradla a drátu, který k němu vede. Říká se tomu zpoždění hradla. Na dnešních čipech přitom nezanedbatelnou část spolkne samotný drát, ne tranzistor, a proto se časování nedá odhadnout z počtu hradel, dokud není hotové rozmístění.
Zpoždění se na cestě sečtou a nejdelší cesta mezi dvěma registry rozhoduje o tom, jak rychle smí čip tikat. Říká se jí kritická cesta.
Při 5 GHz má jedna perioda 200 pikosekund. Celý ten rozpočet ale logika nedostane: kus si vezmou registry na obou koncích cesty a nepřesnost rozvodu hodinového signálu. Do toho, co zbude, se musí vejít všechno, co návrhář do jedné etapy přidá. Když se to nevejde, musí klesnout takt. Proto se víc gigahertzů nedá jen tak nastavit a proto se složitější operace rozkládají do víc etap za sebou.
Sčítání, které nikdo nenaprogramoval
Na poslední pokus se bude hodit dvojkový zápis z prvního dílu, kde druhé místo zleva znamená dvojku a „10“ se tedy čte jako dvě.
Postavte nad sebe AND a pod něj XOR, oběma pusťte tytéž dva vstupy a oba vypínače přepněte na jedničku.
Nahoře AND, pod ním XOR, oba dostávají stejné dva vstupy. Přepněte oba vypínače na 1 a přečtěte obě žárovky odshora dolů jako dvojciferné číslo.
Horní AND se rozsvítilo, dolní XOR zhaslo. Odshora dolů to dává 10, a 1 + 1 je ve dvojkové soustavě opravdu 10, tedy dvě. Projděte si i zbylé tři kombinace vypínačů. 0 + 0 dá 00, 1 + 0 a 0 + 1 shodně 01. Sedí to pokaždé, ne jen v tom jednom případě, kvůli kterému jsem vás sem poslal.
Horní žárovce se říká přenos, dolní součet. Těm dvěma krabičkám přitom nikdo neřekl, že mají počítat. Pořád jen vyhodnocují dva dráty podle pravidla z tabulky, stejně jako před chvílí vyhodnocovaly hlídací režim a kód od alarmu. Sčítání z toho vypadlo jaksi mimochodem.
Jenže sečíst jedničku s jedničkou není zrovna výkon. U osmibitových čísel bude ten přenos, který se právě rozsvítil, muset někam doputovat.