Pogledajte što je "CUDA" u drugim rječnicima. Računalni resurs U SM Programs using cuda

Dizajniran je za prevođenje host koda (glavni, kontrolni kod) i koda uređaja (hardverski kod) (datoteke s ekstenzijom .cu) u objektne datoteke prikladne za proces sklapanja konačnog programa ili biblioteke u bilo kojem programskom okruženju, na primjer u NetBeansu.

CUDA arhitektura koristi mrežni memorijski model, modeliranje niti klastera i SIMD upute. Primjenjivo ne samo za grafičko računalstvo visokih performansi, već i za razna znanstvena računalstva pomoću nVidia video kartica. Znanstvenici i istraživači naširoko koriste CUDA-u u raznim područjima, uključujući astrofiziku, računalnu biologiju i kemiju, modeliranje dinamike fluida, elektromagnetske interakcije, kompjutoriziranu tomografiju, seizmičku analizu itd. CUDA ima mogućnost povezivanja s aplikacijama koje koriste OpenGL i Direct3D. CUDA je višeplatformski softver za operativne sustave kao što su Linux, Mac OS X i Windows.

22. ožujka 2010. nVidia je izdala CUDA Toolkit 3.0, koji je sadržavao podršku za OpenCL.

Oprema

CUDA platforma se prvi put pojavila na tržištu izlaskom osme generacije NVIDIA G80 čipa i postala prisutna u svim kasnijim serijama grafičkih čipova, koji se koriste u GeForce, Quadro i NVidia Tesla obiteljima akceleratora.

Prva serija hardvera koja je podržavala CUDA SDK, G8x, imala je 32-bitni vektorski procesor jednostruke preciznosti koji je koristio CUDA SDK kao API (CUDA podržava C dvostruki tip, ali je njegova preciznost sada smanjena na 32-bitni pokretni zarez). Kasniji GT200 procesori imaju podršku za 64-bitnu preciznost (samo SFU), ali performanse su znatno lošije nego za 32-bitnu preciznost (zbog činjenice da postoje samo dva SFU-a po stream multiprocesoru, dok postoji osam skalarnih procesora). GPU organizira hardverski multithreading, koji vam omogućuje korištenje svih resursa GPU-a. Dakle, otvara se mogućnost prijenosa funkcija fizičkog akceleratora na grafički akcelerator (primjer implementacije je nVidia PhysX). Također otvara široke mogućnosti korištenja grafički hardver računalo za izvođenje složenih negrafičkih izračuna: na primjer, u računalnoj biologiji i drugim granama znanosti.

Prednosti

U usporedbi s tradicionalnim pristupom organiziranju izračuna Opća namjena Zahvaljujući mogućnostima grafičkih API-ja, CUDA arhitektura ima sljedeće prednosti u ovom području:

Ograničenja

  • Sve funkcije koje se mogu izvršiti na uređaju ne podržavaju rekurziju (CUDA Toolkit 3.1 podržava pokazivače i rekurziju) i imaju neka druga ograničenja

Podržani GPU i grafički akceleratori

Popis uređaja proizvođača opreme Nvidia s deklariranom punom podrškom za CUDA tehnologiju nalazi se na službenoj Nvidijinoj web stranici: CUDA-Enabled GPU Products (engleski).

Zapravo, sljedeći periferni uređaji trenutno podržavaju CUDA tehnologiju na tržištu PC hardvera:

Verzija specifikacije GPU Video kartice
1.0 G80, G92, G92b, G94, G94b GeForce 8800GTX/Ultra, 9400GT, 9600GT, 9800GT, Tesla C/D/S870, FX4/5600, 360M, GT 420
1.1 G86, G84, G98, G96, G96b, G94, G94b, G92, G92b GeForce 8400GS/GT, 8600GT/GTS, 8800GT/GTS, 9600 GSO, 9800GTX/GX2, GTS 250, GT 120/30/40, FX 4/570, 3/580, 17/18/3700, 4700x2, 1xxM, 32 /370M, 3/5/770M, 16/17/27/28/36/37/3800M, NVS420/50
1.2 GT218, GT216, GT215 GeForce 210, GT 220/40, FX380 LP, 1800M, 370/380M, NVS 2/3100M
1.3 GT200, GT200b GeForce GTX 260, GTX 275, GTX 280, GTX 285, GTX 295, Tesla C/M1060, S1070, Quadro CX, FX 3/4/5800
2.0 GF100, GF110 GeForce (GF100) GTX 465, GTX 470, GTX 480, Tesla C2050, C2070, S/M2050/70, Quadro Plex 7000, Quadro 4000, 5000, 6000, GeForce (GF110) GTX 560 TI 448, GTX570, GTX580, GTX59 0
2.1 GF104, GF114, GF116, GF108, GF106 GeForce 610M, GT 430, GT 440, GTS 450, GTX 460, GTX 550 Ti, GTX 560, GTX 560 Ti, 500M, Quadro 600, 2000
3.0 GK104, GK106, GK107 GEFORCE GTX 690, GTX 680, GTX 670, GTX 660 Ti, GTX 660, GTX 650 Ti, GTX 650, GT 640, GeForce GTX 680MX, GeForce GTX 680M, GEFORCE GTX 675MX, GeForce GTX 670MX, GTX, GTX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX 670MX, GTX, GTX 670MX, GTX 6 70MX, GTX 670MX, GTX, GTX TX 660M, GeForce GT 650M, GeForce GT 645M, GeForce GT 640M
3.5 GK110
Nvidia GeForce za stolna računala
GeForce GTX 590
GeForce GTX 580
GeForce GTX 570
GeForce GTX 560 Ti
GeForce GTX 560
GeForce GTX 550 Ti
GeForce GTX 520
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GTS 450
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GT 240
GeForce GT 220
GeForce 210
GeForce GTS 150
GeForce GT 130
GeForce GT 120
GeForce G100
GeForce 9800 GX2
GeForce 9800 GTX+
GeForce 9800 GTX
GeForce 9800 GT
GeForce 9600 GSO
GeForce 9600 GT
GeForce 9500 GT
GeForce 9400 GT
GeForce 9400 mGPU
GeForce 9300 mGPU
GeForce 8800 GTS 512
GeForce 8800 GT
GeForce 8600 GTS
GeForce 8600 GT
GeForce 8500 GT
GeForce 8400GS
Nvidia GeForce za mobilna računala
GeForce GTX 580M
GeForce GTX 570M
GeForce GTX 560M
GeForce GT 555M
GeForce GT 540M
GeForce GT 525M
GeForce GT 520M
GeForce GTX 485M
GeForce GTX 480M
GeForce GTX 470M
GeForce GTX 460M
GeForce GT 445M
GeForce GT 435M
GeForce GT 425M
GeForce GT 420M
GeForce GT 415M
GeForce GTX 285M
GeForce GTX 280M
GeForce GTX 260M
GeForce GTS 360M
GeForce GTS 350M
GeForce GTS 160M
GeForce GTS 150M
GeForce GT 335M
GeForce GT 330M
GeForce GT 325M
GeForce GT 240M
GeForce GT 130M
GeForce G210M
GeForce G110M
GeForce G105M
GeForce 310M
GeForce 305M
GeForce 9800M GTX
GeForce 9800M GT
GeForce 9800M GTS
GeForce 9700M GTS
GeForce 9700M GT
GeForce 9650MGS
GeForce 9600M GT
GeForce 9600MGS
GeForce 9500MGS
GeForce 9500M G
GeForce 9300MGS
GeForce 9300M G
GeForce 9200MGS
GeForce 9100M G
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600MGS
GeForce 8400M GT
GeForce 8400MGS
Nvidia Tesla *
Tesla C2050/C2070
Tesla M2050/M2070/M2090
Tesla S2050
Tesla S1070
Tesla M1060
Tesla C1060
Tesla C870
Tesla D870
Tesla S870
Nvidia Quadro za stolna računala
Quadro 6000
Quadro 5000
Quadro 4000
Quadro 2000
Quadro 600
Quadro FX 5800
Quadro FX 5600
Quadro FX 4800
Quadro FX 4700 X2
Quadro FX 4600
Quadro FX 3700
Quadro FX 1700
Quadro FX 570
Quadro FX 470
Quadro FX 380 niskog profila
Quadro FX 370
Quadro FX 370 niskog profila
Quadro CX
Quadro NVS 450
Quadro NVS 420
Quadro NVS 290
Quadro Plex 2100 D4
Quadro Plex 2200 D2
Quadro Plex 2100 S4
Quadro Plex 1000 Model IV
Nvidia Quadro za mobilno računalstvo
Quadro 5010M
Quadro 5000M
Quadro 4000M
Quadro 3000M
Quadro 2000M
Quadro 1000M
Quadro FX 3800M
Quadro FX 3700M
Quadro FX 3600M
Quadro FX 2800M
Quadro FX 2700M
Quadro FX 1800M
Quadro FX 1700M
Quadro FX 1600M
Quadro FX 880M
Quadro FX 770M
Quadro FX 570M
Quadro FX 380M
Quadro FX 370M
Quadro FX 360M
Quadro NVS 5100M
Quadro NVS 4200M
Quadro NVS 3100M
Quadro NVS 2100M
Quadro NVS 320M
Quadro NVS 160M
Quadro NVS 150M
Quadro NVS 140M
Quadro NVS 135M
Quadro NVS 130M
  • Modeli Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 omogućuju GPU izračune s dvostrukom preciznošću.

Značajke i specifikacije raznih verzija

Podrška za značajke (nenavedene značajke su
podržano za sve računalne mogućnosti)
Računalna sposobnost (verzija)
1.0 1.1 1.2 1.3 2.x

32-bitne riječi u globalnoj memoriji
Ne Da

