Matematický koprocesor

Blokové schéma koprocesoru Intel 8087

Matematický koprocesor případně numerický koprocesor, někdy zkráceně jen koprocesor (angl. numeric coprocessor, math coprocessor zkráceně MCP nebo floating-point unit zkráceně FPU) je koprocesor určený na vykonávání operací s čísly s pohyblivou řádovou čárkou. Některé typy matematických koprocesorů jsou schopné vykonávání i složitějších matematických operací. Matematický koprocesor může být implementovaný jako samostatná jednotka nebo může být součástí CPU.

V minulosti procesory neobsahovaly žádný zabudovaný mechanizmus na zpracování čísel s plovoucí desetinnou čárkou. Zpracování těchto čísel bylo realizované externím matematickým koprocesorem případně bylo emulované mikroprogramem v aritmeticko-logické jednotce procesoru. Vykonávání operací s čísly s pohyblivou desetinnou čárkou emulací v ALU je však mnohem pomalejší a navíc zatěžuje hlavní procesor.

Přestože je možné softwarovou emulací matematického koprocesoru ušetřit výrobní náklady, v současných procesorech pro osobní počítače je matematický koprocesor integrovaný v mikroprocesoru. To bylo umožněno prudkým poklesem výrobních nákladů v posledních letech.

Koprocesory Intel 8087

Intel 8087

Koprocesor Intel 8087 byl přídavný matematický koprocesor dodávaný pro procesory Intel 8086, doplňující jejich funkčnost o podporu práce s reálnými čísly (přesněji s čísly s pohyblivou řádovou čárkou). Byl poměrně drahý, dal se však softwarově emulovat (což bylo asi desetkrát pomalejší).

Z matematického koprocesoru Intel 8087 vycházely i koprocesory pro novější procesory Intel: koprocesory 80287 (pro procesor 80286), 80387 (pro procesor 80386). Také procesor 80486 již obsahoval koprocesor na jednom čipu s CPU. Existovala sice verze 80486 SX, ale ta obsahovala koprocesor, který byl deaktivovaný. Procesory Pentium měly již matematický koprocesor vždy v sobě integrovaný a aktivní – v těchto případech již pojem matematický koprocesor v podstatě ztrácí smysl a je lepší používat pojem FPU.

Vnitřní struktura FPU

FPU je jednotka pro práci s čísly s pohyblivou řádovou čárkou (jak je patrno již jejího názvu – Floating Point Unit). Z pohledu programátora obsahuje následující registry:

  • osm registrů po 80 bitech pro ukládání čísel s pohyblivou řádovou čárkou. Tyto registry se označují jako ST0 až ST7 a chovají se jako zásobník s vrcholem ST0. Lze však i přistupovat k libovolnému ST registru přímo.
  • registr známek (Tag register) – šestnáctibitový registr uchovávající informace o jednotlivých ST registrech (každému ST registru jsou přiřazeny dva bity pro uchování jedné ze čtyř hodnot: zda je prázdný, obsahuje platné číslo, nulu nebo neplatné číslo)
  • stavový a řídící registr (Status register a Control (word) register) – šestnáctibitové registry funkčně zhruba odpovídající registru Flags procesorů 80x86

Jednotka FPU pracuje se třemi formáty čísel s pohyblivou řádovou čárkou:

  • single precision (32 bitů) – podle standardu IEEE
  • double precision (64 bitů) – podle standardu IEEE
  • extended precision (80 bitů) nestandardní formát Intelu

Tyto formáty se v podstatě liší jen datovou velikostí – samotné číslo je v nich ukládáno stejným způsobem: znaménko (1 bit) – exponentmantisa

Nejlevější bit slouží jako znaménkový a je v něm uložena informace, zda je číslo kladné nebo záporné . Nula značí plus, jednička minus

Exponent je ukládán na osmi bitech (u single precision) nebo na 11 bitech (u double precision). Je ukládán v kódu transformované nuly (též aditivní kód – viz Dvojková soustava).

Mantisa je ukládána na „zbytku“ bitů, tj. na 23 (single precision) resp. 52 (double precision) bitech. Její tvar závisí na typu uloženého čísla (viz dále).

Znázornění formátu čísel s pohyblivou řádovou čárkou

Typy čísel uložitelných v STx registrech

V STx registrech lze ukládat čísla jak IEEE formátech (single a double precision), tak čísla v 80bitovém formátu Intel.

Ve všech těchto třech formátech lze ukládat následující typy čísel:

  • normalizovaná čísla – čísla ve tvaru +/− 1.mmmm… · 2eeee…. Tato čísla jsou reprezentována jakoukoli hodnotou uloženou v mantise a jakoukoli hodnotou v exponentu s výjimkou nuly a nejvyšší uložitelné hodnoty. Mantisa začíná vždy jedničkou následovanou desetinnou čárkou; povšimněte si, že je uložena s vynecháním jedničky na začátku, např. mantisa 1.01100110 je uložena jako 01100110.
  • denormalizovaná čísla – jsou reprezentována nulovým exponentem a libovolnou nenulovou hodnotou uloženou v mantise. Mantisa je uložena s pevnou řádovou čárkou ve tvaru m.mmmm…, tj. mantisa 0.0011001 je uložena jako 00011001. Tato čísla se využívají pro ukládání velmi malých hodnot, která nejdou uložit normalizovaně.
  • nula – je reprezentována nulovým exponentem a nulovou mantisou
  • nekonečno (infinity) – je reprezentováno maximálním exponentem a nulovou mantisou. Toto číslo vznikne např. po dělení nulou.
  • nečíselná hodnota (NaN, Not a Number) – je reprezentována maximálním exponentem a nenulovou mantisou, toto „číslo“ vznikne např. po dělení 0/0.

Tabulka uložitelných hodnot pro single precision (pro ostatní formáty bude tabulka obdobná)

typ číslaexponentmantisa v pamětivýznam paměťové mantisyodpovídající známka (v Tag registru)
normalizované číslo0 < exponent < 255m = libovolná hodnotadesetinná část skutečné mantisy (tvar 1,mmmm)0
denormalizované číslo0libovolná nenulová hodnotaskutečná mantisa s pevnou desetinnou čárkou za nejvyšším bitem2
nula0001
nekonečno25502
nečíselná hodnota255libovolná nenulová hodnota2

Odkazy

Související články

  • Streaming SIMD Extensions – podpora vektorových jednotek (paralelních SIMD jednotek) pro procesory Intel a AMD
  • IEEE 754 – norma čísel s plovoucí řádovou čárkou, ve které matematický koprocesor typicky počítá
  • Koprocesor – obecný koprocesor

Externí odkazy

Média použitá na této stránce

Intel 8087.jpg
Autor: Henry Mühlpfordt, Licence: CC BY-SA 3.0
Intel 8087 Coprocessor
Intel 8087 arch.svg
Autor: Appaloosa, Licence: CC BY-SA 3.0
Intel i8087 and 80287 microarchitecture
Single double extended2.gif
Ukládání dat v FPU - single, double a extended precision