Graafikaprotsessor

**Graafikaprotsessor** või **GPU** (inglise keeles *graphics processing unit*, tuntud ka kui **VPU** ehk *visual processing unit* ehk **visuaalprotsessor**) on 3D- ja 2D-graafika visualiseerimiseks ja kiirendamiseks kohandatud mikroprotsessor. 

GPU-sid kasutatakse tänapäeval manussüsteemides, mobiiltelefonides, personaalarvutites, tööjaamades ja mängukonsoolides. Tänapäevased GPU-d suudavad tõhusalt manipuleerida arvutigraafikaga – nende rööpstruktuurne ehitus võimaldab keerulisi algoritme käsitledes üldprotsessorist (CPU) palju suuremat efektiivsust. Personaalarvutis võib GPU asuda videokaardil või olla integreeritud emaplaadile. Teiste seadmete puhul on GPU peamiselt integreeritud emaplaadile. Tänapäeval omavad üle 90% süle- ja lauaarvutitest graafikalahendusi integreeritud GPU kujul, mis on aga kehvema jõudlusega kui sihtotstarbelised videokaardid.

## Ajalugu

GPU mõiste võeti kasutusele 1999. aastal, mil suurtootja Nvidia andis välja GeForce 256 kui "maailma esimese graafikaprotsessori". Sellesse monokiipi oli integreeritud transformatsiooni, valguse, kolmnurga tekitamise/kärpimise ja visualiseerimise mootorid, mis olid võimelised minimaalselt tekitama 10 miljonit polügooni ehk hulknurka sekundis. Nvidia rivaal ATI Technologies kasutas aga 2002. aastal mõistet VPU ehk visuaalprotsessor, lastes välja **Radeon 9700**. Nende esimene graafikaprotsessor, mis lasti välja 2000. aastal, kandis nime R100. Oli olemas ka firma Intel, see aga ei tootnud täiesti iseseisvaid graafikaprotsessoreid.

### 1980.–1990. aastad
Tänapäevased GPU-d pärinevad monoliitsetest (muutmatud, ühtsed) 1980–1990. aastate graafikakiipidest. Neil kiipidel oli limiteeritud BitBLT (arvutigraafika operatsioon, kus mitmed bittrastrid kombineeritakse ühte, kasutades rastri operaatorit) tugi (kui üldse BitBLT tugi oli) ja tavaliselt puudus neil kujundi kujutamise/joonistamise tugi. Mõned GPU-d suutsid käitada mitmeid operatsioone/käske käsurealt ja kasutada DMA-d (*Direct Memory Access*), et vähendada üldprotsessori koormust. Varasematest aegadest saab tuua näiteks ANTIC (*Alphanumeric Television Interface Controller*) videokiipi, mida kasutati kaasprotsessorina Atari 800-s ja Atari 5200-s.

1980. aastate lõpul ja 1990. aastate algul said populaarseks kiired, üldotstarbeprotsessorid, mis hakkasid asendama kallemaid GPU-sid. Mitmed kallimad personaalarvutite ja tööjaamade graafikakaardid kasutasid joonistamisfunktsioonide kiireks sooritamiseks Texas Instrumentsi TMS340 seeriat (32-bitine CPU videomälu koos graafikarakenduste jaoks optimeeritud kontrolleriga), need olid eriti populaarsed CAD-tarkvara kasutajate seas.

Ka mõned Apple'i laserprinterid said PostScripti (lehekülje kirjeldamise keel dokumentide printimiseks laserprinterile) rasterkuva protsessori (eriline GPU), mis kasutas Motorola 68000 seeria CPU-d või kiiremat RISC CPU (kärbikprotessor – riistvara on lihtsustatud kompilaatorite täiustamise arvel), nagu AMD 29000 või Intel i960.

Mõned väga spetsialiseeritud rakendused kasutasid digitaalse signaali protsessoreid (DSP-sid) 3D toe jaoks, näiteks Atari mängud "Hard Drivin" ja "Race Drivin".

