Matematiikkasuoritin

suorittimen rinnalla toimiva erikoisyksikkö

Matematiikkasuoritin (engl. Floating Point Unit, FPU) on tavallisen suorittimen CPU:n rinnalla toimiva yksikkö, jonka tehtävänä on laskea liukulukulaskutoimituksia. Matematiikkasuorittimet otettiin käyttöön, kun liukulukulaskutoimitusten suorittamisen tarve yleistyi. Mikroprosessorin tyypillisesti kokonaisluvuilla ja loogisilla operaatioilla operoivalla ALU-yksiköllä liukulukulaskenta oli liian hidasta.

Intel 80386DX-suoritin ja erillinen 80387DX matematiikkasuoritin.

Moderni moniydinsuoritin sisältää useita matematiikkasuoritinyksiköitä.[1]

Historia

muokkaa

Ennen liukulukuja ohjelmistot laskivat kiinteällä tarkkuudella tai skaalautumiskertoimella, joissa ongelmana oli valinta tarkkuuden ja arvoalueen välillä.[2] Lisäksi laskutoimituksien hitaus oli ongelma.[2]

Varhaiset suurtietokoneet kuten IBM 704 ja DECin PDP-6 toteuttivat liukulukulaskennan.[3][4]

Kuitenkin henkilökohtaisissa- ja kotitietokoneissa matematiikkasuorittimet olivat aluksi erillisiä, varsinaisen suorittimen ulkopuolisia mikropiirejä ja valinnaisia. Myöhemmin matematiikkasuoritinten kustannukset laskivat niin paljon, että matematiikkasuoritin integroitiin samalle piisirulle ALU-yksikön rinnalle, jolloin erillisestä komponentista voitiin luopua.

Jos tietokoneessa ei ole matematiikkasuoritinta (joko integroituna tai apusuorittimena), liukulukulaskutoimitukset joudutaan suorittamaan mikroprosessorin ALU-yksiköllä.[2] Tämä on hitaampaa, sillä laskenta tapahtuu kokonaislukuina. Tyypillinen tapa laskea trigonometrisiä tai hyperbolisia funktioita tai neliöjuurta ovat CORDIC- tai Jack E. Volderin algorithmit,[5][6] jotka hän kehitti 1950-luvulla Convairilla B-58-pommikoneen navigointiajärjestelmää varten.

Intel i486 oli ensimmäinen Intelin suorittimesta, jossa matematiikkasuoritin lisättiin suorittimen kanssa samalle piisirulle. Siitä oli olemassa myös halvempi i486SX versio ilman tätä toiminnallisuutta.

Motorola 68040 -suorittimesta oli samaan aikaan myös halvempi 68LC040 versio, jossa ei ollut mukana matematiikkasuoritinta.

Sulautetut järjestelmät vielä usein käyttävät suorittimia, joissa ei ole matematiikkasuoritinta.

Tekniikka

muokkaa

Matematiikkasuorittimet laskevat liukuluvuilla. Liukuluvut ovat käytetty reaalilukujen likimääräinen esitysmuoto tietokoneella. Ne on toteutettu formaatilla, jossa mantissa esittää luvun tarkkuuttaa ja eksponentti sen suuruusluokan. Liukuluvulle varataan tietty määrä bittejä, jotka määrittävät sen tarkkuuden ja suurimman tallennettavan luvun.

Suorittimissa käytetään yleisesti IEEE-754 standardin mukaisia dataformaattia, mutta muitakin muotoja on kehitetty ja ohjelmallisesti (ilman laitteistotukea) voidaan käyttää muitakin muotoja eri tarkoituksiin.[7]

Suorittimet tukevat normaalisti mallista riippuen yksinkertaisen, kaksinkertaisen tai laajennetun tarkkuuden liukulukuja (single, double, single-extended ja double-extended).[8] Liukuluvulle usein varataan yksi tai kaksi 32-bittistä sanaa, jolloin ne ovat 32- tai 64-bittiä, tai voidaan käyttää laajennettua 80-bittistä muotoa, jolloin varataan kolme 32-bittistä sanaa (96-bittiä).[8][9] Matematiikkasuoritin voi toimia sisäisesti 80-bittisesti, joka tukee yksinkertaista ja kaksinkertaista tarkkuutta.[10][9][11] Matematiikkasuorittimet voivat tukea myös muita tietotyyppejä, esimerkiksi eri kokoisia kokonaislukuja ja BCD-koodattuja lukuja.[9] Operandit voidaan muuttaa sisäisesti käytettyyn laajennetun tarkkuuden muotoon (80-bittinen) ennen käyttämistä laskennassa tai sijoittamista rekisteriin.[11]

128-bittiselle IEEE-standardin mukaiselle liukulukuformaatille on määritelty tuki eräiden prosessoriarkkitehtuurien käskykannoissa (SPARC V8[12] ja V9[13] , PowerPC64[14]).

Eräät ohjelmointikielen kääntäjät ja ajonaikaiset kirjastot eivät tue laajennettuja tarkkuuksia vaikka kohdelaitteistossa tuki olisi.[15][16]