vrijednosti pomičnog zareza u globalnoj memoriji
Cjelobrojne atomske funkcije koje djeluju na
32-bitne riječi u zajedničkoj memoriji
Ne Da
atomicExch() radi na 32-bitnom
vrijednosti pomičnog zareza u zajedničkoj memoriji
Cjelobrojne atomske funkcije koje djeluju na
64-bitne riječi u globalnoj memoriji
Warp glasovne funkcije
Operacije s pomičnim zarezom dvostruke preciznosti Ne Da
Atomske funkcije koje rade na 64-bitu
cjelobrojne vrijednosti u zajedničkoj memoriji
Ne Da
Djeluje atomsko zbrajanje s pomičnim zarezom
32-bitne riječi u globalnoj i zajedničkoj memoriji
_glasački listić()
_threadfence_system()
_syncthreads_count(),
_syncthreads_and(),
_syncthreads_or()
Površinske funkcije
3D mreža bloka niti
Tehničke specifikacije Računalna sposobnost (verzija)
1.0 1.1 1.2 1.3 2.x
Maksimalna dimenzionalnost mreže blokova niti 2 3
Maksimalna x-, y- ili z-dimenzija mreže blokova niti 65535
Maksimalna dimenzionalnost bloka navoja 3
Maksimalna x- ili y-dimenzija bloka 512 1024
Maksimalna z-dimenzija bloka 64
Maksimalan broj niti po bloku 512 1024
Veličina osnove 32
Maksimalan broj rezidentnih blokova po multiprocesoru 8
Maksimalni broj rezidentnih warpova po multiprocesoru 24 32 48
Maksimalan broj rezidentnih niti po multiprocesoru 768 1024 1536
Broj 32-bitnih registara po multiprocesoru 8K 16K 32K
Maksimalna količina zajedničke memorije po multiprocesoru 16 KB 48 KB
Broj zajedničkih memorijskih banaka 16 32
Količina lokalne memorije po niti 16 KB 512 KB
Konstantna veličina memorije 64 KB
Radni skup predmemorije po multiprocesoru za stalnu memoriju 8 KB
Radni skup predmemorije po multiprocesoru za memoriju teksture Ovisno o uređaju, između 6 KB i 8 KB
Maksimalna širina za 1D teksturu
8192 32768
Maksimalna širina za 1D teksturu
referenca vezana za linearnu memoriju
2 27
Maksimalna širina i broj slojeva
za referencu 1D slojevite teksture
8192 x 512 16384 x 2048
Maksimalna širina i visina za 2D
referenca teksture vezana za
linearna memorija ili CUDA polje
65536 x 32768 65536 x 65535
Najveća širina, visina i broj
slojeva za 2D slojevitu referencu teksture
8192 x 8192 x 512 16384 x 16384 x 2048
Maksimalna širina, visina i dubina
za referencu 3D teksture vezanu za linearnu
memorije ili CUDA polja
2048 x 2048 x 2048
Maksimalan broj tekstura koje
može biti vezan za kernel
128
Maksimalna širina za 1D površinu
referenca vezana za CUDA polje
Ne
podržan
8192
Maksimalna širina i visina za 2D
površinska referenca vezana za CUDA polje
8192 x 8192
Maksimalan broj površina koje
može biti vezan za kernel
8
Maksimalan broj uputa po
zrno
2 miliona

Primjer

CudaArray* cu_array; tekstura< float , 2 >tex; // Dodijeli niz cudaMalloc( & cu_array, cudaCreateChannelDesc< float>(), širina Visina) ; // Kopiraj slikovne podatke u niz cudaMemcpy( cu_array, image, width* height, cudaMemcpyHostToDevice) ; // Povežite polje s teksturom cudaBindTexture(tex, cu_array) ; // Pokreni kernel dim3 blockDim(16, 16, 1) ; dim3 gridDim(širina / blockDim.x, visina / blockDim.y, 1) ; zrno<<< gridDim, blockDim, 0 >>> (d_podaci, širina, visina) ; cudaUnbindTexture(tex) ; __global__ void kernel(float * odata, int visina, int širina) ( unsigned int x = blockIdx.x * blockDim.x + threadIdx.x ; unsigned int y = blockIdx.y * blockDim.y + threadIdx.y ; float c = texfetch(tex, x, y) ; odata[ y* širina+ x] = c; )

Uvezi pycuda.driver kao drv import numpy drv.init() dev = drv.Device(0) ctx = dev.make_context() mod = drv.SourceModule( """ __globalno__ void multiply_them(float *dest, float *a, float *b) ( const int i = threadIdx.x; dest[i] = a[i] * b[i]; ) """) multiply_them = mod.get_function ("multiply_them" ) a = numpy.random .randn (400 ) .astype (numpy.float32 ) b = numpy.random .randn (400 ) .astype (numpy.float32 ) dest = numpy.zeros_like (a) multiply_them( drv.Out (dest) , drv.In (a) , drv.In (b) , block= (400 , 1 , 1 ) ) print dest-a*b

CUDA kao predmet na sveučilištima

Od prosinca 2009., softverski model CUDA poučava se na 269 sveučilišta diljem svijeta. U Rusiji se tečajevi o CUDA-i održavaju na Politehničkom sveučilištu u St. Petersburgu, Državnom sveučilištu u Jaroslavlju. P. G. Demidov, Moskva, Nižnji Novgorod, Sankt Peterburg, Tver, Kazan, Novosibirsk, Državno tehničko sveučilište Novosibirsk, Državna sveučilišta Omsk i Perm, Međunarodno sveučilište prirode društva i čovjeka "Dubna", Državno energetsko sveučilište Ivanovo, Državno sveučilište Belgorod , MSTU im. Bauman, Rusko kemijsko tehničko sveučilište nazvano po. Mendelejev, Međuregionalni centar za superračunala RAS, . Osim toga, u prosincu 2009. objavljeno je da je počeo s radom prvi ruski znanstveno-obrazovni centar “Parallel Computing”, smješten u gradu Dubna, čiji zadaci uključuju obuku i konzultacije o rješavanju složenih računalnih problema na GPU-u.

U Ukrajini se tečajevi o CUDA-i održavaju na Kijevskom institutu za analizu sustava.

Linkovi

Službeni resursi

  • CUDA zona (ruski) - službena CUDA web stranica
  • CUDA GPU Computing (engleski) - službeni web forumi posvećeni CUDA računalstvu

Neslužbeni izvori

Tomov hardver
  • Dmitrij Čekanov. nVidia CUDA: računanje na video kartici ili smrt CPU-a? . Tom's Hardware (22. lipnja 2008.) Arhivirano
  • Dmitrij Čekanov. nVidia CUDA: Benchmarking GPU aplikacija za masovno tržište. Tom's Hardware (19. svibnja 2009.) Arhivirano iz originala 4. ožujka 2012. Preuzeto 19. svibnja 2009.
iXBT.com
  • Alexey Berillo. NVIDIA CUDA - negrafičko računalstvo na GPU-u. 1. dio . iXBT.com (23. rujna 2008.). Arhivirano iz originala 4. ožujka 2012. Preuzeto 20. siječnja 2009.
  • Alexey Berillo. NVIDIA CUDA - negrafičko računalstvo na GPU-u. 2. dio . iXBT.com (22. listopada 2008.). - Primjeri implementacije NVIDIA CUDA. Arhivirano iz originala 4. ožujka 2012. Preuzeto 20. siječnja 2009.
Ostali resursi
  • Boreskov Aleksej Viktorovič. CUDA Basics (20. siječnja 2009.). Arhivirano iz originala 4. ožujka 2012. Preuzeto 20. siječnja 2009.
  • Vladimir Frolov. Uvod u CUDA tehnologiju. Online magazin “Računalna grafika i multimedija” (19. prosinca 2008.). Arhivirano iz originala 4. ožujka 2012. Preuzeto 28. listopada 2009.
  • Igor Oskolkov. NVIDIA CUDA pristupačna je ulaznica u svijet velikog računarstva. Computerra (30. travnja 2009.). Preuzeto 3. svibnja 2009.
  • Vladimir Frolov. Uvod u CUDA tehnologiju (1. kolovoza 2009.). Arhivirano iz izvornika 4. ožujka 2012. Preuzeto 3. travnja 2010.
  • GPGPU.ru. Korištenje video kartica za računalstvo
  • . Centar za paralelno računanje

Bilješke

vidi također

Vratimo se u 2003. godinu kada su Intel i AMD bili u zajedničkoj utrci za najsnažnijim procesorom. U samo nekoliko godina, kao rezultat ove utrke, brzine sata su se značajno povećale, posebno nakon puštanja u promet Intel Pentium 4.

Ali utrka se brzo približavala granici. Nakon vala golemih povećanja brzine takta (između 2001. i 2003., brzina takta Pentiuma 4 udvostručena je s 1,5 na 3 GHz), korisnici su se morali zadovoljiti desetinkama gigaherca koje su proizvođači uspjeli istisnuti (od 2003. do 2005. , brzine takta povećane sa samo 3 na 3 ,8 GHz).

Čak su i arhitekture optimizirane za visoke frekvencije takta, kao što je Prescott, počele doživljavati poteškoće, a ovoga puta ne samo proizvodne. Proizvođači čipova jednostavno su se zaletjeli u zakone fizike. Neki su analitičari čak predviđali da će Mooreov zakon prestati vrijediti. Ali to se nije dogodilo. Izvorno značenje zakona često je iskrivljeno, ali tiče se broja tranzistora na površini silicijske jezgre. Dugo vremena je povećanje broja tranzistora u CPU-u bilo popraćeno odgovarajućim povećanjem performansi - što je dovelo do iskrivljavanja značenja. Ali onda se situacija zakomplicirala. Programeri CPU arhitekture pristupili su zakonu smanjenja rasta: broj tranzistora koje je trebalo dodati za potrebno povećanje performansi postajao je sve veći, što je dovelo do slijepe ulice.



Dok su proizvođači CPU-a čupali kosu pokušavajući pronaći rješenje za svoje probleme, proizvođači GPU-a i dalje su izvlačili značajne koristi od prednosti Mooreova zakona.

Zašto nisu došli do iste slijepe ulice kao i tvorci CPU arhitekture? Razlog je vrlo jednostavan: središnje procesorske jedinice dizajnirane su za primanje maksimalne performanse na nizu instrukcija koje obrađuju različite podatke (cijele brojeve i brojeve s pomičnim zarezom), izvode slučajni pristup memoriji itd. Do sada, programeri pokušavaju osigurati veći paralelizam instrukcija - to jest, izvršavati što više instrukcija paralelno. Na primjer, s Pentiumom se pojavilo superskalarno izvršavanje, kada je pod određenim uvjetima bilo moguće izvršiti dvije instrukcije po taktu. Pentium Pro dobio je izvanredno izvršavanje instrukcija, što je omogućilo optimizaciju rada računalnih jedinica. Problem je u tome što postoje očita ograničenja za paralelno izvršavanje sekvencijalnog toka instrukcija, tako da slijepo povećanje broja računalnih jedinica ne donosi nikakvu korist jer će one i dalje biti u stanju mirovanja većinu vremena.

Nasuprot tome, GPU rad je relativno jednostavan. Sastoji se od uzimanja skupine poligona s jedne strane i generiranja skupine piksela s druge strane. Poligoni i pikseli neovisni su jedni o drugima, pa se mogu obrađivati ​​paralelno. Dakle, u GPU-u je moguće veliki dio kristala rasporediti u računalne jedinice, koje će se, za razliku od CPU-a, zapravo koristiti.



Kliknite na sliku za povećanje.

