Un coprocesor matematic este un coprocesor pentru extinderea setului de instrucțiuni al procesorului central și furnizarea acestuia cu funcționalitatea unui modul de operare în virgulă mobilă , pentru procesoarele care nu au un modul integrat.
Unitate în virgulă mobilă (sau virgulă mobilă ; Unitate în virgulă mobilă în limba engleză (FPU) - parte a procesorului pentru efectuarea unei game largi de operații matematice pe numere reale .
Procesoarele simple „ întregi ” pentru lucrul cu numere reale și operații matematice necesită proceduri de suport adecvate și timp pentru a le executa. Modulul de operații în virgulă mobilă acceptă lucrul cu ele la nivel de primitive - încărcarea, descărcarea unui număr real (în/din registrele specializate ) sau o operație matematică asupra lor este efectuată printr-o singură comandă, din acest motiv, o accelerare semnificativă a unor astfel de operații este dus la bun sfârșit.
x87 este un set de instrucțiuni special pentru lucrul cu calcule matematice, care este un subset al arhitecturii procesorului x86 . A primit acest nume deoarece cipurile individuale originale ale coprocesorului matematic aveau nume care se termină în 87 . Ca și alte extensii ale setului de instrucțiuni de bază al procesorului, aceste instrucțiuni nu sunt strict necesare pentru a construi un program de lucru, dar atunci când sunt implementate în hardware, ele permit îndeplinirea sarcinilor matematice comune mult mai rapid. De exemplu, setul de instrucțiuni x87 conține instrucțiuni pentru calcularea valorilor sinus sau cosinus .
Pentru procesoarele din familia x86 de la 8086/8088 la 386 , unitatea în virgulă mobilă a fost separată într-un cip separat numit coprocesor matematic . Pentru a instala un coprocesor pe placa computerului, a fost furnizat un conector separat.
Coprocesorul nu este un procesor cu drepturi depline, deoarece nu poate efectua multe din operațiunile necesare pentru aceasta (de exemplu, nu poate funcționa cu un program și nu poate calcula adrese de memorie), fiind doar un anex al procesorului central.
Una dintre schemele de interacțiune între procesorul central și coprocesor, utilizată în special în coprocesoarele x86, este implementată după cum urmează:
Începând cu procesorul Intel486DX , unitatea în virgulă mobilă a fost integrată în procesor și numită FPU. În linia Intel486SX , modulul FPU a fost dezactivat (la început, procesoarele cu un FPU defect au căzut în această linie). Pentru procesoarele Intel486SX , a fost lansat și un „coprocesor” Intel487SX , dar de fapt a fost un procesor Intel486DX , iar atunci când a fost instalat, procesorul Intel486SX a fost dezactivat .
În ciuda integrării, FPU-ul din procesoarele i486 este un coprocesor neschimbat realizat pe același cip, în plus, circuitul FPU i486 este complet identic cu coprocesorul 387DX din generația anterioară până la frecvența de ceas (jumătate din frecvența procesorului central). Adevărata integrare a FPU-ului cu procesorul a început doar cu procesoarele Pentium MMX.
Coprocesoarele pentru platforma x86, fabricate de Weitek , au fost utilizate pe scară largă în perioada corespunzătoare - au lansat 1167, 2167 sub formă de chipset și cipuri 3167, 4167, pentru procesoarele 8086 , 80286 , 80386 , respectiv 80486 . În comparație cu coprocesoarele de la Intel, acestea au oferit performanțe de 2-3 ori mai mari, dar aveau o interfață software incompatibilă implementată prin tehnologia de mapare a memoriei. S-a rezumat la faptul că procesorul principal trebuia să scrie informații în anumite zone de memorie controlate de coprocesorul Weitek (nu exista RAM proprie acolo). Adresa specifică la care a fost făcută înregistrarea a fost interpretată ca o anumită comandă. În ciuda incompatibilității, coprocesoarele Weitek au fost susținute pe scară largă atât de dezvoltatorii de software, cât și de producătorii de plăci de bază, care au furnizat socluri pentru instalarea unui astfel de cip pe ele.
O serie de alte companii au produs, de asemenea, diverse coprocesoare matematice incompatibile, interfațate cu acestea prin porturi I/O sau întreruperi BIOS , dar nu au fost la fel de utilizate pe scară largă.
Companiile de clonă au produs coprocesoare compatibile cu 80287 80387 , care au funcționat mai rapid decât cele similare Intel. Printre aceste companii pot fi menționate Cyrix , AMD , Chips & Technologies (C&T) . Uneori, setul de instrucțiuni al acestor coprocesoare a fost extins cu mai multe incompatibile, de exemplu, analogul 80287 de la C&T conținea instrucțiuni pentru lucrul cu un vector de patru valori în virgulă mobilă. Aceste comenzi extinse nu au primit sprijin serios de la producătorii de software.
Procesoarele EMC87 de la Cyrix ar putea funcționa atât în modul de compatibilitate software Intel 80387 , cât și în propriul mod de programare incompatibil. Pentru ei a fost asigurată compatibilitatea hardware cu soclu-ul coprocesorului 80387 .
În URSS, a fost produs un microcircuit (KM) 1810VM87 , care a fost un analog cu 8087 .
În mod similar, plăcile de bază pentru PC construite pe procesoare Motorola , înainte de dezvoltarea procesorului MC68040 (în care a fost încorporat coprocesorul) de către această companie, conțineau un coprocesor matematic. De regulă, un coprocesor 68881 16 MHz sau 68882 25 MHz a fost folosit ca FPU. Aproape fiecare procesor modern are un coprocesor încorporat.
Weitek a produs, de asemenea, coprocesoare matematice pentru platformele 68000 și MIPS .
Registrele FPU nu sunt organizate ca o matrice ca în alte arhitecturi, ci ca o stivă de registre . Astfel, FPU este un calculator stivă care funcționează pe principiul notației poloneze inverse [2] [3] . Aceasta înseamnă că instrucțiunile folosesc întotdeauna valoarea de sus a stivei pentru a efectua operațiuni, iar accesul la alte valori stocate este de obicei oferit ca urmare a manipulărilor pe stivă. Cu toate acestea, atunci când se lucrează cu partea superioară a stivei, pot fi utilizate în același timp și alte elemente ale stivei, pentru acces la care se folosește adresarea directă în raport cu vârful stivei. Operațiile pot folosi și valorile stocate în RAM. Secvența obișnuită de acțiuni este următoarea. Înainte de operație , argumentele sunt împinse în stiva LIFO ; când operația este efectuată, numărul necesar de argumente este eliminat din stivă. Rezultatul operației este plasat pe stivă, unde poate fi folosit în calcule ulterioare sau scos din stivă pentru a fi scris în memorie. În timp ce stivuirea de registre de către FPU este convenabilă pentru programatori, este dificil pentru compilatori să construiască cod eficient.
Toate procesoarele Intel și AMD , începând cu 486DX , au un coprocesor matematic încorporat și nu au nevoie de un coprocesor separat (cu excepția Intel486SX ). Cu toate acestea, termenul x87 este încă folosit pentru a evidenția partea din instrucțiunile procesorului care este folosită pentru a lucra cu numere reale pe stiva FPU. O caracteristică distinctivă a acestor instrucțiuni: mnemonicii lor încep cu litera f (din engleză float ). Compilatorii pot folosi aceste instrucțiuni pentru a produce cod care este, în unele cazuri, mai rapid decât codul care utilizează apeluri de bibliotecă pentru a efectua operații în virgulă mobilă.
Instrucțiunile x87 sunt compatibile cu IEEE-754 , adică oferă capacitatea de a efectua calcule în conformitate cu acest standard. Cu toate acestea, în mod obișnuit, secvența de instrucțiuni x87 nu funcționează strict conform formatelor IEEE-754 datorită utilizării unor registre mai largi decât formatele de numere cu precizie simplă și dublă . Prin urmare, secvența operațiilor aritmetice pe un set x87 poate da un rezultat ușor diferit față de un procesor care respectă strict standardul IEEE-754 .
După apariția 3DNow! de la AMD și apoi SSE , începând cu procesoarele Intel Pentium III , calculele cu precizie unică au devenit posibile fără ajutorul instrucțiunilor FPU și cu performanțe crescute. Extensia SSE2 și extensiile ulterioare ale setului de instrucțiuni au oferit, de asemenea, calcule rapide de dublă precizie (a se vedea standardul IEEE-754 ). În acest sens, în calculatoarele moderne, nevoia de instrucțiuni clasice de coprocesor matematic a scăzut semnificativ. Cu toate acestea, ele sunt încă acceptate pe toate procesoarele x86 lansate pentru compatibilitate cu aplicațiile mai vechi și pentru nevoile acelor aplicații care necesită conversii binare în zecimale sau calcule de precizie extinsă (când precizia dublă nu este suficientă). În prezent, utilizarea comenzilor x87 rămâne cea mai eficientă modalitate de a efectua astfel de calcule.
În interiorul FPU, numerele sunt stocate în format de virgulă mobilă de 80 de biți (precizie extinsă), în timp ce scrierea sau citirea din memorie poate fi utilizată:
FPU acceptă și valori numerice speciale:
Există trei grupuri de registre în FPU:
Sistemul include aproximativ 80 de comenzi. Clasificarea lor:
Tehnologii de procesoare digitale | |||||||||
---|---|---|---|---|---|---|---|---|---|
Arhitectură | |||||||||
Arhitectura set de instrucțiuni | |||||||||
cuvânt mașină | |||||||||
Paralelism |
| ||||||||
Implementări | |||||||||
Componente | |||||||||
Gestionare a energiei |