Grafiikkasuoritin

Wikipediasta
(Ohjattu sivulta Grafiikkapiiri)
Siirry navigaatioon Siirry hakuun
GeForce 6600GT (NV43) -näytönohjaimen grafiikkasuoritin.

Grafiikkasuoritin (engl. graphics processing unit, 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 engl. visual processing unit (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.[1]

Varhain 1970-luvulla grafiikkaprosessoriksi on kutsuttu muokattua PDP-11 -tietokonetta sen tehtävän mukaan.[2]

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ä.[3] 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.[4]

Vuonna 1982 NEC:in µPD7220 sisälsi muutamia piirto-toimintoja kaaria ja viivoja varten.[5] Vuonna 1984 Hitachin HD63484 ACRTC sisälsi 38 komentoa, joilla kuvapuskuriin pystyi piirtämään kuvioita.[6] Vuonna 1984 Texas Instruments esitteli TMS4161 VRAMin, jossa DRAM:iin oli lisätty siirtorekisteri, ja vuonna 1986 ohjelmoitavan TMS34010 mikropiirin.[7] Vuonna 1985 julkaistiin Commodore Amiga, jonka piirisarja pystyi tekemään tiettyjä toimintoja grafiikkaan ja audioon riippumatta suorittimesta.[8] Amigassa grafiikka oli keskeinen osa toimintaa eikä enää erillinen piiri.[4]

Tammikuussa 1992 Silicon Graphics julkaisi valmistajariippumattoman OpenGL-ohjelmointirajapinnan, joka oli kehitystä yhtiön aiemmasta IRIS GL-rajapinnasta.[8] 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ä.[9] 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.[9] Vuonna 1999 Nvidia julkaisi GeForce 256:n, jota se kutsui maailman ensimmäiseksi grafiikkaprosessoriksi.[10] Järjestelmäpiireissä grafiikkasuorittimen kanssa on integroituna video-koodekki ja digitaalinen signaaliprosessori.[9]

Reaaliaikainen 3D-grafiikka oli aluksi vain ammattikäyttöön tarkoitettujen työasemien mahdollisuuksissa.[11] Myöhemmin tekniikka tuli saataville myös kuluttajille.[11] Tämän aikakauden sanotaan yleisesti alkaneen 3Dfx-yhtiön Voodoo 1:n tultua markkinoille vuonna 1996.[11] Ohjelmoitavat liukuhihnat grafiikkasuorittimissa ovat korvanneet kiinteätoimiset liukuhihnat ja viimeinen kiinteätoiminen oli luultavasti Nintendo Wiissä.[12] Nykyisin shader-ohjelmat ovat pääasiallinen tapa ohjata grafiikkasuoritinta: osa toiminnoista on konfiguroitavia (ei ohjelmoitavia) suorituskykysyistä, mutta trendi on kohti ohjelmoitavuutta.[12]

GPGPU-käyttö kehittyi tavasta hyödyntää grafiikkasuorittimen toimintoja omaksi laskentavaiheeksi, joka ei käytä grafiikkaliukuhihnan muita vaiheita.[13] Apusuorittimen käyttö laskennassa on keksitty uudelleen useita kertoja 1960-luvulta lähtien.[13]

Modernit grafiikkasuorittimet ovat suuria laitteita, joissa on useita liukulukuyksiköitä SIMD-arkkitehtuurissa, joka tekee niistä suurimpia integroituja rinnakkaisprosessointiin suunnattuja mikropiirejä.[9]

Yksinkertaistettu lohkokaavio grafiikkasuorittimen eri osista. Suorittimen arkkitehtuuri viittaa kaikkiin komponentteihin kokonaisuutena. Moderneissa grafiikkasuorittimissa kaikki osat ovat integroituna yhdelle piirille kun aiemmin näytönohjaimet sisälsivät useita erillisiä mikropiirejä eri toiminnoille.
  • BIF: väyläohjain (PCI, AGP, PCIe..)
  • PMU: virranhallintayksikkö
  • VPU: videokuvankäsittely kuten MPEG-purku
  • DIF: näyttötoiminnot (RAMDAC, DVI, HDMI ym. tuki)
  • GMC: grafiikkamuistiohjain (GDDR, HBM ym. tuki)
  • GCA: grafiikka- ja laskentayksikkö (3D-piiri), varsinainen suoritinosa
  • VGABIOS: näytön alustustoiminnot

Tietotekniikan historiassa on useita esimerkkejä epäonnistuneista erikoiskäyttöisistä laitteista.[14] Grafiikkasuorittimien suosioon ja säilymiseen on vaikuttanut neljä syytä, joita ovat suorituskykyero, työkuorman riittävyys, markkinatarve ja yleisyys.[14]

Suorituskykyeroon vaikuttaa grafiikkasuorittimien rinnakkaisuus algoritmien suorituksessa: yleistä laskentaa on vaikea rinnakkaistaa, kun taas grafiikka-algoritmit on helposti osioitavissa rinnakkaisiin toisistaan riippumattomasti suoritettaviin tehtäviin.[14] Grafiikkaliukuhihnan rinnakkaisuuden lisäksi eri vaiheet voidaan jakaa useille prosessoreille.[14]

Grafiikkatyömäärä on valtava: videopelit renderöivät miljoonia kolmioita miljoonan tai kahden miljoonan pikselin kuviksi 60 kertaa sekunnissa.[14] Interaktiivisen renderöinnin laatu vaatii tuhansia liukulukuoperaatioita pikseliä kohden ja vaatimus on nousussa.[14]

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.[14]

Yleistyminen johti yhteensopivaan infrastruktuuriin ja kaksi grafiikkarajapintaa (OpenGL ja Direct3D) ovat saavuttaneet laajan hyväksynnän.[14] Näillä rajapinnoilla sovelluskehittäjät voivat kohdella eri valmistajien eri aikoina valmistamia grafiikkasuorittimia samanvertaisena paitsi suorituskyvyltä.[14]

Grafiikkaprosessoreilla on omat rekisterinsä sekä omaa välimuistia.[15] Grafiikkaprosessorien muistimalli poikkeaa tietokoneen suorittimen käyttämästä ja on huomattavasti rajatumpi käsittelytavassa.[16] Grafiikkaprosessorien välimuistit ovat tavallisesti epäyhtenäisiä tarvittavan piirin pinta-alan sekä suorituskyvyn vuoksi.[17][15]

Moderneissa grafiikkaprosessoreissa on useita suoritusyksiköitä ja ratkaisut perustuvat SIMD-arkkitehtuuriin.[15] Tehtävät jaetaan laitteistotason säikeille, joiden suoritus etenee yhtä aikaa.[15] Grafiikkaprosessoreissa ei ole tukea epäjärjestyksessä suorittamiselle (engl. out-of-order execution) eikä haarautumisen ennakoinnille: säästetty tila käytetään suurelle määrälle suoritinyksiköitä ja rekistereitä.[18]

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.[18] 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.[18] Muistin varaaminen ja vapauttaminen tapahtuu vain ennen ja jälkeen suoritusta.[16] "Globaali" muistialue on laskennan aikana vain luettavaa (read-only) ja laskennan jälkeen vain kirjoitettavaa (write-only) ennalta laskettuun osoitteeseen.[16]

Grafiikkaprosessorin suoritus etenee säieryhmissä, joita kutsutaan aaltorintamiksi (engl. wavefront), joilla pyritään maksimoimaan rinnakkainsuoritus ja minimoimaan muistiviiveet.[19] Grafiikkaprosesoreiden suoritusmallin vuoksi vuonohjauksen eroaminen aiheuttaa huomattavia suorituskykyongelmia. Käskyvälimuisti grafiikkaprosessorilla on myös pieni ja perinteisempi megaydin (engl. megakernel) ratkaisu on ongelmallinen verrattuna aaltorintamaan.[20] Megaytimen suoritusta voi parantaa, mutta tehtävän pilkkominen aaltorintamiksi sisältää merkittäviä etuja.[21]

Käyttökohteet

[muokkaa | muokkaa wikitekstiä]

Näytönohjaimet

[muokkaa | muokkaa wikitekstiä]
Pääartikkeli: Näytönohjain

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

[muokkaa | muokkaa wikitekstiä]
Pääartikkelit: Stream processing ja GPGPU

Grafiikkasuorittimien suuri laskentakyky ja laskentakyvyn suhteellisen helppo hyödyntäminen SPMD-ohjelmointimallin avulla on motivoinut käyttämään grafiikkasuorittimia ohjelmien nopeuttamiseen.[13] GPGPU:ksi kutsuttu käyttötapa ei-graafisiin tarkoituksiin tuli merkittäväksi trendiksi 1990-luvun lopulla.[13] Tutkijat löysivät useita kohteita data-rinnakkaisille algoritmeille.[13] Grafiikkasuorittimien käyttö on tullut myös supertietokoneisiin ja suurteholaskentaan.[13][22]

Valmistajilta on tullut markkinoille pelkästään laskentaan suunnattuja kortteja, joissa olevia grafiikkasuorittimia käytetään esimerkiksi syväoppimiseen ja numeeriseen virtausdynamiikkaan.[23][24]

Vuonna 2010 nopein supertietokone Nebulae käytti Nvidia Tesla C2050 -grafiikkasuorittimia.[25]

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ä.[26] 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.[27][28]

  1. Atkin Denny: Computer Shopper: The Right GPU for You Computer Shopper. Arkistoitu 22.7.2012. Viitattu 9.10.2010. (englanniksi)
  2. E. T. Barron & R. M. Glorioso: A micro controlled peripheral processor dl.acm.org. syyskuu 1973. doi:10.1145/800203.806247 Viitattu 13.1.2021. (englanniksi)
  3. Hague, James: Why Do Dedicated Game Consoles Exist? prog21.dadgum.com. September 10, 2013. Arkistoitu May 4, 2015. Viitattu November 11, 2015.
  4. a b Jim Belcher: The evolution of computer displays arstechnica.com. 24.1.2011. Viitattu 15.4.2022. (englanniksi)
  5. Jon Peddie: Famous Graphics Chips: NEC µPD7220 Graphics Display Controller computer.org. Viitattu 13.1.2021. (englanniksi)
  6. Jon Peddie: GPU History: Hitachi ARTC HD63484. The second graphics processor. computer.org. Viitattu 13.1.2021. (englanniksi)
  7. Jon Peddie: Famous Graphics Chips: TI TMS34010 and VRAM. The first programmable graphics processor chip computer.org. Viitattu 13.1.2021. (englanniksi)
  8. a b Graham Singer: The History of the Modern Graphics Processor 7.1.2021. Techspot. Arkistoitu Viitattu 15.1.2021. (englanniksi)
  9. a b c d Jon Peddie: Is it Time to Rename the GPU? computer.org. Viitattu 13.1.2021. (englanniksi) 
  10. NVIDIA Launches the World's First Graphics Processing Unit: GeForce 256 nvidia.com. 31.8.1999. Arkistoitu Viitattu 13.1.2021. (englanniksi)
  11. a b c Akenine-Möller, Tomas & Haines, Eric & Hoffman, Naty: Real-Time Rendering, s. 1. (Third Edition) CRC Press, 2008. ISBN 978-1-56881-424-7 (englanniksi)
  12. a b Akenine-Möller, Tomas & Haines, Eric & Hoffman, Naty: Real-Time Rendering, s. 26,29. (Third Edition) CRC Press, 2008. ISBN 978-1-56881-424-7 (englanniksi) 
  13. a b c d e f Akeley, Feiner, Foley, Hughes, Van Dam, McGuire, Sklar: Computer Graphics Principles and Practice, s. 18,1142. (Third Edition) Addison-Wesley, 2014. ISBN 978-0-321-39952-6 (englanniksi)
  14. a b c d e f g h i Akeley, Feiner, Foley, Hughes, Van Dam, McGuire, Sklar: Computer Graphics Principles and Practice, s. 1103-1104. (Third Edition) Addison-Wesley, 2014. ISBN 978-0-321-39952-6 (englanniksi)
  15. a b c d GPU Architectures (PDF) ec.europa.eu. Viitattu 6.12.2021. (englanniksi)
  16. a b c Aaron Lefohn: GPU Memory Model Overview (PDF) seas.upenn.edu. Arkistoitu 12.4.2022. Viitattu 6.12.2021. (englanniksi)
  17. Understanding GPU caches rastergrid.com. Viitattu 27.11.2021. (englanniksi)
  18. a b c GPU Architecture (PDF) cs.williams.edu. Viitattu 6.12.2021. (englanniksi)
  19. François Guthmann: Occupancy explained gpuopen.com. Viitattu 27.8.2024. (englanniksi)
  20. Samuli Laine & Tero Karras & Timo Aila: Megakernels Considered Harmful: Wavefront Path Tracing on GPUs (PDF) research.nvidia.com. Viitattu 27.8.2024. (englanniksi)
  21. Matt Pharr & Wenzel Jakob & Greg Humphreys: 15.1.2 Structuring Rendering Computation pbr-book.org. Viitattu 27.8.2024. (englanniksi)
  22. Exploring the GPU Architecture core.vmware.com. Viitattu 18.10.2022. (englanniksi)
  23. Ryan Smith: AMD Announces Radeon Instinct: GPU Accelerators for Deep Learning, Coming In 2017 anandtech.com. 12.12.2016. Viitattu 20.10.2020. (englanniksi)
  24. AMD unveils its MI100 GPU, said to be its most powerful silicon for supercomputers, high-end AI processing theregister.com. 16.11.2020. Viitattu 17.11.2020. (englanniksi) 
  25. https://www.cioinsight.com/c/a/Technology/The-Nebulae-Worlds-Fastest-Supercomputer
  26. Wolfram Schenck: OpenCL Basics (PDF) fz-juelich.de. Arkistoitu 7.12.2021. Viitattu 7.12.2021. (englanniksi)
  27. HIP Programming Guide v4.5 rocmdocs.amd.com. Arkistoitu 13.2.2022. Viitattu 18.10.2022. (englanniksi)
  28. George S. Markomanolis: Utilizing AMD GPUs: Tuning, programming models, and roadmap (PDF) fosdem.org. 6.2.2022. Viitattu 13.2.2022. (englanniksi)