Kiibitehnoloogia täiustumisel oli lõpuks võimalik viia joonistamise ja BitBLT funktsioonid ühele ja samale plaadile (ja hiljem ka ühele samale kiibile). Need vähendatud "2D-kiirendid" ei olnud nii paindlikud kui mikroprotsessoril põhinevad GPU-d, aga olid palju lihtsamad valmistada ja müüa.

### 1980. aastad

Commodore Amiga oli esimene video riistvaras *[[blitter]]*'it sisaldav massturuarvuti ja IBM-i 8514 graafikasüsteem oli üks esimestest riistvarasiseselt 2D-elementaartoiminguid teostavaid PC videokaartidest.

Amiga oli unikaalne, kuna ta sisaldas seda, mis nüüd tõlgendataks kui täielikku graafikakiirendit. Üldprotsessorilt suudeti maha laadida praktiliselt kõik videotoimingutega seotud funktsioonid nagu joone joonistamine, ala täitmine, pildiploki teisaldamine. Lisaks oli graafika kaasprotsessoril olemas talle kirjutatud juhiste kogum (kuigi algeline). Varem (ja päris palju aega hiljem muudel arvutitel) pidi üldprotsessor ise kogu joonistamise kujutamisega ekraanile ise toime tulema.

### 1990. aastad

1990. aastate alguses tekkis Microsoft Windowsil huvi kiire, kõrgresolutsiooniga 2D-rastergraafika vastu, mis enne oli olnud Unixi tööjaamade ja Apple Macintoshi pärusmaa. Kuna Windows juhtis PC turgu, tähendas see seda, et graafikaga tegelevad tarnijad said nüüd keskenduda rohkem ühele platvormile ja ühele programmeerimisliidesele – GDI (*Graphics Device Interface*).

1990. vältel arenesid 2D graafilise kasutajaliidese kiirendid veelgi – tootmistehnoloogiate arenemisel arenes ka graafikakiipide integreerimine. Videokiirendid said populaarseks standardite nagu VCD ja DVD tulekuga, samuti oli suureks mõjutuseks Interneti populaarsuse kasv ja vajadus parema jõudluse järele. Kaartidele tulid rakendusliidesed ehk API-d (*Application Programming Interface*) mitmesugusteks toiminguteks, nendeks olid näiteks Microsofti WinG graafikateek Windows 3.x jaoks, hiljem aga DirectDraw' liides riistvara kiirendamiseks 2D-mängudes Windows 95-l ja hiljematel versioonidel.

1990. aastate algul ja keskel muutus CPU toel 3D-graafika kiirendamine üha populaarsemaks nii arvuti- kui ka konsoolimängudes, mistõttu suurenes üha rohkem ja rohkem vajadus 3D-graafika kiirendamisele. Varajased näited massturustatud 3D-graafika riistvara kasutavatest seadetest on viienda generatsiooni videomängu konsoolid Playstation ja Nintendo 64. PC-maailmas oli esimesteks märkimisväärselt läbikukkunud odavahinnalised 3D-graafikakiibid nagu S3, ViRGE, ATI Rage ja Matrox Mystique. Need kiibid olid põhiliselt eelmise generatsiooni 2D-kiirendid, millele oli lisatud 3D iseärasused. Paljud olid isegi pistmikühilduvad varasemate generatsiooni kiipidega, et vähendada tootmiskulusid ja kergendada kiipide ehitamist. Esialgu oli 3D-graafika tugi ainult võimalik tänu eraldi lisatud kaartidele, mis olid mõeldud 3D-graafika kiirendamiseks (samas puudus neil 2D GUI kiirendamine täielikult). Selline kaart oli näiteks 3dfx Voodoo. Siiski, tootmistehnoloogiate jätkuval arenemisel suudeti video, 2D GUI kiirendamine ja 3D-funktsioonid integreerida ühele kiibile. Renditioni Verite kiibistikud oli esimesed, mis olid piisavalt korralikud ja head, et neid ära märkida.
 
