CUDA

From Wikipedia, the free encyclopedia

CUDA
Remove ads

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.

Thumb
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 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]

Remove ads

Ajalugu

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]

More information Väljalaskeaeg ...
Remove ads

Kasutamine

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]

Remove ads

CUDA arhitektuuri praegused ja tuleviku kasutusalad

  • 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

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]
Remove ads

Piirangud

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

Toetatud GPU-d

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

More information Nvidia GeForce, Nvidia GeForce Mobile ...

Toetatud mudelite nimekiri on nähtav Nvidia kodulehel.

Remove ads

Näide

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;
   }
}
Remove ads

Sarnased tehnoloogiad

  • ATI Stream
  • OpenCL
  • Larrabee (Intel)

Vaata ka

Viited

Välislingid

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads