Vyšlo v týdeníku Computerworld č. 47/92 v roce 1992
Vytištěno z adresy: http://www.earchiv.cz/a92/a247c120.php3

Coprocessor

Navrhnout nový mikroprocesor tak, aby optimálně vyhovoval všem možným aplikacím, není asi dost dobře možné. Jak například řešit otázku numerických výpočtů? Uživatelé, kteří svůj počítač používají především pro psaní textů a různou osobní či kancelářskou agendu, prakticky vůbec nepotřebují násobit či dělit v pohyblivé řádové čárce, počítat hodnoty goniometrických funkcí, odmocňovat apod. A pokud někdy ano, je pro ně plně postačující, když se takovéto výpočty zajišťují programovými prostředky. V jiné situaci jsou ale uživatelé, jejichž aplikace přímo staví na intenzívních numerických výpočtech - jako to dělají například nejrůznější oblasti počítačem podporovaného navrhování, náročnější grafické aplikace, výpočty neuronových sítí, řešení diferenciálních rovnic apod. Pro tyto aplikace je prakticky jedinou možností používat speciální hardware, který dokáže provádět potřebné numerické výpočty dostatečně rychle. Otázkou ovšem je, jak má být tento specializovaný hardware koncipován.

Jednou z možností je realizovat jej ve formě samostatného procesoru, specializovaného právě na numerické výpočty. Tato varianta je samozřejmě možná, má však jednu nevýhodu, a tou je poměrně velká režie. Každý samostatný procesor musí být něčím řízen - buďto vlastním programem, nebo alespoň řídicími příkazy, zapisovanými do příslušných vnitřních registrů tohoto procesoru. Sestavování těchto programů či vysílání řídicích příkazů, stejně jako předávání vstupních dat a zpětné odebírání výsledků, je však stále na "hlavním" procesoru, který s tím má také určitou režii. Aby se mu vůbec "vyplatilo" specializovaný procesor používat, musí být tato režie menší, než kdyby si numerické výpočty zajišťoval sám vlastními prostředky (tj. pomocí vhodných programových rutin).

Alternativou je možnost zabudovat speciální hardware pro numerické výpočty přímo do "hlavního" procesoru, resp. mikroprocesoru. Tím se sice umožní jeho maximálně efektivní využití, ale na druhé straně se zase nepříznivě projeví jiné efekty. Například efekt ekonomický - cena výsledného mikroprocesoru bude vyšší, a bude ji muset platit i ten, kdo prostředky pro numerické výpočty vůec nepotřebuje. Snad ještě významnější je ale hledisko technologické: přidat další obvody přímo na čip mikroprocesoru znamená zvýšit jeho celkovou plochu. S tím jsou ale spojeny technické problémy, především pak menší výtěžnost (tj. podíl počtu plně funkčních čipů, z celkového počtu vyrobených), která se zvětšováním plochy čipu rychle klesá. Pro výrobce je pak výhodnější vyrobit dva menší obvody, než jeden o dvojnásobné ploše. A právě to je asi jedna z hlavních myšlenek, které stály u zrodu tzv. koprocesorů (coprocessors), a které se dostaly do povědomí širší odborné veřejnosti především v souvislosti s mikroprocesory firmy Intel a s osobními počítači standardu IBM PC.