DirectX arenes tasaselt algelisest (või õigemini tüütavast) API mängu programmeerimisliidesest üheks juhtivateks 3D-graafika programmeerimise liideseks. 3D-graafika kiirendeid täiustati aasta-aastalt ja need paranesid eksponentsiaalselt. Direct3D 5.0 oli esimene versioon erinevatest tärkavatest API-dest, mis tõeliselt domineeris mänguturgu ja surus välja paljud teiste firmade liidesed. Direct3D 7.0 tutvustas riistvara kiirendatud transformeerimise ja valgustuse (T&L – *transform and lighting*) tuge. Nvidia Geforce 256 (tuntud ka kui NV10) oli esimene kaart turul, millele oli selline tugi. Riistvara transformeerimine ja valgustamine lõi pretsedendi hilisematele pikslivarjundaja (*pixel shader*) ja lagipunkti varjundaja (*vertex shader*) moodulitele, mis olid rohkem kohandatavad ja programmeeritavad.

### 2000. aastad ja tänapäev

DirectX 8.0 API tulekuga ja sarnase funktsionaalsusega OpenGL-is said GPU-d programmeeritava varjundamise omaduse. Nüüd suudeti iga pikslit juhtida väikese programmiga, mis võisid sisaldada sisenditena piltide tekstuure. Lisaks sai nüüdsest kontrollida samalaadselt ka geomeetrilisi lagipunkte (*geometric vertex*) enne kui neid ekraanil kujutati. Nvidia oli ka esimene, kes tõi turule kiibi, millel oli võime varjundajat programmeerida – selleks kaardiks oli Geforce 3 seeria (tuntud ka kui NV20).

2002. aasta oktoobris tutvustati ATI Radeon 9700 graafikakaarti (tuntud ka kui R300), millega koos tuli ka välja Direct3D 9.0 kiirendi – sestpeale olid pikslite ja lagipunktide varjundid võimelised teostama kordusi ja arvutama väga pikki ujukomaarve. Üldiselt muutusid GPU-d peaaegu sama kohandatavateks kui CPU-d, nad muutusid kiiremaks just pilt-massiiv operatsioonide teostamisel.
 
Tänapäeval on paralleel GPU-dest saanud tugevad vastased CPU-dele. GPGPU (*General Purpose Computing on GPU*) ehk üldotstarbelised GPU-d on leidnud tee mitmekesistesse valdkondadesse nagu nafta otsimine, teaduslike piltide töötlemine ja isegi aktsiahindade määramine. Üha rohkem suureneb pinge GPU tootjatele just GPGPU kasutajatelt, mis paneb neid parandama riistvara disaini ja suurendama jõudlust, kuid põhiliselt on vajadus just arendada kohanduvust programmeerimiseks.

### Graafikakaardiprotsessorite tootjad

Paljud firmad on tootnud GPU-sid erinevate kaubamärkide all. 2008. aastal olid Intel, Nvidia, AMD/ATI turuliidrid vastavalt 49,4%, 27,8% ja 20,6% turuosast. Need arvud sisaldavad ka Inteli integreeritud graafika lahendusi. Kui aga neid arve mitte arvestada, siis kuulub praktiliselt 100% turust just ATI ja NVIDIA kätte. Lisaks toodavad GPU-sid ka S3 Graphics, VIA Technologies ja Matrox.

## Arvutuslikud funktsioonid

Kaasaegsed GPU-d kasutavad suuremat osa oma transistoritest 3D-arvutigraafikaga seotud arvutusteks. Algselt olid need mõeldud mälumahukateks töödeks, näiteks tekstuurimine ja polügoonide visualiseerimine, hiljem lisandusid ka geomeetrilised arvutused nagu rotatsioon ja lagipunktide ülekandmine teistesse koordinaatsüsteemide punktidesse. Hilisemad GPU arendused on lisanud programmeeritavate varjundite toe, mis võimaldab teha sarnaselt CPU-dega toiminguid lagipunktide ja tekstuuridega. Samuti on lisatud ülediskreetimise (*oversampling*) ja interpoleerimise (*interpolation*) tehnikad sakilisuse (*aliasing*) vähendamiseks. Tagatakse ka suure täpsusega värviruum. Kuna põhiosa arvutustest on seotud maatriksite ja vektoritega, on disainerid ja teadlased teinud rohkelt uuringuid GPU-dele kasutuse leidmiseks mittegraafilistes arvutustes.