GPU se od CPU-a ne razlikuje samo po tome. Pristup memoriji u GPU-u je vrlo spregnut - ako se čita teksel, tada će se nakon nekoliko taktnih ciklusa čitati susjedni teksel; Kada se snimi piksel, nakon nekoliko ciklusa takta bit će snimljen i susjedni. Inteligentnim organiziranjem memorije možete postići učinak blizu teorijske propusnosti. To znači da GPU, za razliku od CPU-a, ne zahtijeva veliku predmemoriju, budući da je njegova uloga ubrzati operacije teksturiranja. Sve što je potrebno je nekoliko kilobajta koji sadrže nekoliko teksela koji se koriste u bilinearnim i trilinearnim filterima.



Kliknite na sliku za povećanje.

Živio GeForce FX!

Dva su svijeta dugo ostala razdvojena. Koristili smo CPU (ili čak više CPU-a) za uredske zadatke i internetske aplikacije, a GPU-ovi su bili dobri samo za ubrzavanje renderiranja. Ali jedna je značajka promijenila sve: naime, pojava programabilnih GPU-ova. U početku se procesori nisu imali čega bojati. Prvi takozvani programabilni GPU (NV20 i R200) ​​jedva da su bili prijetnja. Broj instrukcija u programu ostao je ograničen na oko 10, a radilo se na vrlo egzotičnim tipovima podataka, poput 9- ili 12-bitnih brojeva s fiksnom točkom.



Kliknite na sliku za povećanje.

No, Mooreov zakon opet je pokazao svoju najbolju stranu. Povećanje broja tranzistora ne samo da je omogućilo povećanje broja računalnih jedinica, već je i poboljšalo njihovu fleksibilnost. Pojava NV30 može se smatrati značajnim korakom naprijed iz nekoliko razloga. Naravno, igračima se NV30 kartice nisu baš svidjele, ali novi GPU-i počeli su se oslanjati na dvije značajke koje su dizajnirane da promijene percepciju GPU-a kao više od pukih grafičkih akceleratora.

  • Podrška za izračune s pomičnim zarezom jednostruke preciznosti (čak i ako nije u skladu sa standardom IEEE754);
  • podrška za više od tisuću uputa.

Dakle, imamo sve uvjete koji mogu privući pionire istraživače koji su uvijek u potrazi za dodatnom računalnom snagom.

Ideja korištenja grafičkih akceleratora za matematičke izračune nije nova. Prvi pokušaji učinjeni su još 90-ih godina prošlog stoljeća. Naravno, bili su vrlo primitivni - ograničeni, većinom, na korištenje nekih hardverskih funkcija, kao što su rasterizacija i Z-međuspremnici, kako bi se ubrzali zadaci poput pronalaženja rute ili zaključivanja Voronoi dijagrami .



Kliknite na sliku za povećanje.

Godine 2003., s pojavom naprednih shadera, dosegnuta je nova letvica - ovaj put izvođenje matričnih izračuna. Ovo je bila godina kada je cijeli dio SIGGRAPH-a ("Računanja na GPU-u") bio posvećen novom području IT-a. Ova rana inicijativa nazvana je GPGPU (Computation General-Purpose on GPU). A rana prekretnica bila je pojava .

Da biste razumjeli ulogu BrookGPU-a, morate razumjeti kako se sve dogodilo prije njegove pojave. Jedini način za dobivanje GPU resursa u 2003. bio je korištenje jednog od dva grafička API-ja - Direct3D ili OpenGL. Posljedično, programeri koji su željeli GPU mogućnosti za svoje računalstvo morali su se osloniti na dva spomenuta API-ja. Problem je u tome što nisu uvijek bili stručnjaci za programiranje video kartica, a to je ozbiljno kompliciralo pristup tehnologiji. Ako 3D programeri rade s shaderima, teksturama i fragmentima, onda se stručnjaci u području paralelnog programiranja oslanjaju na niti, jezgre, raspršene elemente itd. Stoga je prvo bilo potrebno povući analogije između dva svijeta.

  • Stream je tok elemenata iste vrste; u GPU-u se može predstaviti teksturom. U principu, u klasičnom programiranju postoji takav analog kao niz.
  • Zrno- funkcija koja će se neovisno primjenjivati ​​na svaki element toka; je ekvivalent shaderu piksela. U klasičnom programiranju možemo dati analogiju petlje - ona se primjenjuje na veliki broj elementi.
  • Za čitanje rezultata primjene kernela na nit, mora se stvoriti tekstura. Ne postoji ekvivalent na CPU-u, budući da ima puni pristup memoriji.
  • Kontrola mjesta u memoriji gdje će se vršiti upisivanje (u operacijama raspršivanja) vrši se kroz sjenčilo vrhova, budući da sjenčilo piksela ne može promijeniti koordinate piksela koji se obrađuje.

Kao što vidite, čak i uzimajući u obzir gornje analogije, zadatak ne izgleda jednostavno. I Brook je priskočio u pomoć. Ovaj naziv odnosi se na ekstenzije jezika C (“C s tokovima”, “C s tokovima”), kako su ih nazvali programeri na Stanfordu. U svojoj srži, Brookov zadatak bio je sakriti sve komponente 3D API-ja od programera, što je omogućilo predstavljanje GPU-a kao koprocesora za paralelno računanje. Kako bi to učinio, prevodilac Brook obradio je .br datoteku s C++ kodom i ekstenzijama, a zatim generirao C++ kod koji je bio povezan s bibliotekom s podrškom za različite izlaze (DirectX, OpenGL ARB, OpenGL NV3x, x86).



Kliknite na sliku za povećanje.

Brook ima nekoliko zasluga, od kojih je prva izvlačenje GPGPU-a iz sjene kako bi ovu tehnologiju mogle prihvatiti mase. Iako su nakon najave projekta brojne IT stranice preoptimistično izvijestile kako Brookovo izdanje dovodi u sumnju postojanje CPU-a koji će uskoro biti zamijenjeni snažnijim GPU-ima. No, kako vidimo, ni nakon pet godina to se nije dogodilo. Iskreno, ne mislimo da će se to ikada dogoditi. S druge strane, gledajući uspješnu evoluciju CPU-a koji su sve više orijentirani na paralelizam (više jezgri, SMT multithreading tehnologija, proširenje SIMD blokova), kao i GPU-a koji, naprotiv, postaju sve univerzalniji. (podrška za izračune s pomičnim zarezom) jednostruka preciznost, cjelobrojni izračuni, podrška za izračune s dvostrukom preciznošću), čini se da će se GPU i CPU uskoro jednostavno spojiti. Što će se onda dogoditi? Hoće li GPU biti apsorbirani od strane CPU-a, kao što se dogodilo s matematičkim koprocesorima? Sasvim moguće. Intel i AMD danas rade na sličnim projektima. No još se puno toga može promijeniti.

Ali vratimo se našoj temi. Brookova prednost bila je popularizacija GPGPU koncepta; značajno je pojednostavio pristup GPU resursima, što je omogućilo sve većem broju korisnika da ovladaju novi model programiranje. S druge strane, usprkos svim kvalitetama Brooka, još je bio dug put prije nego što se GPU resursi mogu koristiti za računalstvo.

Jedan od problema vezan je za na različitim razinama apstrakcijom, a posebno s prekomjernim dodatnim opterećenjem koje stvara 3D API, a koje može biti prilično vidljivo. Ali ozbiljniji problem može se smatrati problemom kompatibilnosti, s kojim programeri Brooka nisu mogli učiniti ništa. Postoji oštra konkurencija između proizvođača grafičkih procesora, pa oni često optimiziraju svoje upravljačke programe. Dok su ovakve optimizacije uglavnom dobre za igrače, mogle bi prekinuti Brookovu kompatibilnost preko noći. Stoga je teško zamisliti korištenje ovog API-ja u proizvodnom kodu koji će negdje raditi. I dugo je Brook ostao rezervat istraživača amatera i programera.

Međutim, Brookov uspjeh bio je dovoljan da privuče pozornost ATI-ja i nVidije, koji su se zainteresirali za takvu inicijativu, budući da bi mogla proširiti tržište, otvarajući novi važan sektor za tvrtke.

Istraživači koji su prvobitno bili uključeni u projekt Brook brzo su se pridružili razvojnim timovima u Santa Clari kako bi predstavili globalnu strategiju za razvoj novog tržišta. Ideja je bila stvoriti kombinaciju hardvera i softver, prikladan za GPGPU zadatke. Budući da nVidia programeri znaju sve tajne svojih GPU-a, nisu se mogli osloniti na grafički API, već komuniciraju s GPU-om putem upravljačkog programa. Iako, naravno, to dolazi sa svojim problemima. Dakle, razvojni tim CUDA (Compute Unified Device Architecture) stvorio je skup softverskih slojeva za rad s GPU-ima.



Kliknite na sliku za povećanje.

Kao što možete vidjeti na dijagramu, CUDA pruža dva API-ja.

  • API visoke razine: CUDA Runtime API;
  • API niske razine: CUDA Driver API.

Budući da je API visoke razine implementiran povrh API-ja niske razine, svaki poziv funkcije na razini vremena izvođenja raščlanjen je na više jednostavne upute, koje obrađuje Driver API. Imajte na umu da se dva API-ja međusobno isključuju: programer može koristiti jedan ili drugi API, ali neće biti moguće miješati pozive funkcija iz dva API-ja. Općenito, izraz "API visoke razine" je relativan. Čak je i Runtime API takav da bi ga mnogi smatrali niskom razinom; međutim, još uvijek pruža funkcije koje su vrlo prikladne za pokretanje ili upravljanje kontekstom. Ali ne očekujte previše visoka razina apstrakcije - još uvijek morate imati dobar set znanja o nVidia GPU-ovima i kako oni rade.

S Driver API-jem još je teže raditi; bit će potrebno više truda za pokretanje GPU obrade. S druge strane, API niske razine je fleksibilniji, dajući programeru dodatnu kontrolu ako je potrebno. Dva API-ja mogu raditi s OpenGL ili Direct3D resursima (samo deveta verzija od danas). Prednost ove značajke je očita - CUDA se može koristiti za stvaranje resursa (geometrija, proceduralne teksture, itd.) koji se mogu proslijediti grafičkom API-ju ili, obrnuto, možete imati da 3D API šalje rezultate renderiranja u CUDA program, koji će zauzvrat izvršiti naknadnu obradu. Brojni su primjeri takvih interakcija, a prednost je što se resursi i dalje pohranjuju u GPU memoriju, ne moraju se prenositi preko PCI Express sabirnice, koja i dalje ostaje usko grlo.