Koprocesor tak vlastně není nic jiného, než specializovaný hardware, který se výrobci nevyplatilo (z technologických, ekonomických či dalších důvodů) zaintegrovat přímo do vlastního mikroprocesoru, a tak jej vyrábí jako samostatný obvod. Koprocesor je ovšem samostatný jen z hlediska fyzického provedení (můžete ho například vzít do ruky), ale nikoli již z hlediska možnosti samostatného fungování. Nejlépe je si představit koprocesor jako jakýsi "nástavec", který si můžete přikoupit ke svému procesoru a tím zvětšit jeho funkční možnosti. Přikoupíte-li si takto k mikroprocesoru svého počítače PC numerický koprocesor, z pohledu programátora v asembleru se vám tato skutečnost projeví tak, že váš procesor bude náhle vybaven dalšími registry, a bude "umět" nové strojové instrukce, které dosud nebyl schopen vykonávat. Z pohledu programátorů ve vyšších programovacích jazycích se vám existence koprocesoru projeví vlastně jen nepřímo - zrychlením běhu vámi vytvářených aplikací - neboť o využití nových registrů a strojových instrukcí se za vás postará příslušný překladač. Podobně v případě, že pouze provozujete již hotové (legálně zakoupené?) aplikace. Také zde se vám existence koprocesoru projeví zrychlením běhu vaší aplikace, někdy až několikanásobně - velmi však záleží na konkrétní povaze aplikace, charakteru řešené úlohy, rozsahu vstupních dat a dalších faktorech. Některé náročnější aplikace dokonce odmítají bez numerického koprocesoru vůbec pracovat.

Vraťme se však ještě ke vzájemnému vztahu procesor-koprocesor a k mechanismu jejich součinnosti. Kdyby to nebylo tak zavádějící, bylo by asi nejvýstižnější přirovnat koprocesor k obvodu, který parazituje na svém (mikro)procesoru. Alespoň u mikroprocesorů firmy Intel je jejich vzájemná koexistence řešena tak, že procesor načítá jednotlivé instrukce z paměti, vypočítává adresy jejich operandů a stará se také o načítání těchto operandů z/do paměti. Koprocesor mu přitom pouze "kouká přes rameno", a do hry vstupuje pouze tehdy, když procesor takto načte z paměti některou strojovou instrukci, která je ve skutečnosti určena určena koprocesoru. Ten však ještě nechá procesor, aby vypočítal adresy všech případných operandů této instrukce, a postaral se také o jejich načtení z paměti. Samotná data si pak již od paměti převezme koprocesor, a začne je požadovaným způsobem zpracovávat, zatímco procesor pokračuje načítáním další instrukce. Koprocesor tak vlastně svému procesoru "odnímá" provádění některých strojových instrukcí, které si od něj nechává navíc předpřipravit. Sám ale není schopen si tyto činnosti (načítání instrukcí, výpočet adres operandů) zajistit, takže bez svého procesoru není schopen fungovat.

Koprocesory dnes existují k více různým procesorům, nejen k mikroprocesorům 80x86 firmy Intel. Nejčastěji jde o numerické koprocesory, ale obecně může jít i o koprocesory, specializované i na jiné druhy specifických čiností. Právě na příkladu numerických koprocesorů firmy Intel však lze názorně ukázat, jak se mění možnosti moderních polovodičových technologií. Pro mikroprocesory 8086/88, 80286 a 80386 bylo nutné realizovat numerický koprocesor tak, jak jsme si dosud popisovali - tedy jako samostatný obvod. Neustálým zdokonalováním výrobních technologií ale došlo k takovému zvýšení výtěžnosti, že se pro výrobce již stalo únosné vyrábět vlastní procesor i s numerickým koprocesorem na jediném čipu. Tak vznikl mikroprocesor i80486, který již má v sobě numerický koprocesor zabudován.

Mikroprocesor Intel 80486 však existuje i v další verzi, 80486SX. Ta se vyznačuje tím, že také obsahuje numerický koprocesor, ale tento je logicky odpojen, a není jej tudíž možné využívat. O důvodech je možné spekulovat - může jít například o snahu udržet vysokou cenu "plnohodnotných" mikroprocesorů 486, označovaných někdy také jako 80486DX. Jiným možným vysvětlením pro existenci cenově výhodnější verze SX je stále ještě nedostatečná výtěžnost výrobních technologií: mikroprocesory 80486SX mohou být ty, u kterých zabudovaný koprocesor vykazuje nějakou vadu, a tak byl dodatečně odpojen.