Lisaks 3D toele on kaasaegsetes GPU-des ka 2D-kiirendi ja puhvermälu (tavaliselt koos VGA-ühilduva riistvaraga).

### GPU kiirendatud video dekodeerimine
Enamik alates 1995. aastast valmistatud GPU-sid toetab YUV-värviruumi (värvuste kodeerimise süsteem) ja riistvaralist graafikapealistust (*overlays*), tähtsal kohal on ka digitaalvideo taasesitamine. 2000. aastast toodetud graafikakaartidest toetavad suuremal osal MPEG-primitiive, nagu liikumise tasandamine ja iDCT (pöörddiskreetne koosinusteisendus ehk matemaatiline teisendus kujutise esitamiseks kordajate hulgana). Riistvaraline kiirendatud video dekodeerimine on protsess, kus video dekodeerimine ja töötlus viiakse läbi GPU riistvaraga. Seda protsessi on viidatud kui "GPU-kiirendatud videodekodeerimine", "GPU-abistatud videodekodeerimine", "GPU riistvara kiirendatud videodekodeerimine" või "GPU riistvara abistatud videodekodeerimine".

Kõige hilisemad graafikakaardid oskavad ümber käia kõrglahutuskvaliteet videoga otse graafikakaardilt, vähendades sellega keskseadme (CPU) koormust. Levinumad API-d GPU kiirendatud video dekodeerimiseks on DxVA (*DirectX Video Acceleration*) Microsoft Windowsi operatsioonisüsteemides ja Xbox 360 platvormil ning VDPAU (*Video Decode and Presentation API for UNIX*), VAAPI (*Video Acceleration API*), XvMC (*X-Video Motion Compensation*) ja XvBA (*X-Video Bitstream Acceleration*) Linuxis ja UNIX-i operatsioonisüsteemides. Kõik peale XvMC (*X-Video Motion Compensation*) on võimelised dekodeerima MPEG-1, MPEG-2, MPEG-4 ASP (MPEG-4 Osa 2), MPEG-4 AVC (H.264/ DivX 6), VC-1, WMV3/WMV9, Xvid / OpenDivX (DivX 4), ja DivX 5 koodekitega kodeeritud videoid, samal ajal kui XvMC on ainult võimeline dekodeerima MPEG-1 ka MPEG-2-te.

### Video dekodeerimise protsessid, mida saab kiirendada
* Liikumise ühtlustamine (mocomp);
* Pöörddiskreetne koosinusteisendus (iDCT);
** Pöördarvestus 3:2 ja 2:2 parandus;
* Pöördmodifitseeritud diskreetne koosinusteisendus (iMDCT);
* Tsüklis olevate plokkide osandamise filter;
* Eelkaadri prognoosimine;
* Pöördvärvi kantimine (IQ);
* Muutuja pikkuse dekodeerimine (VLD);
* Ruumi aegajaline kaadri mittevaheldus ja automaatne vahelduse/järkjärgulisuse tuvastus;
* Bitivoo töötlemine (CAVLC (*Context-adaptive variable-length coding*) / CABAC (*Context-adaptive binary arithmetic coding*)).

## Graafikaprotsessori esinemisvormid

### Sihtotstarbelised graafikakaardid

Sihtotstarbelised graafikakaardid on kõikidest esinemisviisidest kõige võimsamad. Videokaart ühildub emaplaadiga laienduspesa kaudu, nagu PCI Express (PCIe) või AGP (*Accelerated Graphics Port*). Neid on kõige kergem uuendada ja välja vahetada, piisab olemasoleva kaardi asendamisest uuega. Mõned kaardid kasutavad siiani PCI (*Peripheral Component Interconnect*) siini, mis on piiratud läbilaskevõime (*bandwidth*) tõttu kasutuses tavaliselt siis, kui PCIe ja AGP siinid pole saadaval.

