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]
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.
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
Näidiskood C++ keeles, mis laadib pildilt tekstuuri GPU massiivi.
texture<float,2,cudaReadModeElementType>tex;voidfoo(){cudaArray*cu_array;cudaChannelFormatDescdescription=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 coordinatescudaBindTextureToArray(tex,cu_array);dim3blockDim(16,16,1);dim3gridDim((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__voidkernel(float*odata,intheight,intwidth){unsignedintx=blockIdx.x*blockDim.x+threadIdx.x;unsignedinty=blockIdx.y*blockDim.y+threadIdx.y;if(x<width&&y<height){floatc=tex2D(tex,x,y);odata[y*width+x]=c;}}