Grafiikkasuoritin

Grafiikkasuoritin (, GPU, tunnetaan myös nimillä grafiikkaprosessori ja grafiikkapiiri) on erikoistunut mikroprosessori, jonka tehtävänä on kiihdyttää ja suorittaa 2D- tai 3D-grafiikan renderöintiä, joka muuten jäisi keskussuorittimen laskettavaksi. Piiristä käytetään joskus myös (VPU) -nimitystä.
Grafiikkasuorittimia käytetään sulautetuissa järjestelmissä, matkapuhelimissa, henkilökohtaisissa tietokoneissa ja pelikonsoleissa. Nykyaikaiset grafiikkasuorittimet ovat hyvin tehokkaita tietokonegrafiikan manipuloinnissa ja niiden rinnakkaislaskentaan sopivasta rakenteesta johtuen ne ovat tehokkaampia useiden monimutkaisten algoritmien laskemisessa kuin yleiskäyttöiset suorittimet. 
Henkilökohtaisessa tietokoneessa grafiikkasuoritin on osana näytönohjainta joko erillisessä laajennuskortissa tai osana emolevyä yhdysrakenteisena eli integroituna. Yli 90 %:ssa uusista pöytätietokoneista ja kannettavista tietokoneista on integroitu grafiikkasuoritin, jonka suorituskyky on yleensä paljon huonompi kuin erillisellä laajennuskorttimuotoisella näytönohjaimella olevan grafiikkasuorittimen.
Historia.
Varhain 1970-luvulla grafiikkaprosessoriksi on kutsuttu muokattua PDP-11 -tietokonetta sen tehtävän mukaan.
Varhainen askel erikoistuneissa grafiikkapiireissä olivat 1970-luvun kolikkopelit, jolloin RAM-muistin korkea hinta ohjasi Atarin kehittämään piirtotoimintoja vähemmällä muistimäärällä.
Motorola 6847 -piiri pystyi piirtämään yksinkertaisia kuvia ja tekstiä synkronoituna mikroprosessorin kelloon ja muut valmistajat toivat vastaavia markkinoille: nämä olivat alkeellisia grafiikkaprosessoreita.
Vuonna 1982 NEC:in µPD7220 sisälsi muutamia piirto-toimintoja kaaria ja viivoja varten.
Vuonna 1984 Hitachin HD63484 ACRTC sisälsi 38 komentoa, joilla kuvapuskuriin pystyi piirtämään kuvioita. Vuonna 1984 Texas Instruments esitteli TMS4161 VRAMin, jossa DRAM:iin oli lisätty siirtorekisteri, ja vuonna 1986 ohjelmoitavan TMS34010 mikropiirin.
Vuonna 1985 julkaistiin Commodore Amiga, jonka piirisarja pystyi tekemään tiettyjä toimintoja grafiikkaan ja audioon riippumatta suorittimesta. Amigassa grafiikka oli keskeinen osa toimintaa eikä enää erillinen piiri.
Tammikuussa 1992 Silicon Graphics julkaisi valmistajariippumattoman OpenGL-ohjelmointirajapinnan, joka oli kehitystä yhtiön aiemmasta IRIS GL-rajapinnasta.
Varhaisia käyttökohteita olivat tietokoneavusteiseen suunnitteluun tarkoitetut ratkaisut. Kuvapuskurikortit (kiihdyttämättömät) olivat jonkin aikaa yleisiä.
Kolikkopelialustoilla erikoistuneet grafiikkapiirit kehittyivät 1990-luvun alkupuolella tukemaan 3D-grafiikkaa (esimerkiksi Sega Model 1 ja Sega Model 2).
Nykyinen termi (GPU) on peräisin vuodelta 1994, jolloin Sony julkaisi PlayStation-konsolin, joka käytti Toshiban valmistamaa mikropiiriä. Ammattilaiskäyttöön tarkoitetussa 3DLabsin Glint-piirisarjassa oli erillinen geometriayksikkö (GPU) ja vuodesta 2000 lähtien GPU:lla on viitattu usein geometrian käsittelyyn ja se esiintyy useissa patenteissa. Vuonna 1999 Nvidia julkaisi GeForce 256:n, jota se kutsui maailman ensimmäiseksi grafiikkaprosessoriksi.
Järjestelmäpiireissä grafiikkasuorittimen kanssa on integroituna video-koodekki ja digitaalinen signaaliprosessori.
Reaaliaikainen 3D-grafiikka oli aluksi vain ammattikäyttöön tarkoitettujen työasemien mahdollisuuksissa. Myöhemmin tekniikka tuli saataville myös kuluttajille. Tämän aikakauden sanotaan yleisesti alkaneen 3Dfx-yhtiön Voodoo 1:n tultua markkinoille vuonna 1996.
Ohjelmoitavat liukuhihnat grafiikkasuorittimissa ovat korvanneet kiinteätoimiset liukuhihnat ja viimeinen kiinteätoiminen oli luultavasti Nintendo Wiissä. Nykyisin shader-ohjelmat ovat pääasiallinen tapa ohjata grafiikkasuoritinta: osa toiminnoista on konfiguroitavia (ei ohjelmoitavia) suorituskykysyistä, mutta trendi on kohti ohjelmoitavuutta.
GPGPU-käyttö kehittyi tavasta hyödyntää grafiikkasuorittimen toimintoja omaksi laskentavaiheeksi, joka ei käytä grafiikkaliukuhihnan muita vaiheita. Apusuorittimen käyttö laskennassa on keksitty uudelleen useita kertoja 1960-luvulta lähtien.
Modernit grafiikkasuorittimet ovat suuria laitteita, joissa on useita liukulukuyksiköitä SIMD-arkkitehtuurissa, joka tekee niistä suurimpia integroituja rinnakkaisprosessointiin suunnattuja mikropiirejä. 
Yleistyminen.
Tietotekniikan historiassa on useita esimerkkejä epäonnistuneista erikoiskäyttöisistä laitteista. Grafiikkasuorittimien suosioon ja säilymiseen on vaikuttanut neljä syytä, joita ovat suorituskykyero, työkuorman riittävyys, markkinatarve ja yleisyys. 
Suorituskykyeroon vaikuttaa grafiikkasuorittimien rinnakkaisuus algoritmien suorituksessa: yleistä laskentaa on vaikea rinnakkaistaa, kun taas grafiikka-algoritmit on helposti osioitavissa rinnakkaisiin toisistaan riippumattomasti suoritettaviin tehtäviin. Grafiikkaliukuhihnan rinnakkaisuuden lisäksi eri vaiheet voidaan jakaa useille prosessoreille.
Grafiikkatyömäärä on valtava: videopelit renderöivät miljoonia kolmioita miljoonan tai kahden miljoonan pikselin kuviksi 60 kertaa sekunnissa. Interaktiivisen renderöinnin laatu vaatii tuhansia liukulukuoperaatioita pikseliä kohden ja vaatimus on nousussa.
Vahva markkinatarve teknisissä sovelluksissa kuten suunnittelussa ja lääketieteessä ylläpiti jatkuvaa markkinaa 1980- ja 1990-luvuilla, jolloin Apollo Computer ja Silicon Graphics kehittivät teknisen perustan nykyisille grafiikkasuorittimille.
Yleistyminen johti yhteensopivaan infrastruktuuriin ja kaksi grafiikkarajapintaa (OpenGL ja Direct3D) ovat saavuttaneet laajan hyväksynnän. Näillä rajapinnoilla sovelluskehittäjät voivat kohdella eri valmistajien eri aikoina valmistamia grafiikkasuorittimia samanvertaisena paitsi suorituskyvyltä.
Tekniikkaa.
Grafiikkaprosessoreilla on omat rekisterinsä sekä omaa välimuistia. Grafiikkaprosessorien muistimalli poikkeaa tietokoneen suorittimen käyttämästä ja on huomattavasti rajatumpi käsittelytavassa. Grafiikkaprosessorien välimuistit ovat tavallisesti epäyhtenäisiä tarvittavan piirin pinta-alan sekä suorituskyvyn vuoksi.
Moderneissa grafiikkaprosessoreissa on useita suoritusyksiköitä ja ratkaisut perustuvat SIMD-arkkitehtuuriin. Tehtävät jaetaan laitteistotason säikeille, joiden suoritus etenee yhtä aikaa. Grafiikkaprosessoreissa ei ole tukea epäjärjestyksessä suorittamiselle () eikä haarautumisen ennakoinnille: säästetty tila käytetään suurelle määrälle suoritinyksiköitä ja rekistereitä.
Grafiikkaprosessoreissa tietyt toiminnot ovat hitaita verrattuna yleiskäyttöiseen suorittimeen, mutta monet muut asiat ovat huomattavan nopeita. Hitaita asioita ovat muun muassa pinon käsittely, osoittimet ja haarautumiset. Ohjelmointiin käytettävät keinot (GLSL ja HLSL-kielet) pyrkivät estämään hitaiden ohjelmien tekemisen, jolloin myös hitaiden ominaisuuksien käyttö on rajoitettua.
Muistin varaaminen ja vapauttaminen tapahtuu vain ennen ja jälkeen suoritusta. "Globaali" muistialue on laskennan aikana vain luettavaa ("read-only") ja laskennan jälkeen vain kirjoitettavaa ("write-only") ennalta laskettuun osoitteeseen.
Grafiikkaprosessorin suoritus etenee säieryhmissä, joita kutsutaan aaltorintamiksi (), joilla pyritään maksimoimaan rinnakkainsuoritus ja minimoimaan muistiviiveet. Grafiikkaprosesoreiden suoritusmallin vuoksi vuonohjauksen eroaminen aiheuttaa huomattavia suorituskykyongelmia. Käskyvälimuisti grafiikkaprosessorilla on myös pieni ja perinteisempi "megaydin" () ratkaisu on ongelmallinen verrattuna aaltorintamaan. Megaytimen suoritusta voi parantaa, mutta tehtävän pilkkominen aaltorintamiksi sisältää merkittäviä etuja.
Käyttökohteet.
Näytönohjaimet.
Grafiikkasuorittimeen on samalle mikropiirille integroitu useita näytönohjaimen toimintoja, jotka ovat aiemmin olleet erilaisten apupiirien tehtävänä. Grafiikkasuorittimessa on nykyään usein muun muassa pakatun videokuvan purkaminen, joka on käytössä videokuvaa katsottaessa, sekä 3D-grafiikan renderöinti.
Stream-prosessointi ja GPGPU-tekniikat.
Grafiikkasuorittimien suuri laskentakyky ja laskentakyvyn suhteellisen helppo hyödyntäminen SPMD-ohjelmointimallin avulla on motivoinut käyttämään grafiikkasuorittimia ohjelmien nopeuttamiseen. GPGPU:ksi kutsuttu käyttötapa ei-graafisiin tarkoituksiin tuli merkittäväksi trendiksi 1990-luvun lopulla.
Tutkijat löysivät useita kohteita data-rinnakkaisille algoritmeille. Grafiikkasuorittimien käyttö on tullut myös supertietokoneisiin ja suurteholaskentaan.
Valmistajilta on tullut markkinoille pelkästään laskentaan suunnattuja kortteja, joissa olevia grafiikkasuorittimia käytetään esimerkiksi syväoppimiseen ja numeeriseen virtausdynamiikkaan.
Vuonna 2010 nopein supertietokone Nebulae käytti Nvidia Tesla C2050 -grafiikkasuorittimia.
Ohjelmointiin käytetään usein kahta vaihtoehtoa: CUDA, joka on vain Nvidian grafiikkaprosessoreille; sekä OpenCL, joka on riippumaton valmistajasta ja tukee heterogeenisiä ympäristöjä.
HIP ("Heterogeneous-Computing Interface for Portability") on työkalu lähdekoodin muunnokseen, jolloin sama koodi voidaan kääntää AMD:n (HCC-kääntäjällä) ja Nvidian (NVCC-kääntäjällä CUDA:lle) laitteistolle.