Sihtotstarbelised GPU-d ei ole aga alati eemaldatavad ega liidese kaudu emaplaadiga ühenduses. Mõiste "sihtotstarbeline" (*dedicated*) viitab sihtotstarbeliste graafikakaartide puhul muutmälu (*Random Access Memory*) olemasolule. Sülearvutite jaoks on sihtotstarbelised GPU-d tavaliselt ühendatud mittestandardse ja sageli firmapärase siini kaudu, et hoida kokku suuruse ja kaalu pealt. Selliseid pesi võib siiski pidada PCIe või AGP-ks, isegi kui nad pole füüsiliselt vahetatavad oma koopiatega.

Nvidia SLI- ja ATI CrossFire-tehnoloogiad lubavad graafikakaardi jõudluse tõstmiseks kasutada mitut GPU-d. Selleks ühendatakse kaks või enam üksteisega ühilduvat kaarti vastava ülekandega.

### Integreeritud graafikalahendused

Integreeritud graafikalahendused ehk jagatud graafikalahendused ehk integreeritud graafikaprotsessorid (IGP) kasutavad osa arvutisüsteemi RAM-ist enne kui sihtotstarbelise graafikamälu. Integreeritud graafikalahendusega arvutid moodustavad 90% kõikidest PC kaubasaadetistest. Need lahendused on odavamad kui sihtotstarbelised graafikalahendused, kuid sellest on nad vähem võimelised protsesse läbi viima samaväärse võimsusega. Ajalooliselt olid integreeritud lahendused ebasobivad 3D-mängude või graafiliselt intensiivsete programmide käitamiseks, kuid olid suutlikud hoida töös vähem intensiivseid programme nagu Adobe Flash. Selliseid IGP-sid pakkusid 2004. aastal SiS ja VIA. Siiski, tänapäevased integreeritud lahendused nagu AMD Radeon HD 3200 (AMD 780G kiibistik) ja Nvidia GeForce 8200 (nForce 710|Nvidia nForce 730a) on vägagi võimelised tegelema 2D-graafikaga, näiteks Adobe Flashi rakenduste puhul ja muulgi juhul kui ka väiksema jõudlusega 3D-graafikaga. Kuigi ikkagi suurem osa integreeritud graafikalahendustest jäävad võimsamatele arvutimängudele alla. Kiipidel nagu Nvidia GeForce 9400M Apple'i MacBookis ja MacBook Pros ning AMD Radeon HD 3300 (AMD 790GX) on parandatud jõudlusega, kuid sellest hoolimata jäävad needki sihtotstarbelistele graafikakaartidele alla. Modernsetel lauaarvuti emaplaatidel on tihti kaasas integreeritud graafikalahendus ja lisaks laienduspesad, et sihtotstarbeline graafikakaart lisada hiljem.

Kuna GPU on väga mälutundlik, siis integreeritud lahendus võib ennast leida konkureerimas CPU-ga juba niigi aeglase süsteemi RAM-i pärast, kuna tal endal on minimaalselt või puudub tal üldse eraldi mälu. Süsteemi RAM-i läbilaskevõime saab olla 2–12,8 Gbit/s, kui aga sihtotstarbelisel GPU-l on see 10 Gbit/s kuni üle 100 Gbit/s sõltuvalt mudelist.

Vanadel integreeritud graafika kiibistikel puudus riistvaraline transformeerimine ja valgustamine, kuid uuematel mudelitel on see juba sisse ehitatud.

### Hübriidlahendused

See uuem GPU-de klass võistleb integreeritud graafika lahendustega väikese jõudlusega lauaarvutite kui ka sülearvutite turul. Seda klassi esindavad peamiselt ATI HyperMemory ja Nvidia TurboCache seeriad. Hübriidgraafikakaardid on kallimad kui integreeritud lahendused, kuid palju odavamad kui sihtotstarbelised graafikakaardid. Seda tüüpi lahendused jagavad süsteemimälu ja omavad sihtotstarbelist vahemälu, mis korvab süsteemimälu pikka latentsusaega. Tehnoloogiad PCI Express siinis suudavad selle lahenduse võimalikult hästi tööle panna. Neid lahendusi reklaamitakse kohati stiilis, et vastaval seadmel on 768 MB RAM-i, mis tegelikult viitab hoopis sellele, et vastav mäluhulk jagatakse süsteemimäluga.

