CUDA je NVidia-in pokusaj da od njihovih GPGPU cipova (G80, G92, itd...) napravi general-purpose platformu za procesiranje visokih performansi.
U teoriji, to znaci da se graficke kartice u PC racunarima mogu pretvoriti u vrlo jake superkompjutere, koji su u stanju da rade racunanje brzinom vecom od 1 TFLOPS-a, sto je vise puta brze od najbrzeg intelovog procesora..
U praksi, rezultati variraju - pre svega, sama CUDA arhitektura je vrlo ogranicena i da bi algoritmi imali punu brzinu, moraju biti vrlo specificno optimizovani za CUDA-u, i ne smeju da rade odredjene stvari koje ubijaju performanse. CUDA ima svoj kompajler, koji opet ima neka ogranicenja; a i sama arhitektura diktira vrlo striktan nacin pisanja koda sa ogromnom kolicinom stvari koje unose velike brzinske penale.
To cini celu arhitekturu ne tako univerzalnom, jer je opseg algoritama koji su upotrebljivi limitiran. Takodje, memorijski bandwidth je problem, jer CUDA zahteva ogromnu kolicinu podataka kako bi bila brza, a to takodje znaci dosta I/O bandwidth-a ka procesoru...
Naime, CUDA najbolje radi ako imate neku veliku 2D (ili 3D) povrsinu/prostor, gde jedna "kernel" funkcija radi procesiranje, tj. izvrsava jedan algoritam na toj povrsini. Ono sto ce CUDA uraditi je, startovace vas "kernel" na ogromnom broju threadova (>256), i ceo algoritam ce se izvrsiti za jako kratko vreme zbog ogromne paralelizacije.
Na primer, zamislite da hocete da dekodirate 4096x4096 (filmska rezolucija) AVC video - DCT na CUDA-i bi bio jako brz, jer bi u 4096x4096 bilo 256 makroblokova koji bi se procesirali sa DCT kernelom odjednom, na 256 simultanih niti.
U takvim slucajevima, CUDA blista... medjutim, kao sto se vidi, to je ogranicava na slicne slucajeve. Dodatni problem je sto svaki blok sa nitima ima zajednicku memoriju koja je relativno brza, ali ako postoji zavisnost izmedju blokova van tog opsega, placate jako skupe penale - to svaki algoritam koji ima prostornu medju-zavisnost cini jako tesko portabilnim na CUDA-u, zbog tih penala... Takodje, morate paziti kako adresirate memoriju, da ne granate previse i sl... dakle, dosta ogranicenja.
--
Sve ovo CUDA-u cini odlicnom za neka naucna istrazivanja, meteorologiju i sl... gde imate >ogromne< povrsine nad kojima izvrsavate neke transformacije / racunanja. Ali za neke druge algoritme, koji su vise bliski kucnoj upotrebi, pitanje je koliko je CUDA upotrebljiva.
Intel je, takodje, najavio svoj prodor u ovaj segment trzista, ali je njihovo resenje (Tera-scale / Larrabee) drugacije, i zasnivace se na malim x86-kompatibilnim jezgrima povezanim preko vrlo brze magistrale. Time ce se dobiti 32-64 jezgra na jednom procesoru, koji bi za SIMD/vektorske operacije imali slicne performanse kao na CUDA-i, ali bi bili manje ograniceni sto se algoritama tice... Mada, Intel bi morao da pozuri tu, jer ni NVidia ne spava :)
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos:
http://www.digicortex.net/node/17 Gallery:
http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! -
https://github.com/psyq321/PowerMonkey