Međutim, treba imati na umu da dijeljenje resursa u video memoriji nije uvijek idealno i može izazvati glavobolje. Na primjer, kada se mijenja razlučivost ili dubina boje, grafički podaci imaju prioritet. Stoga, ako trebate povećati resurse u međuspremniku okvira, upravljački program će to lako učiniti na račun resursa CUDA aplikacija, koje će se jednostavno srušiti s pogreškom. Naravno, ne baš elegantno, ali takva se situacija ne bi trebala događati vrlo često. I pošto smo počeli govoriti o nedostacima: ako želite koristiti više GPU-a za CUDA aplikacije, tada morate prvo onemogućiti SLI način rada, inače će CUDA aplikacije moći "vidjeti" samo jedan GPU.

Naposljetku, treća softverska razina posvećena je bibliotekama - dvije, da budemo precizni.

  • CUBLAS, gdje je dostupan potrebne blokove za proračune linearne algebre na GPU-u;
  • CUFFT, koji podržava izračun Fourierovih transformacija - algoritam koji se široko koristi u području obrade signala.

Prije nego što zaronimo u CUDA-u, definirajmo niz pojmova razasutih po nVidia-inoj dokumentaciji. Tvrtka je odabrala vrlo specifičnu terminologiju na koju se teško naviknuti. Prije svega napominjemo da nit u CUDA-i nema isto značenje kao CPU nit, a također nije ekvivalent niti u našim GPU člancima. Ulaz GPU niti u ovom slučaju je osnovni skup podataka koje je potrebno obraditi. Za razliku od CPU niti, CUDA niti su vrlo "lagane", to jest, prebacivanje konteksta između dvije niti nije operacija koja zahtjeva mnogo resursa.

Drugi izraz koji se često nalazi u CUDA dokumentaciji je iskriviti se. Ovdje nema zabune, jer nema analogije na ruskom (osim ako niste obožavatelj Start Treka ili igre Warhammer). Zapravo, izraz dolazi iz tekstilne industrije, gdje se pređa potke provlači kroz pređu osnove koja se rasteže na tkalačkom stanu. Warp u CUDA-i je grupa od 32 niti i minimalna je količina podataka koja se obrađuje na SIMD način u CUDA multiprocesorima.

Ali takva "zrnatost" nije uvijek prikladna za programera. Stoga, u CUDA-i, umjesto izravnog rada s warps-om, možete raditi s blokovi, koji sadrži od 64 do 512 niti.

Na kraju se ovi blokovi spajaju rešetka. Prednost ovog grupiranja je u tome što je broj blokova koje GPU istovremeno obrađuje usko povezan s hardverskim resursima, kao što ćemo vidjeti u nastavku. Grupiranje blokova u rešetke omogućuje vam da potpuno apstrahirate ovo ograničenje i primijenite kernel na više niti u jednom pozivu bez brige o fiksnim resursima. Za sve ovo odgovorne su CUDA biblioteke. Osim toga, takav se model dobro mjeri. Ako GPU ima malo resursa, izvršavat će blokove sekvencijalno. Ako je broj računalnih procesora velik, tada se blokovi mogu izvršavati paralelno. Odnosno, isti se kod može izvoditi na GPU-u kao početna razina, i na vrhunskim, pa čak i budućim modelima.

Postoji još nekoliko pojmova u CUDA API-ju koji označavaju CPU ( domaćin/domaćin) i GPU ( uređaj). Ako vas ovaj mali uvod nije uplašio, onda je vrijeme da pobliže pogledate CUDA-u.

Ako redovito čitate Tom's Hardware Guide, onda vam je arhitektura najnovijih GPU-a tvrtke nVidia poznata. Ako niste, preporučujemo da pročitate članak " nVidia GeForce GTX 260 i 280: nova generacija video kartica„Kada je u pitanju CUDA, Nvidia arhitekturu predstavlja malo drugačije, otkrivajući neke detalje koji su dosad bili skriveni.

Kao što možete vidjeti na gornjoj ilustraciji, nVidia shader jezgra sastoji se od nekoliko klastera procesora teksture (Kluster procesora teksture, TPC). Na primjer, video kartica 8800 GTX koristila je osam klastera, 8800 GTS - šest, itd. Svaki se klaster u biti sastoji od bloka teksture i dva strujni multiprocesor. Potonji uključuju početak cjevovoda (front end), koji čita i dekodira upute, te ih šalje na izvršenje, i kraj cjevovoda (back end), koji se sastoji od osam računalnih uređaja i dva superfunkcionalna uređaja SFU (superfunkcionalna jedinica), gdje se instrukcije izvršavaju prema SIMD principu, odnosno jedna instrukcija se primjenjuje na sve niti u warpu. nVidia ovu metodu naziva izvršenjem SIMT(jedna instrukcija više niti, jedna instrukcija, mnogo niti). Važno je napomenuti da kraj pokretne trake radi dvostruko češće od svog početka. U praksi to znači da ovaj dio izgleda dvostruko “šire” nego što zapravo jest (odnosno kao 16-kanalni SIMD blok umjesto osmokanalnog). Streaming multiprocesori rade na sljedeći način: svaki ciklus takta, početak cjevovoda odabire warp spreman za izvođenje i počinje izvršavati instrukciju. Da bi se instrukcija primijenila na sve 32 niti u warpu, kraj cjevovoda će zahtijevati četiri ciklusa takta, ali budući da radi dvostruko većom frekvencijom od početka, bit će potrebna samo dva ciklusa takta (u smislu početka cjevovod). Stoga, kako početak cjevovoda ne bi bio u stanju mirovanja u taktu, a hardver bio maksimalno opterećen, u idealnom slučaju možete izmjenjivati ​​instrukcije u svakom taktu - klasična instrukcija u jednom taktu i instrukcija za SFU u drugom .

Svaki multiprocesor ima određeni skup resursa koje vrijedi razumjeti. Postoji malo memorijsko područje tzv "Zajednička memorija", 16 kbajta po multiprocesoru. Ovo uopće nije predmemorija: programer je može koristiti po vlastitom nahođenju. Odnosno, imamo nešto slično lokalnoj trgovini SPU-ova na procesorima mobitela. Ovaj detalj je vrlo zanimljiv jer naglašava da je CUDA kombinacija softverske i hardverske tehnologije. Ovo memorijsko područje se ne koristi za shadere piksela, što Nvidia pametno ističe "ne volimo da pikseli razgovaraju jedni s drugima."

Ovo memorijsko područje otvara mogućnost razmjene informacija između niti u jednom bloku. Važno je naglasiti ovo ograničenje: zajamčeno je da će sve niti u bloku izvršiti jedan višeprocesor. Nasuprot tome, dodjela blokova različitim multiprocesorima uopće nije navedena, a dvije niti iz različitih blokova ne mogu međusobno razmjenjivati ​​informacije tijekom izvođenja. To jest, korištenje zajedničke memorije nije tako jednostavno. Međutim, dijeljena memorija je i dalje opravdana osim u slučajevima kada nekoliko niti pokušava pristupiti istoj memorijskoj banci, uzrokujući sukob. U drugim situacijama pristup zajedničkoj memoriji jednako je brz kao i pristup registrima.

Zajednička memorija nije jedina memorija kojoj višeprocesori mogu pristupiti. Mogu koristiti video memoriju, ali s manje propusnost i duga kašnjenja. Stoga, kako bi se smanjila učestalost pristupa ovoj memoriji, nVidia je multiprocesore opremila predmemorijom (približno 8 KB po multiprocesoru) koja pohranjuje konstante i teksture.

Multiprocesor ima 8192 registra koji su zajednički svim nitima svih blokova aktivnih na multiprocesoru. Broj aktivnih blokova po multiprocesoru ne može biti veći od osam, a broj aktivnih warpova ograničen je na 24 (768 niti). Stoga, 8800 GTX može podnijeti do 12.288 niti istovremeno. Sva ova ograničenja vrijedna su spomena jer omogućuju optimizaciju algoritma na temelju dostupnih resursa.

Optimiziranje CUDA programa stoga se sastoji od postizanja optimalne ravnoteže između broja blokova i njihove veličine. Više niti po bloku bit će korisno za smanjenje latencije memorije, ali broj registara dostupnih po niti je također smanjen. Štoviše, blok od 512 niti bit će neučinkovit jer samo jedan blok može biti aktivan na multiprocesoru, što rezultira gubitkom od 256 niti. Stoga nVidia preporučuje korištenje blokova od 128 ili 256 niti, što daje optimalan kompromis između smanjene latencije i broja registara za većinu jezgri/jezgri.

Iz softverske perspektive, CUDA se sastoji od skupa ekstenzija za jezik C, koji podsjećaju na BrookGPU, kao i nekoliko specifičnih API poziva. Među proširenjima su specifikatori tipa koji se odnose na funkcije i varijable. Važno je zapamtiti ključnu riječ __globalno__, koja, kada je dana prije funkcije, pokazuje da potonja pripada jezgri - ovu funkciju će pozvati CPU, a ona će se izvršiti na GPU-u. Prefiks __uređaj__ označava da će se funkcija izvršiti na GPU-u (što je, usput rečeno, ono što CUDA naziva "uređajem"), ali se može pozvati samo s GPU-a (drugim riječima, s druge funkcije __uređaja__ ili iz __globalne__ funkcije) . Na kraju, prefiks __domaćin__ izborno, označava funkciju koju poziva CPU i izvršava CPU - drugim riječima, redovita funkcija.

Postoji niz ograničenja povezanih s funkcijama __device__ i __global__: one ne mogu biti rekurzivne (to jest, pozivati ​​same sebe) i ne mogu imati varijabilan broj argumenata. Konačno, budući da se funkcije __device__ nalaze u GPU memorijskom prostoru, logično je da se njihova adresa ne može dobiti. Varijable također imaju niz kvalifikatora koji označavaju memorijsko područje gdje će biti pohranjene. Varijabla s prefiksom __dijeli__ znači da će biti pohranjen u zajedničkoj memoriji višeprocesora za strujanje. Poziv funkcije __global__ malo je drugačiji. Stvar je u tome što prilikom pozivanja morate postaviti konfiguraciju izvršenja - točnije, veličinu mreže na koju će se primijeniti kernel, kao i veličinu svakog bloka. Uzmimo, na primjer, kernel sa sljedećim potpisom.

__global__ void Func(float* parametar);

Zvat će se kao

Funk<<< Dg, Db >>>(parametar);

gdje je Dg veličina mreže, a Db veličina bloka. Ove dvije varijable odnose se na novi vektorski tip uveden sa CUDA.

CUDA API sadrži funkcije za rad s memorijom u VRAM-u: cudaMalloc za dodjelu memorije, cudaFree za njeno oslobađanje i cudaMemcpy za kopiranje memorije između RAM-a i VRAM-a i obrnuto.