### Andmevoo töötlemine ja üldkasutus graafikaprotsessorid

Uue käsitluse järgi kasutatakse üldkasutus graafikaprotsessoreid (GPGPU) kui modifitseeritud vormi andmevoo protsessorist. See kontseptsioon muudab modernse graafikakiirendi varjundaja konveieri tohutu ujukoma arvutamise jõu üldkasutus graafikaprotsessori jõuks, mis levinud arvamuse kohaselt suudab läbi viia ainult graafikalisi operatsioone. Teatud programmid vajavad väga suurel hulgal vektorite operatsioone, kus just GPGPU suudab näidata paremaid jõudlustulemusi kui tavaline CPU. Kaks kõige suuremat diskreetsete (vt eespool teemat "Sihtotstarbelised graafikakaardid") GPU-de tootjat on ATI ja Nvidia, kes lähenevad sellele uuele meetodile valikuliste rakendustega. Nii ATI kui ka Nvidia tegid koostööd Stanfordi Ülikooliga aidates välja töötada GPU-põhist klientprogrammi Folding@Home jaoks, et määrata ja arvutada proteiinide klappimist ja sidumist. Just seesuguste rakenduste puhul arvutab GPU umbes nelikümmend korda kiiremini kui tavaline CPU.

GPU-põhised tippjõudlusega arvutid on hakanud mängima suurt rolli ulatuslikus modelleerimises. Kolm viiest maailma kõige võimsamast superarvutitest kasutab ära GPU kiirendamise eeliseid. Nende hulka kuulub ka praegune liider (seisuga oktoober 2010) Tianhe-1A, mis kasutab Nvidia Tesla platvormi.

Hiljuti hakkas Nvidia tootma kaarte, mis toetavad API lisa kasutada C programmeerimiskeelt CUDA tehnoloogial, mis lubab määratud funktsioonidel C programmeerimiskeeles kasutada GPU andmevoo protsessoreid. See annab C-programmidele võimaluse ära kasutada GPU oskust opereerida paralleelselt suurte maatriksitega, samas kasutades CPU-d kui vaja. CUDA on ka esimene API, mis lubab CPU-põhistel rakendustel kasutada otse GPU ressursse, ilma et piiraks graafika API tööd, samal ajal kui kasutatakse protsessorit ka muudeks toiminguteks.

2005. aastast on olnud kasvav huvi kasutada GPU jõudlust evolutsiooniliste arvutuste tegemiseks ja adaptatsiooni välja arvutamise kiirendamiseks geneetilises programmeerimises. Suurem osa lahendustest kompileerib lineaarse või puustruktuuriga programmid hostival PC-l ja saadab need siis GPU-le käivitamiseks. Tüüpiliselt on jõudluse kasu saavutatav ainult siis, kui käitatakse ühte aktiivset rakendust samaaegselt paljude probleemnäidetena paralleelselt, kasutades selleks GPU SIMD (*Single instruction, multiple data*) arhitektuuri. Siiski, oluline kiirendus on võimalik saavutada ka ilma programmi kompileerimata, vaid selle asemel see kohe üle viia GPU-le, et see seal interpreteeritaks. Kiirendust saab sel juhul saavutada kas interpreteerides mitmeid programme korraga või samaaegselt käitades mitmeid probleemnäiteid või siis mõlemaid toiminguid vastavalt kombineeritult. Modernne GPU (näiteks Nvidia 8800 GTX või hilisem) suudab hõlpsasti samaaegselt interpreteerida sadu tuhandeid väiksemaid programme.

## Vaata ka
*Videokaart

## Viited

## Välislingid

*NVIDIA – Mis on GPU? (inglise keeles)
*Raamatusari "GPU Gems" (inglise keeles)
*Graafikariistvara ajalugu (inglise keeles)
*"Tom's Hardware" – GPU juhend algajatele (inglise keeles)
*Üldotstarbelised arvutused graafikariistvara abil (inglise keeles)
*Kuidas töötavad graafikaprotsessorid (inglise keeles)
*"GPU Caps Viewer" – videokaartide andmete vaatamine (inglise keeles)
*OpenGPU – GPU arhitektuur (hiina keeles)