Šių dienų kompiuteriuose (angl. “ – Graphics Processing Unit) yra būtinas komponentas. Jis gali būti integruotas į motininę plokštę arba prijungtas atskirai vaizdo plokštėje. Šis procesorius gali atlikti ypač daug operacijų, per sekundę savo galingumu kelis kartus aplenkdamas net pačius naujausius bendrosios paskirties procesorius.
GPGPU screenshot 1

Grafikas rodo, kiek apytiksliai milijardų operacijų su slankaus kablelio skaičiais per sekundę galėjo atlikti naujausi bendrosios paskirties procesoriai (žydra kreivė) ir vaizdo procesoriai (raudona kreivė) nuo 1998 iki 2006 metų.
Vaizdo procesoriaus pagrindinė užduotis yra manipuliuoti 3D ir 2D vaizdus, skaičiuoti erdvinių objektų pozicijas ir apšvietimą. Nuo apytiksliai 2000 metų nauji vaizdo procesoriai gali būti programuojami vadinamųjų šešėliavimo programų pagalba (angl. „Shaders“). Tai leido kurti dar realistiškesnę kompiuterinę grafiką ir įgyvendinti naujus apšvietimo skaičiavimo metodus. Taip pat naujos galimybės sudomino ir kitų sričių specialistus.

Norint išsiaiškinti, kodėl yra žymiai greitesnis už pagrindinės paskirties procesorių, reikia suprasti kaip jame apdorojami duomenys. Kadangi šis straipsnis neapžvelgs visos architektūros detalių, norintiems apie tai sužinoti daugiau, patariu apsilankyti procesorių gamintojos NVIDIA programuotojų puslapyje.

Taigi duomenų apdorojimą grubiai vaizduoja sekanti diagrama. Objektai trimačiame pasaulyje dažniausiai aprašomi trikampiais. Šių trikampių viršūnės apdorojamos vadinamosiose viršūnių programose (angl. „Vertex shader“). Toliau iš tų viršūnių susidarantys trikampiai paverčiami į taškus ir perduodami taškų programai (angl. „Pixel shader“). Po to šis apdorotas taškas išvedamas į ekraną arba išsaugojamas atmintyje ir vėl iš naujo panaudojamas skaičiuojant kitas viršūnes ir taškus. Naujos kartos vaizdo procesoriuose (palaikančiuose 10-tą Direct3D versiją) atsirado dar daugiau programuojamų konvejerio dalių, tačiau jos nėra svarbios šiai straipsnio temai.
GPGPU screenshot 2

Dėl tokios duomenų apdorojimo, konvejerio vaizdo procesoriuje, architektūros, duomenis galima lengvai apdoroti lygiagrečiai. Kiekviena viršūnė nepriklauso nuo kitų apdorojamų viršūnių ir kiekvienas taškas nepriklauso nuo kitų taškų. Todėl naujausi vaizdo procesoriai (2007m.) turi net iki 128 skaičiavimo elementų, galinčių vykdyti viršūnių ir taškų programas vienu metu. Kiekvienas skaičiavimo elementas veikia apytiksliai 1500MHz dažniu. Dėl to jų visuma aplenkia visus bendrosios paskirties procesorius. Šią skaičiavimo elementų didėjimo tendenciją matome ir šiandienos bendrosios paskirties procesoriuose, kurie jau turi iki 4 branduolių. Tačiau norint panaudoti šią galią, reikia stipriai keisti programos vykdymo eigą, priversti programą skaičiavimus vykdyti lygiagrečiai.

Kas yra ?

angliškai reiškia General-Purpose computation on GPUs. Verčiant pažodžiui - Bendros Paskirties Skaičiavimai su . Dėl galimybės programuoti ir didelės jų galios jie sudomino įvairių sričių specialistus. Priversti procesorių dirbti galima pasinaudojant įvairiomis bibliotekomis. Dvi pagrindinės ir šiuo metu populiariausios: Direct3D, kuri turi HLSL (angl. „High Level Shading Language“), ir OpenGL su GLSL (angl. „OpenGL Shading Language“). Taip pat šiais metais NVIDIA pristatė CUDA (angl. „Compute Unified Device Architecture“) programavimo įrankį, kuris leidžia programuoti kalba panašia į populiariąją C kalbą.

Duomenys vaizdo atmintyje laikomi tekstūrų arba atminties blokų (buferių), į kuriuos surašomos viršūnių erdvėje koordinatės, pavidalu. Tekstūra – tai vienmatis, dvimatis ar trimatis paveiksliukas. Tekstūroje galime laikyti duomenis, kurių reikės atlikti skaičiavimams ir išvesti į ją skaičiavimo rezultatus.

Bitoninio rikiavimo algoritmas

Vienas iš vaizdo procesoriaus pritaikymo būtų gali būti didelio kiekio duomenų rikiavimas. Tai operacija, kuri dažnai atliekama realiose situacijose, pavyzdžiui, įrašų rikiavimas duomenų bazėse. Tai galima atlikti vadinamuoju bitoninio rikiavimo algoritmu. Jis vykdomas keliomis (tiksliau log(n), kur n – duomenų kiekis, log – dvejetainis logaritmas) pakopomis. Algoritmo vykdymo metu surikiuoti mažesni duomenų blokai jungiami į dvigubai didesnius blokus. Šį algoritmą su vienmačiu masyvu arba vienmate tekstūra vaizdžiai iliustruoja diagrama žemiau.
GPGPU screenshot 3