Završit ćemo ovu recenziju Vrlo zanimljiv način na koji se kompajlira CUDA program: kompilacija se izvodi u nekoliko faza. Najprije se ekstrahira kôd specifičan za CPU i prosljeđuje standardnom kompajleru. Kod namijenjen GPU-u prvo se pretvara u PTX posredni jezik. Sličan je asembleru i omogućuje vam da ispitate kod tražeći potencijalne neučinkovitosti. Konačno, posljednja faza je prevođenje međujezika u upute specifične za GPU i stvaranje binarne datoteke.

Nakon što sam pogledao nVidia-inu dokumentaciju, u iskušenju sam isprobati CUDA ovaj tjedan. Stvarno, što bi to moglo biti bolje ocjene API stvaranjem vlastiti program? Tada bi većina problema trebala isplivati ​​na površinu, čak i ako na papiru sve izgleda savršeno. Također, praksa će najbolje pokazati koliko ste dobro razumjeli sve principe navedene u CUDA dokumentaciji.

Prilično je lako uključiti se u ovakav projekt. Danas postoji velik broj besplatnih, ali visokokvalitetnih alata dostupnih za preuzimanje. Za naš test koristili smo Visual C++ Express 2005, koji ima sve što nam je potrebno. Najteži dio je bilo pronaći program kojemu neće trebati tjedni da se prebaci na GPU, ali će također biti dovoljno zanimljiv da naš trud ne bude uzaludan. Na kraju smo odabrali dio koda koji uzima mapu visina i izračunava odgovarajuću kartu normale. Nećemo ulaziti u detalje o ovoj funkciji, budući da teško da će biti zanimljiva u ovom članku. Ukratko, program se bavi zakrivljenošću područja: za svaki piksel početne slike superponiramo matricu koja određuje boju rezultirajućeg piksela u generiranoj slici iz susjednih piksela, koristeći više ili manje složenu formulu. Prednost ove funkcije je što ju je vrlo lako paralelizirati, pa ovaj test savršeno pokazuje mogućnosti CUDA-e.


Još jedna prednost je što već imamo CPU implementaciju, tako da možemo usporediti rezultat s CUDA verzijom - bez ponovnog pronalaženja kotača.

Ponovimo još jednom da je svrha testa bila upoznavanje s CUDA SDK uslužnim programima, a ne usporedba verzija za CPU i GPU. Budući da je ovo bio naš prvi pokušaj stvaranja CUDA programa, nismo baš očekivali visoke performanse. Budući da ovaj dio koda nije kritičan, verzija za CPU nije optimizirana, tako da izravna usporedba rezultata nije zanimljiva.

Izvođenje

Međutim, izmjerili smo vrijeme izvršenja kako bismo vidjeli postoji li prednost korištenja CUDA-e čak i s najgrubljom implementacijom ili bi nam trebala duga i zamorna praksa da bismo dobili bilo kakvu korist od upotrebe GPU-a. Stroj za testiranje preuzet je iz našeg razvojnog laboratorija - prijenosno računalo sa Jezgreni procesor 2 Duo T5450 i GeForce 8600M GT grafička kartica s Vistom. Ovo je daleko od superračunala, ali rezultati su vrlo zanimljivi, budući da test nije “skrojen” za GPU. Uvijek je lijepo vidjeti da Nvidia pokazuje ogromne dobitke na sustavima s čudovišnim GPU-ima i velikom propusnošću, ali u praksi mnogi od 70 milijuna GPU-a koji podržavaju CUDA na tržištu osobnih računala danas nisu toliko moćni, zbog čega naš test još uvijek stoji .

Za sliku od 2048 x 2048 piksela, dobili smo sljedeće rezultate.

  • CPU 1 nit: 1,419 ms;
  • CPU 2 niti: 749 ms;
  • CPU 4 niti: 593 ms
  • GPU (8600M GT) blokovi od 256 niti: 109 ms;
  • GPU (8600M GT) blokovi od 128 niti: 94 ms;
  • GPU (8800 GTX) blokovi od 128 niti/256 niti: 31 ms.

Iz rezultata se može izvući nekoliko zaključaka. Počnimo s činjenicom da smo, unatoč razgovorima o očitoj lijenosti programera, modificirali početnu verziju CPU-a za više niti. Kao što smo već spomenuli, kod je idealan za ovu situaciju - sve što je potrebno je podijeliti početnu sliku u onoliko zona koliko ima niti. Imajte na umu da je prijelaz s jedne niti na dvije na našem dvojezgrenom CPU-u rezultirao gotovo linearnim ubrzanjem, što također ukazuje na paralelnu prirodu testnog programa. Sasvim neočekivano, verzija s četiri threada također se pokazala bržom, iako je to na našem procesoru vrlo čudno - naprotiv, mogao bi se očekivati ​​pad učinkovitosti zbog režijskih troškova upravljanja dodatnim threadovima. Kako se ovaj rezultat može objasniti? Teško je reći, ali Windows planer niti je možda kriv; u svakom slučaju ponavljamo rezultat. S manjim teksturama (512x512), dobitak od threadinga nije bio tako izražen (oko 35% u odnosu na 100%), a ponašanje verzije s četiri niti bilo je logičnije, bez povećanja u usporedbi s verzijom s dvije niti. GPU je i dalje bio brži, ali ne toliko zamjetno brži (8600M GT bio je tri puta brži od verzije s dvije niti).



Kliknite na sliku za povećanje.

Drugo značajno zapažanje je da je čak i najsporija GPU implementacija bila gotovo šest puta brža od CPU verzije s najboljim performansama. Za prvi program i neoptimiziranu verziju algoritma rezultat je vrlo ohrabrujući. Napominjemo da smo primili zamjetno najbolji rezultat na malim blokovima, iako intuicija može sugerirati drugačije. Objašnjenje je jednostavno - naš program koristi 14 registara po niti, a s blokovima od 256 niti, potrebno je 3584 registra po bloku, a potrebno je 768 niti za potpuno opterećenje procesora, kao što smo pokazali. U našem slučaju to iznosi tri bloka ili 10.572 registra. Ali multiprocesor ima samo 8.192 registra, tako da može držati samo dva bloka aktivnima. Nasuprot tome, s blokovima od 128 niti, potrebno nam je 1792 registra po bloku; Ako se 8,192 podijeli s 1,792 i zaokruži na najbliži cijeli broj, dobit ćemo četiri bloka. U praksi će broj niti biti isti (512 po multiprocesoru, iako je teoretski potrebno 768 za puno opterećenje), ali povećanje broja blokova daje GPU-u prednost fleksibilnosti u pristupu memoriji - kada postoji operacija s velika kašnjenja, možete započeti s izvršavanjem instrukcija iz drugog bloka dok čekate primitak rezultata. Četiri bloka jasno smanjuju latenciju, pogotovo jer naš program koristi višestruke pristupe memoriji.

Analiza

Konačno, unatoč onome što smo rekli gore, nismo mogli odoljeti iskušenju i pokrenuli smo program na 8800 GTX, koji je bio tri puta brži od 8600, bez obzira na veličinu bloka. Možda mislite da bi u praksi na pripadajućim arhitekturama rezultat bio četiri i više puta veći: 128 ALU/shader procesora naspram 32 i veći radni takt (1,35 GHz naspram 950 MHz), ali nije tako ispalo. Najvjerojatnije je ograničavajući faktor bio pristup memoriji. Da budemo precizniji, početnoj slici se pristupa kao višedimenzionalnom CUDA nizu - prilično složen izraz za ono što nije ništa više od teksture. Ali postoji nekoliko prednosti.

  • pristupi imaju koristi od predmemorije teksture;
  • koristimo način omotanja, u kojem nema potrebe za obradom granica slike, za razliku od CPU verzije.

Osim toga, možemo imati koristi od "besplatnog" filtriranja s normaliziranim adresiranjem između umjesto i , ali u našem slučaju to vjerojatno neće biti korisno. Kao što znate, 8600 ima 16 teksturnih jedinica, u usporedbi s 32 za 8800 GTX. Stoga je omjer između dvije arhitekture samo dva prema jedan. Dodajte ovome razliku u frekvencijama i dobit ćemo omjer (32 x 0,575) / (16 x 0,475) = 2,4 - blizu omjera "tri prema jedan" koji smo zapravo dobili. Ova teorija također objašnjava zašto se veličina bloka ne mijenja mnogo na G80, budući da ALU i dalje počiva na blokovima teksture.



Kliknite na sliku za povećanje.

Osim obećavajućih rezultata, naše prvo upoznavanje s CUDA-om prošlo je vrlo dobro s obzirom na ne baš najpovoljnije odabrane uvjete. Razvoj na Vista prijenosnom računalu znači da ćete morati koristiti CUDA SDK 2.0, još uvijek u beta verziji, s upravljačkim programom 174.55, koji je također beta. Unatoč tome, ne možemo izvijestiti o neugodnim iznenađenjima - samo o početnim pogreškama tijekom prvog otklanjanja pogrešaka kada je naš program s još uvijek velikim greškama pokušao adresirati memoriju izvan dodijeljenog prostora.

Monitor je počeo mahnito treperiti, zatim se ekran zacrnio... dok Vista nije pokrenula servis za popravak drajvera i sve je bilo u redu. Ali ipak je donekle iznenađujuće vidjeti ovo ako ste navikli vidjeti tipičnu grešku Segmentation Fault na standardnim programima poput našeg. Na kraju, mala kritika prema nVidia-i: u svoj dostupnoj dokumentaciji za CUDA-u ne postoji mali vodič koji bi vam korak po korak rekao kako postaviti razvojno okruženje za Visual Studio. Zapravo, to nije veliki problem budući da SDK ima pun skup primjera koje možete proučiti kako biste razumjeli okvir za CUDA aplikacije, ali vodič za početnike bi bio od pomoći.



Kliknite na sliku za povećanje.

Nvidia je predstavila CUDA s izdavanjem GeForce 8800. I u to vrijeme obećanja su se činila vrlo primamljivima, ali smo suzdržavali svoj entuzijazam dok ga nismo stvarno testirali. Doista, u to se vrijeme činilo više kao označavanje teritorija za ostanak na valu GPGPU-a. Bez dostupnog SDK-a, teško je reći da ovo nije samo još jedna marketinška glupost koja neće funkcionirati. Ovo nije prvi put da je dobra inicijativa prerano najavljena i da nije ugledala svjetlo dana zbog nedostatka podrške - pogotovo u tako konkurentnom sektoru. Sada, godinu i pol nakon objave, možemo sa sigurnošću reći da je nVidia održala riječ.