Grafiikkasuorittimet tukevat usein myös pienempää 16-bittistä half-precision formaattia, jolla säästetään muistikapasiteettia. Myös tietyt dataformaatit kuten ILM:n OpenEXR tukevat half-precision formaattia.

Matematiikkasuorittimella on tyypillisesti omat rekisterit ja oma käskykanta.[9][17][18][19] Rekisterit ovat erilliset myös kun matematiikkasuoritin on integroitu pääsuorittimen kanssa samalle piirille.[11] Esimerkkejä matematiikkasuorittimen peruskäskyistä ovat yhteen- ja vähennyslasku, kerto- ja jakolasku, sekä neliöjuuri ja muunnokset eri tarkkuuksiin.[18] Myös logaritmien ja trigonometristen funktioiden laskemiseen voi olla useita käskyjä.[9]

Epälukujen (NaN, "Not-a-Number") ja pyöristysten käsittely on keskeinen osa liukulukujen käsittelyä. Epälukuja on kahta tyyppiä: SNaN (Signaling NAN) ja QNaN (Quiet NAN). SNaN nostaa poikkeuksen kun taas QNaN sallitaan ilman poikkeusta.[19][20][9] IEEE:n standardin mukaan on neljä pyöristysmoodia: lähimpään, katkaisu (kohti nollaa), alaspäin (kohti negatiivista ääretöntä) ja ylöspäin (kohti positiivista ääretöntä).[21][22][8] Oletuksena pyöristys tehdään lähimpään.[8] Ulkoisena apusuorittimena käytettäessä pääsuoritin voi tukea toimintaa siten, että molemmat näkyvät ohjelmoijalle yhtenä suorittimena.[9]

Matematiikkasuorittimia

muokkaa

Seuraavia matematiikkasuorittimia on käytetty ennen vastaavan yksikön integraatiota CPU:n piirille:

Katso myös

muokkaa

Lähteet

muokkaa
  1. AMD Shifting to One Floating Point Unit Per Core Design with Upcoming Zen Processors – Dropping Shared Core Approach of Excavator wccftech.com. Viitattu 8.1.2017.
  2. a b c 3-arithmetic (PDF) people.ee.duke.edu. Viitattu 22.2.2023. (englanniksi)
  3. https://www.ibm.com/ibm/history/exhibits/mainframe/mainframe_PP704.html
  4. http://bitsavers.org/pdf/dec/pdp6/F-65_PDP-6_Handbook_Aug64.pdf
  5. https://www.controlpaths.com/2022/04/25/exploring-the-cordic-algorithm/
  6. https://dspguru.com/dsp/faqs/cordic/
  7. Michael F. Cowlishaw: Decimal Floating-Point: Algorism for Computers (PDF) speleotrove.com. Viitattu 24.2.2023. (englanniksi)
  8. a b c d David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic maaliskuu 1991. Arkistoitu Viitattu 24.2.2023. (englanniksi)
  9. a b c d e f g Technical Summary HCMOS Enhanced Floating-Point Coprocessor (PDF) datasheets.chipdb.org. Viitattu 22.2.2023. (englanniksi)
  10. Daniel Etiemble: Coprocessors: Failures and successes (PDF) arxiv.org. 25.7.2019. Viitattu 22.2.2023. (englanniksi)
  11. a b c Motorola M68000 Family, Programmer’s Reference Manual (PDF) nxp.com. Arkistoitu 27.3.2023. Viitattu 23.2.2023. (englanniksi)
  12. The SPARC Architecture Manual: Version 8. SPARC International, Inc, 1992. Teoksen verkkoversio (viitattu 24.9.2011).
  13. The SPARC Architecture Manual: Version 9. SPARC International, Inc, 1994. Teoksen verkkoversio (viitattu 24.9.2011).
  14. GCC 6 Release Series gcc.gnu.org. Viitattu 8.1.2017.
  15. Long Double learn.microsoft.com. 20.9.2016. Viitattu 24.2.2023. (englanniksi)
  16. Building with 128-bit floating-point (long double) support for AArch64 state developer.arm.com. Viitattu 24.2.2023. (englanniksi)
  17. FPU views of the register bank developer.arm.com. Viitattu 22.2.2023. (englanniksi)
  18. a b FPU instruction set developer.arm.com. Viitattu 22.2.2023. (englanniksi)
  19. a b Floating-Point Unit (PDF) johnloomis.org. Viitattu 22.2.2023. (englanniksi)
  20. IEEE 754 standard implementation choices developer.arm.com. Viitattu 22.2.2023. (englanniksi)
  21. IEEE 754 arithmetic and rounding developer.arm.com. Viitattu 25.4.2023. (englanniksi)
  22. Floating Point Rounding Modes (PDF) inst.eecs.berkeley.edu. 2012. Viitattu 25.2.2023. (englanniksi)
  23. B.1 Floating-Point Hardware
  24. FAQABOSS: Frequently Asked Questions About Buying an Old (Used) Sun System

Aiheesta muualla

muokkaa