CUDA

Allikas: Vikipeedia
CUDA tööpõhimõte: 1) andmed kopeeritakse põhimälust GPU mällu, 3) CPU saadab protsessi GPU-sse, 3) GPU töötleb andmeid igas tuumas paralleelselt, 4) tulemus kopeeritakse GPU mälust põhimällu

CUDA (Compute Unified Device Architecture) on NVIDIA loodud paralleelarvutuse platvorm ja programmeerimismudel, mis võimaldab märkimisväärset kasvu andmetöötluse jõudluses, kasutades selleks graafikaprotsessorit.[1] Uusimad Nvidia graafikaprotsessorid saavad CUDA tehnoloogiat kasutades liigipääsu sarnasele arvutustehnoloogiale nagu protsessorid. Erinevalt protsessoritest on aga graafikaprotsessoritel paralleelse läbilaskvusega arhitektuur, mis keskendub paljude käskude täitmisele samaaegselt, mitte üksikute käskude täitmisele kiirelt. Seesugused üldotstarbelisi probleeme lahendavad graafikaprotsessorid on tuntud nimega GPGPU (General-purpose graphics processing unit) ehk üldotstarbeline GPU.

CUDA on kasutust leidnud tuhandetes rakendustes ja seda on käsitletud paljudes teadustöödes. Arvutimängude tööstuses kasutatakse graafikaprotsessoreid lisaks graafika renderdamisele veel ka mängusisese füüsika arvutamiseks (füüsilised efektid nagu praht, suits, tuli, vedelikud). Lisaks kasutatakse CUDA tehnoloogiat ka mittegraafiliste rakenduste kiirendamiseks arvutuslikus bioloogias, krüptograafias, astronoomias, keemias, füüsikas ja muudeski valdkondades.[2]

Ajalugu[muuda | muuda lähteteksti]

CUDA projekt kuulutati välja 2006. aasta novembris. Esimene CUDA tarkvaraarenduskomplekt avalikustati 15. veebruaril 2007 Microsoft Windowsile ja Linuxile. Mac OS X tugi lisati hiljem versioonis 2.0.

Versioonid[3][muuda | muuda lähteteksti]

CUDA versioon Väljalaskeaeg
1.0 juuni 2007
1.1 detsember 2007
2.0 august 2008
2.1 jaanuar 2009
2.2 mai 2009
2.3 juuni 2009
3.0 märts 2010
3.1 juuni 2010
3.2 november 2010
4.0 mai 2011
4.1 jaanuar 2012
5.0 oktoober 2012
5.5 juuli 2013
6.0 aprill 2014
6.5 august 2014
7.0 märts 2015
7.5 september 2015

Kasutamine[muuda | muuda lähteteksti]

CUDA annab arendajatele ligipääsu virtuaalsele käsustikule ning paralleelarvutuselementide mälule CUDA graafikaprotsessorites. Lihtsaim viis CUDA kasutamise alustamiseks on alla laadida CUDA Toolkit, mis sisaldab kõiki vajalikke tööriistu C ja C++ arendajatele.

CUDA on saadaval ka paljude teiste programmeerimiskeelte jaoks nagu näiteks Fortran, Haskell, Python, Java, Perl, Ruby jt. Selleks et kasutada CUDAt teistes programmeerimiskeeltes, tuleb alla laadida sobiv laienduspakett.

CUDA kasutamise kohta on saadaval hulgaliselt abimaterjale ning veebipõhiseid kursuseid.[4]

CUDA arhitektuuri praegused ja tuleviku kasutusalad[muuda | muuda lähteteksti]

  • Senisest kiirem 3D-graafika renderdamine.
  • Senisest kiirem videofailivormingute teisendamine.
  • Senisest kiirem krüpteerimine, dekodeerimine ja pakkimine.
  • Võimalikud on meditsiinilise analüüsi simulatsioonid, näiteks MRI-piltide põhjal loodud virtuaalreaalsus.
  • Võimalikud on füüsilised simulatsioond, näiteks vedelike dünaamika.

[5]

Eelised[muuda | muuda lähteteksti]

CUDA tehnoloogial on traditsiooniliste üldotstarbeliste graafikaprotsessorite ees järgmised eeliseid:

  • hajutatud lugemine – koodi saab mälust lugeda suvalistelt aadressidelt;
  • jagatud mälu – kiire jagatud mälu piirkond (kuni 48 KB multiprotsessori kohta);
  • CUDA rakenduste programmeerimisliides põhineb laiendustega standardsel C-keelel;
  • senisest efektiivsem andmeteedastus süsteemi ja videomälu vahel.[6]

Piirangud[muuda | muuda lähteteksti]

  • Puuduvad rekursiivsed funktsioonid.
  • Puudub tekstuuri renderdamise tugi.
  • Kasutatav vaid Nvidia graafikaprotsessorites.

Toetatud GPU-d[muuda | muuda lähteteksti]

CUDA töötab kõikide Nvidia graafikaprotsessoritega alates G8x seeriast, sealhulgas ka GeForce, Quadro ja Tesla seeria kaartidega.