SDK se brzo pojavio u beta verziji početkom 2007. godine, a od tada je brzo ažuriran, što dokazuje važnost ovog projekta za nVidia. Danas se CUDA vrlo dobro razvija: SDK je već dostupan u beta verziji 2.0 za glavne operativne sustave (Windows XP i Vista, Linux, kao i 1.1 za Mac OS X), a nVidia je posvetila cijeli odjeljak stranice za programeri.

Na profesionalnijoj razini, dojam prvih koraka s CUDA-om pokazao se vrlo pozitivnim. Čak i ako ste upoznati s GPU arhitekturom, lako ćete to shvatiti. Kada API na prvi pogled izgleda jasno, odmah počnete vjerovati da ćete dobiti uvjerljive rezultate. Ali neće li se računalno vrijeme izgubiti zbog brojnih prijenosa s CPU-a na GPU? I kako koristiti ove tisuće niti bez primitivne sinkronizacije? Započeli smo naše eksperimente imajući na umu sve te brige. Ali brzo su se raspršili kada se prva verzija našeg algoritma, iako vrlo trivijalna, pokazala znatno bržom nego na CPU-u.

Stoga CUDA nije čarobni štapić za istraživače koji žele uvjeriti upravu sveučilišta da im kupi GeForce. CUDA je već potpuno dostupna tehnologija koju može koristiti svaki programer s znanjem C-a, sve dok je voljan uložiti vrijeme i trud da se navikne na novu programsku paradigmu. Ovaj trud neće biti uzalud ako su vaši algoritmi dobro paralelizirani. Također želimo zahvaliti nVidia na cjelovitoj i kvalitetnoj dokumentaciji u kojoj će CUDA programeri početnici pronaći odgovore.

Što CUDA treba da postane prepoznatljiv API? Jednom riječju: prenosivost. Znamo da je budućnost IT-a u paralelnom računalstvu - danas se već svi pripremaju za takve promjene, i sve inicijative, kako softverske tako i hardverske, usmjerene su u tom smjeru. Međutim, u ovom trenutku, ako pogledamo razvoj paradigmi, još smo u početnoj fazi: ručno stvaramo niti i pokušavamo planirati pristup zajednički resursi; Sve se to nekako može riješiti ako se broj jezgri može nabrojati na prste jedne ruke. Ali za nekoliko godina, kada se broj procesora bude brojao u stotinama, ta mogućnost više neće postojati. Izlaskom CUDA-e, nVidia je napravila prvi korak u rješavanju ovog problema – ali naravno ovu odluku Prikladno samo za GPU-ove ove tvrtke, ali čak ni tada ne za sve. Samo GF8 i 9 (i njihovi Quadro/Tesla derivati) danas mogu pokretati CUDA programe. I nova linija 260/280, naravno.



Kliknite na sliku za povećanje.

Nvidia se može pohvaliti da je prodala 70 milijuna CUDA-kompatibilnih GPU-ova diljem svijeta, ali to još uvijek nije dovoljno da postane de facto standard. Uzimajući u obzir činjenicu da konkurenti ne sjede prekriženih ruku. AMD nudi vlastiti SDK (Stream Computing), a Intel je najavio rješenje (Ct), iako još nije dostupno. Dolazi rat za standarde i očito neće biti mjesta na tržištu za tri konkurenta sve dok drugi igrač poput Microsofta ne izađe sa zajedničkim API-jem, koji će svakako olakšati život programerima.

Stoga nVidia ima mnogo poteškoća u dobivanju odobrenja za CUDA. Iako smo tehnološki nedvojbeno suočeni s uspješnim rješenjem, još uvijek preostaje uvjeriti programere u njegovu perspektivu - a to neće biti lako. Međutim, sudeći po mnogim nedavnim najavama i vijestima o API-ju, budućnost ne izgleda mračno.

– skup softverskih sučelja niske razine ( API) za stvaranje igara i drugih multimedijskih aplikacija visokih performansi. Uključuje podršku za visoke performanse 2D- I 3D-grafički, zvučni i ulazni uređaji.

Direct3D (D3D) – sučelje za prikaz trodimenzionalnih primitivci(geometrijska tijela). Uključen u .

OpenGL(s engleskog Otvori grafičku biblioteku, doslovno - otvorena grafička biblioteka) je specifikacija koja definira međuplatformsko programsko sučelje neovisno o programskom jeziku za pisanje aplikacija korištenjem dvodimenzionalne i trodimenzionalne računalne grafike. Uključuje više od 250 funkcija za crtanje složenih 3D scena iz jednostavnih primitiva. Koristi se za izradu videoigara, virtualne stvarnosti i vizualizacije u znanstvenom istraživanju. Na peronu Windows natječe se s .

OpenCL(s engleskog Otvoreni računalni jezik, doslovno – otvoreni jezik izračuna) – okvir(software system framework) za pisanje računalnih programa koji se odnose na paralelno računanje na različitim graficima ( GPU) i ( ). Do okvira OpenCL uključuje programski jezik i sučelje za programiranje aplikacije ( API). OpenCL pruža paralelizam na razini instrukcija i na razini podataka i implementacija je tehnike GPGPU.

GPGPU(skraćeno od engleskog) Jedinice za grafičku obradu opće namjene, doslovno – GPU opće namjene) je tehnika za korištenje grafičke procesorske jedinice (GPU) ili video kartice za opće računalstvo koju obično izvodi računalo.

Shader(Engleski) shader) – program za konstruiranje sjena na sintetiziranim slikama, koji se koristi u trodimenzionalnoj grafici za određivanje konačnih parametara objekta ili slike. Obično uključuje proizvoljno složene opise apsorpcije i raspršenja svjetla, mapiranja teksture, refleksije i loma, sjenčanja, pomaka površine i učinaka naknadne obrade. Složene površine mogu se vizualizirati pomoću jednostavnih geometrijskih oblika.

Renderiranje(Engleski) prikazivanje) – vizualizacija, in računalna grafika postupak dobivanja slike iz modela pomoću softvera.

SDK(skraćeno od engleskog) Komplet za razvoj softvera) – skup alata za razvoj softvera.

CPU(skraćeno od engleskog) Središnja procesorska jedinica, doslovno – središnji/glavni/glavni računalni uređaj) – središnji (mikro);uređaj koji izvršava strojne instrukcije; Dio hardver, odgovoran za izvođenje računskih operacija (navedeno operacijski sustav i aplikacijski softver) i koordiniranje rada svih uređaja.

GPU(skraćeno od engleskog) Jedinica za grafičku obradu, doslovno – grafički računalni uređaj) – grafički procesor; zaseban uređaj ili igraća konzola koja izvodi grafički prikaz (vizualizaciju). Moderni grafički procesori vrlo su učinkoviti u obradi i prikazivanju računalne grafike na realističan način. Grafički procesor u modernim video adapterima koristi se kao akcelerator 3D grafike, ali u nekim slučajevima može se koristiti i za izračune ( GPGPU).

Problemi CPU

Dugo se vrijeme povećanje performansi tradicionalnih uglavnom događalo zbog stalnog povećanja frekvencije takta (oko 80% performansi određeno je frekvencijom takta) uz istodobno povećanje broja tranzistora na jednom čipu. . Međutim, daljnje povećanje frekvencije takta (na frekvenciji takta većoj od 3,8 GHz, čipovi se jednostavno pregrijavaju!) nailazi na niz temeljnih fizičkih prepreka (budući da se tehnološki proces gotovo približio veličini atoma: , a veličina atoma silicija je približno 0,543 nm):

Prvo, kako se veličina kristala smanjuje, a frekvencija takta povećava, struja curenja tranzistora se povećava. To dovodi do povećane potrošnje energije i povećanih emisija topline;

Drugo, prednosti viših brzina takta djelomično su negirane latencijom pristupa memoriji, budući da vremena pristupa memoriji ne prate povećanje brzina takta;

Treće, za neke aplikacije tradicionalne serijske arhitekture postaju neučinkovite kako se brzine takta povećavaju zbog takozvanog "von Neumannovog uskog grla", ograničenja performansi koje proizlazi iz sekvencijalnog tijeka računanja. Istodobno se povećava kašnjenje otporno-kapacitivnog prijenosa signala, što je dodatno usko grlo povezano s povećanjem frekvencije takta.

Razvoj GPU

Paralelno s tim tekao je (i ide!) razvoj GPU:

studeni 2008. – Intel uveo liniju od 4 jezgre Intel Core i7, koji se temelje na mikroarhitekturi nove generacije Nehalem. Procesori rade na radnom taktu od 2,6-3,2 GHz. Izrađen 45nm procesnom tehnologijom.

Prosinac 2008. – počele su isporuke 4-jezgrenih AMD Phenom II 940(kodno ime - Deneb). Radi na frekvenciji od 3 GHz, proizvodi se 45-nm procesnom tehnologijom.

svibnja 2009. – tvrtka AMD predstavio GPU verziju ATI Radeon HD 4890 S taktna frekvencija jezgra povećana s 850 MHz na 1 GHz. Ovo je prvi grafički procesor koji radi na 1 GHz. Računalna snaga čipa, zahvaljujući povećanju frekvencije, porasla je s 1,36 na 1,6 teraflopa. Procesor sadrži 800 (!) računalnih jezgri i podržava video memoriju GDDR5, DirectX 10.1, ATI CrossFireX i sve druge inherentne tehnologije moderni modeli video kartice Čip je proizveden na bazi 55 nm tehnologije.

Glavne razlike GPU

Prepoznatljive značajke GPU(u usporedbi sa ) su:

– arhitektura koja je maksimalno usmjerena na povećanje brzine proračuna tekstura i složenih grafičkih objekata;

– tipična vršna snaga GPU mnogo viši od toga ;

– zahvaljujući specijaliziranoj transportnoj arhitekturi, GPU mnogo učinkovitiji u obradi grafičke informacije, kako .

"Kriza žanra"

»Kriza žanra« za sazrijevali do 2005. - tada su se pojavili. No, unatoč razvoju tehnologije, povećanje produktivnosti konvencionalnih osjetno smanjio. U isto vrijeme performanse GPU nastavlja rasti. Tako se do 2003. iskristalizirala ova revolucionarna ideja - koristite računalnu snagu grafike za svoje potrebe. GPU-ovi se sve više koriste za "negrafičko" računalstvo (fizička simulacija, obrada signala, računalna matematika/geometrija, operacije baze podataka, računalna biologija, računalna ekonomija, računalni vid, itd.).

Glavni problem je bio što nije postojalo standardno programsko sučelje GPU. Programeri su koristili OpenGL ili Direct3D, ali bilo je vrlo zgodno. Korporacija NVIDIA(jedan od najvećih proizvođača grafičkih, medijskih i komunikacijskih procesora, kao i bežičnih medijskih procesora; osnovan 1993.) počeo je razvijati objedinjeni i praktični standard - i predstavio tehnologiju CUDA.