Ši diagrama vaizduoja bitoninio rikiavimo algoritmą su 8 skaičiais. Algoritmas vykdomas trimis pakopomis. Vienos pakopos rezultatas yra sekančios pakopos duomenys. Kiekvienoje pakopoje masyvas išdalinamas į jau surikiuotus blokus, pažymėtus raudonai ir žaliai. Gretimi blokai lyginami taip, kaip vaizduoja rodyklės. Mažesnis elementas perkeliamas į žalią regioną, o didesnis į raudoną.
Bitoninio rikiavimo algoritmas ypatingas tuo, kad duomenų palyginimus ir sukeitimus galima atlikti lygiagrečiai, iškart visam duomenų masyvui (tekstūrai). Taip vienu metu išnaudojami visi vaizdo procesoriaus skaičiavimo elementai. Čia pateikiamas tik vienmačio masyvo rikiavimo algoritmas, bet dažniausiai naudojami dvimačiai masyvai, nes vaizdo procesoriai labiau pritaikyti dirbti su dvimatėmis tekstūromis (paveikslėliais). Taip pat šis algoritmas nėra pats našiausias lygiagretus rikiavimo algoritmas. Norintys sužinoti apie gudresnius būdus rikiuoti duomenis pasinaudojant vaizdo procesoriumi ar bet kokiu kitu lygiagretaus skaičiavimo procesoriumi, gali apsilankyti gpgpu.org.

Lygiagretūs rikiavimo algoritmai, vykdomi vaizdo procesoriuje, greičiu konkuruoja su algoritmais, vykdomais bendrosios paskirties procesoriuose, pavyzdžiui, greitu rikiavimu (angl. „Quick sort“). Kaip teigiama straipsnyje apie TeraSort algoritmą, pigūs vaizdo procesoriai rikiuoja duomenis taip pat greit kaip žymiai brangesni bendrosios paskirties procesoriai (lyginama tuomet kainavusi $265 NVIDIA 7800 GT vaizdo plokštė su $2200 kainavusiu 3.6 GHz Dual Xeon serveriu).

Pabaiga

Straipsnyje paminėtas duomenų rikiavimo algoritmas yra tik vienas iš lygiagrečių procesorių pritaikymo būdų. Bendrosios paskirties skaičiavimai pasinaudojant vaizdo procesoriumi yra dar gan nauja sritis ir panašu, jog ateityje bus atrasta dar daugiau metodų kaip panaudoti šiuos galingus lygiagretaus skaičiavimo procesorius.

Naudoti šaltiniai:
http://www.gpgpu.org/
http://en.wikipedia.org/wiki/GPU
http://en.wikipedia.org/wiki/CUDA
http://www.wired.com/gadgets/pcs/news/2006/11/72090
GPUTeraSort: High Performance Graphics Coprocessor Sorting for Large Database Management
http://en.wikipedia.org/wiki/Bitonic_sorter

Panašūs straipsniai


“GPGPU - bendrosios paskirties skaičiavimai pasinaudojant vaizdo procesoriumi” komentarų: 9

  1. Lukas Steiblys

    Ir kodėl pastoviai būtina sugadint visą straipsnio formatavimą.

  2. Aidas

    Įdomus straipsnis. Turbūt DPRS (http://www.elektronika.lt/news/computers/9673/) kūrėjai tuom ir pasinaudojo.

  3. Aras Pranckevičius

    ++straipsniui. Galėjai paminėt pritaikymo sritis (options pricing, molekulių visokių ten tyrimai, …).

    Aidas: taip, DPRS naudoja GPGPU technikas. Tačiau tai visvien yra brute-force ataka, kuri nors ir daug greitesnė už CPU, visgi nėra scalable. Plačiau čia: http://www.codinghorror.com/blog/archives/000986.html

  4. Lukas Steiblys

    Dabar pastebėjau, kad ir papildomų gramatikos klaidų padarėt keisdami straipsnį.
    Šį straipsnį taip pat galima parsisiųst iš čia: http://a.ktug.lt/uploads/GPGPU.doc , kur turėjau galimybes redaguot kaip noriu :).

  5. Giedrius

    Imho straipsnyje tema tikrai neissemta, tikrai yra kur pletoti, pvz kad ir Aras galetu parodyti savo zinias ir parasyti ka zino jis apie siuos dalykus. Del pritaikymo - dar daug daug sriciu nepamineta - pvz garso apdorojimas, kiek prisimenu furje transformacija pakankamai lengvai darosi, noretusi kad kas parasytu ir ka ATI su AMD daro toje srityje :)

  6. Lukas Steiblys

    Giedrau, visiškai sutinku. Čia tik ledkalnio viršūnės gabaliukas. Šitą temą galima studijuot metų metais. Mano tikslas buvo paaiškint, ką reiškia GPGPU, kad žmogus, pamatęs šį sutrumpinimą, turėtų bent kokį supratimą. Kaip ir sakiau, norintys toliau tobulėti šioj srity, gali apsilankyt http://www.gpgpu.org arba http://developer.nvidia.com/

  7. Andrius

    Puikus straipsnis, pries tai net nezinojau, kad toks dalykas egzistuoja! Atrodo, jog tikrai verta pasidometi!

  8. txd

    Įdomumo dėlei: mano laboratorijoje vienas kolega daro magistrinį projektą - Real Time Raytracing su nVidia GPU. Visai įspūdingai atrodo, pakankamai detalias scenas varto su ~30FPS.

  9. traders

    joa cia labai daug matematikos :)

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.