Nvidia GeForce
GeForce GTX 690
GeForce GTX 680
GeForce GTX 670
GeForce GTX 660 Ti
GeForce GTX 660
GeForce GTX 650 Ti
GeForce GTX 650
GeForce GT 640
GeForce GTX 590
GeForce GTX 580
GeForce GTX 570
GeForce GTX 560 Ti
GeForce GTX 560
GeForce GTX 550 Ti
GeForce GT 520
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GTX 460 SE
GeForce GTS 450
GeForce GT 440
GeForce GT 430
GeForce GT 420
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GTS 240
GeForce GT 240
GeForce GT 220
GeForce 210/G210
GeForce GT 140
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 9100 mGPU
GeForce 8800 Ultra
GeForce 8800 GTX
GeForce 8800 GTS
GeForce 8800 GT
GeForce 8800 GS
GeForce 8600 GTS
GeForce 8600 GT
GeForce 8600 mGT
GeForce 8500 GT
GeForce 8400 GS
GeForce 8300 mGPU
GeForce 8200 mGPU
GeForce 8100 mGPU
Nvidia GeForce Mobile
GeForce GTX 680MX
GeForce GTX 680M
GeForce GTX 675MX
GeForce GTX 670MX
GeForce GTX 660M
GeForce GT 650M
GeForce GT 645M
GeForce GT 640M
GeForce GTX 580M
GeForce GTX 570M
GeForce GTX 560M
GeForce GT 555M
GeForce GT 550M
GeForce GT 540M
GeForce GT 525M
GeForce GT 520M
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 260M
GeForce GTS 250M
GeForce GT 335M
GeForce GT 330M
GeForce GT 325M
GeForce GT 320M
GeForce 310M
GeForce GT 240M
GeForce GT 230M
GeForce GT 220M
GeForce G210M
GeForce GTS 160M
GeForce GTS 150M
GeForce GT 130M
GeForce GT 120M
GeForce G110M
GeForce G105M
GeForce G103M
GeForce G102M
GeForce G100
GeForce 9800M GTX
GeForce 9800M GTS
GeForce 9800M GT
GeForce 9800M GS
GeForce 9700M GTS
GeForce 9700M GT
GeForce 9650M GT
GeForce 9650M GS
GeForce 9600M GT
GeForce 9600M GS
GeForce 9500M GS
GeForce 9500M G
GeForce 9400M G
GeForce 9300M GS
GeForce 9300M G
GeForce 9200M GS
GeForce 9100M G
GeForce 8800M GTX
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600M GS
GeForce 8400M GT
GeForce 8400M GS
GeForce 8400M G
GeForce 8200M G
Nvidia Quadro
Quadro K5000
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 3800
Quadro FX 3700
Quadro FX 1800
Quadro FX 1700
Quadro FX 580
Quadro FX 570
Quadro FX 380
Quadro FX 370
Quadro NVS 510
Quadro NVS 450
Quadro NVS 420
Quadro NVS 295
Quadro Plex 1000 Model IV
Quadro Plex 1000 Model S4
Nvidia Quadro Mobile
Quadro K5000M
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 320M
Quadro NVS 160M
Quadro NVS 150M
Quadro NVS 140M
Quadro NVS 135M
Quadro NVS 130M
Nvidia Tesla
Tesla K20X
Tesla K20
Tesla K10
Tesla C2050/2070
Tesla M2050/M2070
Tesla S2050
Tesla S1070
Tesla M1060
Tesla C1060
Tesla C870
Tesla D870
Tesla S870

Toetatud mudelite nimekiri on nähtav Nvidia kodulehel.

Näide[muuda | muuda lähteteksti]

Näidiskood C++ keeles, mis laadib pildilt tekstuuri GPU massiivi.

texture<float, 2, cudaReadModeElementType> tex;

void foo()
{
  cudaArray* cu_array;

  cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
  cudaMallocArray(&cu_array, &description, width, height);

  cudaMemcpyToArray(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice);

  tex.addressMode[0] = cudaAddressModeClamp;
  tex.addressMode[1] = cudaAddressModeClamp;
  tex.filterMode = cudaFilterModePoint;
  tex.normalized = false; // do not normalize coordinates

  cudaBindTextureToArray(tex, cu_array);

  dim3 blockDim(16, 16, 1);
  dim3 gridDim((width + blockDim.x - 1)/ blockDim.x, (height + blockDim.y - 1) / blockDim.y, 1);
  kernel<<< gridDim, blockDim, 0 >>>(d_data, height, width);

  cudaUnbindTexture(tex);
} //end foo()

__global__ void kernel(float* odata, int height, int width)
{
   unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
   unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
   if (x < width && y < height) {
      float c = tex2D(tex, x, y);
      odata[y*width+x] = c;
   }
}

Sarnased tehnoloogiad[muuda | muuda lähteteksti]

Vaata ka[muuda | muuda lähteteksti]

Viited[muuda | muuda lähteteksti]

Välislingid[muuda | muuda lähteteksti]