Kako je počelo

2006 – NVIDIA demonstrira CUDA™; početak revolucije u računalstvu GPU.

2007. – NVIDIA oslobađa arhitekturu CUDA(Originalna verzija CUDA SDK predana je 15. veljače 2007.); nominacija" Najbolji novi proizvod» iz časopisa Popularna znanost i "Izbor čitatelja" iz publikacije HPCWire.

2008 – tehnologija NVIDIA CUDA osvojio je kategoriju “Tehnička izvrsnost” od PC magazin.

Što se dogodilo CUDA

CUDA(skraćeno od engleskog) Compute Unified Device Architecture, doslovno - unificirana računalna arhitektura uređaja) - arhitektura (skup softvera i hardvera) koja vam omogućuje proizvodnju na GPU izračuni opće namjene, dok GPU zapravo djeluje kao snažan koprocesor.

Tehnologija NVIDIA CUDA™ je jedino razvojno okruženje u programskom jeziku C, koji programerima omogućuje stvaranje softvera koji rješava složene računalne probleme u kraćem vremenu, zahvaljujući procesorskoj snazi ​​GPU-a. Milijuni ljudi već rade u svijetu GPU uz podršku CUDA, a tisuće programera već koriste (besplatne!) alate CUDA za ubrzavanje aplikacija i rješavanje najsloženijih zadataka koji zahtijevaju velike resurse - od video i audio kodiranja do istraživanja nafte i plina, modeliranja proizvoda, medicinskog snimanja i znanstvenog istraživanja.

CUDA daje programeru mogućnost, prema vlastitom nahođenju, organizirati pristup skupu uputa grafičkog akceleratora i upravljati njegovom memorijom te organizirati složene paralelne izračune na njemu. Podrška za grafički akcelerator CUDA postaje moćna programabilna otvorena arhitektura, slična današnjoj . Sve to razvojnom programeru omogućuje nisku razinu, distribuirani i brzi pristup izradi hardvera CUDA neophodna osnova za izgradnju ozbiljnih alata visoke razine, kao što su kompajleri, debuggeri, matematičke knjižnice i softverske platforme.

Uralsky, vodeći tehnološki stručnjak NVIDIA, uspoređujući GPU I , kaže ovo: “ - Ovo je SUV. Vozi uvijek i svugdje, ali ne baš brzo. A GPU- Ovo je sportski auto. Na lošoj cesti jednostavno neće nikamo, ali dajte mu dobru podlogu i pokazat će svu svoju brzinu o kakvoj SUV nije ni sanjao!..”

Tehnološke mogućnosti CUDA

Jezgre CUDAsimbol skalarne računske jedinice u video čipovima NVidia, počevši od G 80 (GeForce 8 xxx, Tesla C-D-S870, FX4/5600 , 360M). Sami čipovi su derivati ​​arhitekture. Usput, jer tvrtka NVidia pa se rado prihvatio razvoja vlastitih procesora Serija Tegra, također na temelju RISC arhitektura. Imam puno iskustva u radu s tim arhitekturama.

CUDA jezgra sadrži jednu jedan vektor I jedan skalar jedinice koje izvode jednu vektorsku i jednu skalarnu operaciju po taktu, prenoseći izračune na drugi multiprocesor ili na drugi za daljnju obradu. Niz od stotina i tisuća takvih jezgri predstavlja značajnu računalnu snagu i može obavljati različite zadatke ovisno o zahtjevima, pod uvjetom da postoji određeni prateći softver. Primjena može varirati: dekodiranje video streama, ubrzanje 2D/3D grafike, računalni oblak, specijalizirane matematičke analize itd.

Često i kombinirano profesionalni NVidia kartice Tesla I NVidia Quadro, okosnica su modernih superračunala.

CUDA— jezgre od tada nisu pretrpjele značajnije promjene G 80, ali njihov broj raste (zajedno s ostalim blokovima - ROP, Jedinice teksture& itd) i učinkovitosti paralelnih međusobnih interakcija (moduli su poboljšani Giga nit).

npr.:

GeForce

GTX 460 – 336 CUDA jezgri
GTX 580 – 512 CUDA jezgri
8800GTX – 128 CUDA jezgri

Od broja stream procesora ( CUDA), izvedba u izračunima shadera raste gotovo proporcionalno (s ravnomjernim povećanjem broja ostalih elemenata).

Počevši od čipa GK110 (NVidia GeForce GTX 680) — CUDA jezgre više nemaju dvostruku frekvenciju, već zajedničku sa svim ostalim blokovima čipova. Umjesto toga, njihov je broj povećan za otprilike tri puta u odnosu na prethodnu generaciju G110.

Prema Darwinovoj teoriji evolucije, prvi majmun (if
točnije - homo antecessor, ljudski prethodnik) kasnije pretvoren u
u nama. Višetonski računalni centri s tisuću ili više radio cijevi,
koja su zauzimala čitave sobe zamijenjena su prijenosnim računalima od pola kilograma, koja su, usput rečeno,
neće biti inferiorni u izvedbi od prvog. Pretpotopni pisaći strojevi postali su
u ispisivanju bilo čega i na bilo što (čak i na ljudsko tijelo)
multifunkcionalni uređaji. Procesorski divovi odjednom su odlučili zazidati
grafička jezgra u "kamenu". I video kartice su počele ne samo prikazivati ​​sliku
prihvatljiv FPS i kvalitetu grafike, ali i obavljati sve vrste izračuna. Da
još kako proizvoditi! Raspravljat će se o tehnologiji višenitnog računalstva pomoću GPU-a.

Zašto GPU?

Pitam se zašto su odlučili svu računalnu snagu prenijeti na grafiku
adapter? Kao što vidite, procesori su još uvijek u modi i malo je vjerojatno da će odustati od svoje topline
mjesto. Ali GPU ima nekoliko aseva u rukavu, zajedno s jokerom i nekoliko rukava
dovoljno. Moderni središnji procesor dizajniran je za postizanje maksimuma
performanse pri obradi cjelobrojnih podataka i podataka s pomičnim zarezom
zarez, bez posebne brige o paralelnoj obradi informacija. Na isti
vrijeme, arhitektura video kartice omogućuje vam brzo i bez problema "paralelizaciju"
Obrada podataka. S jedne strane, izračunavaju se poligoni (zbog 3D pokretne trake),
s druge strane, obrada teksture piksela. Jasno je da postoji „harmoničan
kvar opterećenja u jezgri kartice. Osim toga, performanse memorije i video procesora
optimalniji od kombinacije "RAM-cache-procesor". U trenutku kada jedinica podataka
u video kartici počinje obrađivati ​​jedan GPU stream procesor, drugi
jedinica se učitava paralelno u drugu, i to je, u načelu, lako postići
GPU opterećenje usporedivo s propusnošću sabirnice,
međutim, da bi se to dogodilo, transporteri moraju biti jednoliko opterećeni, bez
sve uvjetne prijelaze i grananja. Središnji procesor, zahvaljujući svom
svestranost zahtijeva punu predmemoriju za potrebe obrade
informacija.

Stručnjaci su razmišljali o radu GPU-a u paralelnom računanju i
matematike i došao do teorije da su mnogi znanstveni izračuni u mnogočemu slični
Obrada 3D grafike. Mnogi stručnjaci smatraju da je temeljni faktor u
razvoj GPGPU (Računanje opće namjene na GPU-u – univerzalno
proračuni pomoću video kartice
) bila je pojava projekta Brook GPU 2003. godine.

Tvorci projekta sa Sveučilišta Stanford morali su riješiti težak problem
problem: hardver i softver za prisiljavanje grafičkog adaptera na proizvodnju
raznolike kalkulacije. I uspjeli su. Koristeći generički jezik C,
Američki znanstvenici učinili su da GPU radi kao procesor, prilagođen za
paralelna obrada. Nakon Brooka pojavio se niz projekata o VGA izračunima,
poput knjižnice akceleratora, knjižnice Brahma, sustava
GPU++ metaprogramiranje i drugi.

CUDA!

Predosjećaj perspektive razvoja prisilio je AMD I NVIDIA
uhvatiti se za Brook GPU kao pit bull. Ako izostavimo marketinšku politiku, dakle
Ispravnom implementacijom svega možete se učvrstiti ne samo u grafičkom sektoru
tržištu, ali iu računalstvu (pogledajte posebne računalne kartice i
poslužitelji Tesla sa stotinama multiprocesora), istiskujući uobičajene procesore.

Naravno, “FPS lordovi” su se razišli na kamenu spoticanja, svaki na svoj način.
put, ali je osnovni princip ostao nepromijenjen - napraviti izračune
koristeći GPU. A sada ćemo pobliže pogledati "zelenu" tehnologiju - CUDA
(Compute Unified Device Architecture).

Posao naše "heroine" je pružiti API, dva odjednom.
Prvi je na visokoj razini, CUDA Runtime, koji predstavlja funkcije koje
rastavljaju se na jednostavnije razine i prosljeđuju nižem API-ju - CUDA Driver. Tako
da je izraz "visoka razina" pretjeran za primjenu na proces. Sva je sol
točno u upravljačkom programu, a ljubazno stvorene biblioteke pomoći će vam da ga dobijete
programeri NVIDIA: CUBLAS (alati za matematičke proračune) i
FFT (izračun korištenjem Fourierovog algoritma). Pa, prijeđimo na praktičnost
dijelovi materijala.

CUDA terminologija

NVIDIA radi s vrlo jedinstvenim definicijama za CUDA API. Oni
razlikuju od definicija koje se koriste za rad sa središnjim procesorom.

Nit– skup podataka koje je potrebno obraditi (ne
zahtijeva velike procesne resurse).

Warp– grupa od 32 niti. Podaci se samo obrađuju
warps, stoga je warp minimalna količina podataka.

Blok– skup tokova (od 64 do 512) ili skup
osnove (od 2 do 16).

Mreža je zbirka blokova. Ova podjela podataka
koristi se isključivo za poboljšanje performansi. Dakle, ako broj
multiprocesori veliki, tada će se blokovi izvršavati paralelno. Ako sa
nema sreće s karticom (programeri preporučuju korištenje
adapter koji nije niži od GeForce 8800 GTS 320 MB), tada će se podatkovni blokovi obraditi
sekvencijalno.

NVIDIA također uvodi koncepte kao što su zrno, domaćin
I uređaj.

radimo!

Za potpuni rad sa CUDA-om potrebno vam je:

1. Poznavati strukturu GPU shader jezgri, od suštine programiranja
sastoji se u ravnomjernoj raspodjeli opterećenja između njih.
2. Znati programirati u C okruženju, uzimajući u obzir neke aspekte.

Programeri NVIDIA nekoliko puta otkrio "unutrašnjost" video kartice
drugačije nego što smo navikli vidjeti. Dakle, htjeli-ne htjeli, morat ćete sve proučiti
suptilnosti arhitekture. Pogledajmo strukturu legendarnog "kamena" G80 GeForce 8800
GTX
.

Jezgra shadera sastoji se od osam TPC (Texture Processor Cluster) klastera
procesori teksture (dakle, GeForce GTX 280– 15 jezgri, 8800 GTS
ima ih šest 8600 – četiri, itd.). Oni se pak sastoje od dva
strujni multiprocesori (dalje u tekstu SM). SM (svi oni
16) sastoji se od prednjeg dijela (rješava probleme čitanja i dekodiranja instrukcija) i
back end (konačni izlaz instrukcija) cjevovoda, kao i osam skalarnih SP (shader
procesor) i dvije SFU (superfunkcionalne jedinice). Za svaki otkucaj (jedinica
vrijeme) front end odabire warp i obrađuje ga. Tako da sav warp teče
(da vas podsjetim, ima ih 32) obrađenih, potrebno je 32/8 = 4 ciklusa na kraju transportne trake.

Svaki multiprocesor ima ono što se naziva zajednička memorija.
Veličina mu je 16 kilobajta i daje programeru potpunu slobodu
akcije. Podijelite po želji :). Zajednička memorija omogućuje komunikaciju između niti
jedan blok i nije namijenjen za rad s pixel shaderima.

SM također mogu pristupiti GDDR-u. Da bi to učinili, dobili su po 8 kilobajta.
cache memorija koja pohranjuje sve najvažnije stvari za rad (npr. računalstvo
konstante).

Multiprocesor ima 8192 registra. Broj aktivnih blokova ne može biti
više od osam, a broj zavoja nije veći od 768/32 = 24. Iz ovoga je jasno da G80
može obraditi maksimalno 32*16*24 = 12288 niti po jedinici vremena. Ne možete pomoći ali
uzmite u obzir ove brojke kada optimizirate program u budućnosti (na jednoj ljestvici
– veličina bloka, s druge strane – broj niti). Ravnoteža parametara može igrati ulogu
važnu ulogu u budućnosti, dakle NVIDIA preporučuje korištenje blokova
sa 128 ili 256 niti. Blok od 512 niti je neučinkovit jer ima
povećana kašnjenja. Uzimajući u obzir sve suptilnosti strukture GPU video kartice plus
dobre vještine programiranja, možete stvoriti vrlo produktivne
alat za paralelno računanje. Usput, o programiranju...

Programiranje

Za “kreativnost” sa CUDA-om trebate GeForce video kartica nije niža
epizoda osma
. S

službenoj stranici morate preuzeti tri programska paketa: upravljački program s
CUDA podrška (svaki OS ima svoj), sam CUDA SDK paket (drugi
beta verzija) i dodatne biblioteke (CUDA toolkit). Tehnologija podržava
operativni sustavi Windows (XP i Vista), Linux i Mac OS X. Učiti I
odabrao Vista Ultimate Edition x64 (gledajući unaprijed, reći ću da se sustav ponašao
Baš odlično). U vrijeme pisanja ovih redaka bilo je relevantno za posao
ForceWare drajver 177.35. Koristi se kao set alata
Softverski paket Borland C++ 6 Builder (iako svako okruženje koje radi s
jezik C).

Osobi koji zna jezik, lako će se naviknuti na novu sredinu. Sve što je potrebno je
zapamtite osnovne parametre. Ključna riječ _global_ (stavljena ispred funkcije)
označava da funkcija pripada jezgri. Pozvat će je centrala
procesor, a sav posao odvijat će se na GPU-u. _Globalni_ poziv zahtijeva više
specifični detalji, naime veličina mreže, veličina bloka i kakva će jezgra biti
primijeniti. Na primjer, linija _global_ void saxpy_parallel<<>>, gdje je X –
veličina mreže, a Y je veličina bloka, određuje ove parametre.

Simbol _device_ znači da će funkciju pozvati grafička jezgra, također poznata kao
slijedit će sve upute. Ova se funkcija nalazi u memoriji multiprocesora,
stoga je nemoguće dobiti njezinu adresu. Prefiks _host_ znači da poziv
a obrada će se odvijati samo uz sudjelovanje CPU-a. Mora se uzeti u obzir da _globalno_ i
_uređaji_ ne mogu pozivati ​​jedan drugoga i ne mogu pozivati ​​sami sebe.

Također, jezik za CUDA ima brojne funkcije za rad s video memorijom: cudafree
(oslobađanje memorije između GDDR-a i RAM-a), cudamemcpy i cudamemcpy2D (kopiranje
memorija između GDDR-a i RAM-a) i cudamalloc (dodjela memorije).

Svi programski kodovi kompilirani su pomoću CUDA API-ja. Prvo se uzima
kod namijenjen isključivo za središnji procesor, te je izložen
standardna kompilacija i drugi kod namijenjen grafičkom adapteru
prepisan u međujezik PTX (slično asembleru) za
identificirajući moguće greške. Nakon svih ovih “plesova” finale
prijevod (prijevod) naredbi na jezik razumljiv za GPU/CPU.

Komplet za učenje

Gotovo svi aspekti programiranja opisani su u dokumentaciji koja ide
zajedno s upravljačkim programom i dvije aplikacije, kao i na web stranici programera. Veličina
članak nije dovoljan da ih opiše (zainteresirani čitatelj treba priložiti
malo truda i sami proučite gradivo).

CUDA SDK Browser razvijen je posebno za početnike. Svatko može
osjetite snagu paralelnog računanja iz prve ruke (najbolji test za
stabilnost – primjeri rade bez artefakata ili rušenja). Aplikacija ima
veliki broj indikativnih mini programa (61 “test”). Za svako iskustvo ima
detaljna dokumentacija programski kod plus PDF datoteke. Odmah se vidi da ljudi
prisutni sa svojim kreacijama u pregledniku rade ozbiljan posao.
Također možete usporediti brzinu procesora i video kartice tijekom obrade
podaci. Na primjer, skeniranje višedimenzionalnih nizova s ​​video karticom GeForce 8800
GT
Proizvodi 512 MB s blokom od 256 niti u 0,17109 milisekundi.
Tehnologija ne prepoznaje SLI tandeme, pa ako imate duo ili trio,
onemogućite funkciju "uparivanja" prije rada, inače će CUDA vidjeti samo jedan
uređaj Dvostruka jezgra AMD Athlon 64 X2(frekvencija jezgre 3000 MHz) isto iskustvo
prolazi za 2,761528 milisekundi. Ispada da je G92 više od 16 puta
brži od kamena AMD! Kao što vidite, ovo je daleko od ekstremnog sustava
u tandemu s operativnim sustavom kojeg mase ne vole pokazuje dobro
rezultate.

Osim preglednika postoji niz programa korisnih za društvo. Adobe
je svoje proizvode prilagodio nova tehnologija. Sada je Photoshop CS4 pun
najmanje koristi resurse grafički adapteri(morate preuzeti poseban
uključiti). S programima kao što su Badaboom media converter i RapiHD možete
dekodirati video u MPEG-2 format. Dobar za obradu zvuka
učinit će besplatni uslužni program Accelero. Količina softvera prilagođenog za CUDA API,
će nedvojbeno rasti.

A u ovo doba...

U međuvremenu, vi čitate ovaj materijal, vrijedni radnici iz koncerna procesora
razvijaju vlastite tehnologije za integraciju GPU-a u CPU. Izvana AMD svi
jasno je: imaju golemo iskustvo stečeno uz ATI.

Stvaranje "mikrouređaja", Fusion, sastojat će se od nekoliko jezgri ispod
kodnog naziva Bulldozer i video čipa RV710 (Kong). Njihov će odnos biti
provodi putem poboljšane HyperTransport sabirnice. Ovisno o
broj jezgri i njihove frekvencijske karakteristike AMD planira stvoriti cjelokupnu cijenu
hijerarhija "kamenja". Planirana je i proizvodnja procesora za prijenosna računala (Falcon),
i za multimedijske gadgete (Bobcat). Štoviše, to je primjena tehnologije
u prijenosnim uređajima bit će prvi izazov za Kanađane. S razvojem
paralelno računanje, korištenje takvog "kamenja" trebalo bi biti vrlo popularno.

Intel malo kasni s vremenom sa svojim Larrabeejem. Proizvodi AMD,
ako se ništa ne dogodi, pojavit će se na policama trgovina krajem 2009. - početkom
2010. A neprijateljeva će odluka izaći na vidjelo tek za skoro dva
godine.

Larrabee će imati veliki broj (čitaj: stotine) jezgri. Na početku
Također će biti proizvoda dizajniranih za 8 – 64 jezgre. Vrlo su slični Pentiumu, ali
dosta jako prerađen. Svaka jezgra ima 256 kilobajta L2 predmemorije
(njegova veličina će se vremenom povećavati). Odnos će se odvijati kroz
1024-bitna dvosmjerna prstenasta sabirnica. Intel kaže da će njihovo "dijete" biti
savršeno rade s DirectX i Open GL API-jem (za Appleove programere), tako da br
nije potrebna intervencija softvera.

Zašto sam ti sve ovo rekao? Očito je da Larrabee i Fusion neće istisnuti
obične, stacionarne procesore s tržišta, kao što neće biti istisnuti s tržišta
video kartice. Za igrače i entuzijaste ekstremnih sportova, ultimativni san će i dalje ostati
višejezgreni CPU i tandem nekoliko vrhunskih VGA. Ali što čak
procesorske tvrtke prelaze na paralelno računanje na temelju načela
slično kao GPGPU, govori puno. Konkretno, o čemu takvom
tehnologija poput CUDA ima pravo postojati i, najvjerojatnije, i hoće
jako popularno.

Kratak sažetak

Paralelno računanje pomoću video kartice samo je dobar alat
u rukama marljivog programera. Teško procesori vođeni Mooreovim zakonom
doći će kraj. Tvrtke NVIDIA još je dug put do njega
promovirajući svoj API u masama (isto se može reći i za zamisao ATI/AMD).
Kakva će biti, pokazat će budućnost. Dakle, CUDA će se vratiti :).

p.s. Preporučam programerima početnicima i zainteresiranima da posjete
sljedeće „virtualne ustanove”:

NVIDIA službena web stranica i web stranica
GPGPU.com. svi
pružene informacije su uključene Engleski jezik, ali barem hvala što nisi
kineski Dakle, samo naprijed! Nadam se da vam je autor barem malo pomogao
uzbudljiva putovanja u CUDA istraživanje!