CUDA
From Wikipedia, the free encyclopedia
Remove ads
CUDA (engl. ) je platforma za paralelnu obradu koju je kreirala Nvidia, i implementirana je na grafičkim procesorima koje oni proizvode.[1] CUDA daje programerima direktan pristup virtuelnom skupu instrukcija i memoriji za paralelnu obradu u GPU.
Pomoću CUDA platforme, GPU se može koristiti i za generalno programiranje, a ne samo za grafiku. Ovaj pristup je poznat kao GPGPU (eng. General-purpose computing on graphics processing units). Za razliku od CPU, GPU poseduje paralelnost kroz arhitekturu koja naglašava izvršavanje više konkurentnih niti sporije, umesto izvršavanja jedne niti veoma brzo.
CUDA platforma je dostupna programerima kroz CUDA biblioteke, kompajlerske direktive, i ekstenzije programskih jezika C, C++ i Fortran. C/C++ programeri koriste 'CUDA C/C++', kompajler sa "nvcc", LLVM C/C++ kompajlerom.[2]
Osim biblioteka, direktiva, CUDA C/C++ i CUDA Fortran, CUDA platforma podržava i druge interfejse kao što su OpenCL, Microsoft DirectCompute (interfejs koji je deo DirectX SDK) i C++ AMP.[3]
U industriji računarskih igara, GPU se osim za grafičko renderovanje koristi i za matematička izračunavanja u fizici za efekte poput vatre, dima, i dinamike fluida. CUDA se za ovu svrhu koristi u NVIDIA PhysX i Bullet fizičkim mašinama. Osim u video igrama, CUDA se također koristi i za ubrzavanje izračunavanja u biologiji, kriptografiji i drugim naučnim poljima sa intenzivnom primenom matematičkih izračunavanja.[4][5][6][7][8]
CUDA obezbeđuje API niskog nivoa, kao i API visokog nivoa. Prva verzija CUDA SDK je predstavljena 15. Februara 2007. za Microsoft Windows i Linux. Mac OS X podrška je dodana kasnije u verziji 2.0.[9] CUDA radi na svim Nvidia GPU počevši od G8x serije, Nvidia GeForce, Nvidia Quadro i Nvidia Tesla brendovima.
1. Kopiranje podataka iz glavne memorije u GPU memoriju
2. CPU šalje instrukcije za obradu do GPU
3. GPU obrađuje podatke paralelno u svakom jezgru
4. Kopiranje rezultata iz GPU memorije nazad u glavnu memoriju
Remove ads
Pozadina
GPU, kao specijalni procesor, obavlja veoma intenzivne zadatke vezane za 3D grafiku visoke rezolucije u realnom vremenu.
GPU je evoluirao u paralelni višeprocesorski sistem koji omogućava veoma efikasnu obradu velikih blokova podataka. GPU je efikasniji nego opštenamenski CPU za algoritme gde se veliki blokovi podataka obrađuju paralelno, poput:
- push-relabel algoritam maksimalnog protoka grafa;
- brzo sortiranje velikih listi;
- simulacije molekularne dinamike;
Remove ads
Prednosti
CUDA ima nekoliko prednosti nad obradom pomoću grafičkih API-ja:
- Razbacano čitanje - kod može biti pročitan sa proizvoljne adrese u memoriji;
- Deljena memorija – CUDA izlaže brze regione deljene memorije (do 48KB po multi-procesoru) koji mogu biti deljeni između niti. Ovo se može koristiti kao korisnički keš, pružajući veći propust podataka nego što je to moguće pomoću metode traženja tekstura (eng. texture lookups method);[10]
- Brži tok podataka iz/u GPU;
- Puna podrška za celobrojne i bitovne operacije, uključujući celobrojno pretraživanje tekstura;
Remove ads
Ograničenja
- CUDA ne podržava puni C standard, tako da se validan C kod, ali pogrešan C++ kod neće kompajlirati;[11][12]
- Renderovanje tekstura nije podržano;
- Kopiranje podataka između hosta i memorije uređaja može rezultovati opadanjem performansi zbog propusta i kašnjenja sistemske magistrale;
- Niti bi se trebale izvršavati u grupama od po barem 32 niti za najbolje performanse. Grananja u programu nemaju uticaja na performanse, pod pretpostavkom da svaka od 32 niti ima isti izvršni tok;
- CUDA je dostupna samo na GPU koje proizvodi Nvidia;[13]
- Validan C++ kod ponekad može biti označen što sprečava njegovo kompajliranje zbog tehnika optimizacije koje kompajler koristi;
- CUDA koristi podskup C jezika, bez rekurzije i pokazivača na funkcije sa dodatnim manjim proširenjima. Međutim, pojedinačan proces se mora izvršavati na više razdvojenih memorijskih prostora za razliku od ostalih C izvršnih okruženja;
- Realni brojevi dvostruke preciznosti (CUDA compute capability 1.3+) odstupaju od IEEE 754 standarda: "zaokruži na najbliži paran" je jedini podržan mod zaokruživanja za recipročne vrednosti, deljenje, i kvadratni koren;[14]
Podržani GPU
CUDA compute capability tabela za GPU i grafičku kartu. Također direktno dostupno na: Nvidia:
'*' - OEM proizvodi
Tabela uređaja koji podržavaju platformu CUDA:[13]
Remove ads
Specifikacije i svojstva verzija
Remove ads
Primer
Primer koda u C++ koji učitava teksturu iz slike u niz na GPU:
texture<float, 2, cudaReadModeElementType> tex;
void foo()
{
cudaArray* cu_array;
// Alokacija niza
cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
cudaMallocArray(&cu_array, &description, width, height);
// Kopiranje podataka iz slike u niz
cudaMemcpyToArray(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice);
// Postavka parametara teksture
tex.addressMode[0] = cudaAddressModeClamp;
tex.addressMode[1] = cudaAddressModeClamp;
tex.filterMode = cudaFilterModePoint;
tex.normalized = false; // do not normalize coordinates
// Vežemo teksturu za niz
cudaBindTextureToArray(tex, cu_array);
// Izvršavamo kernel
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);
// Poništavamo vezu tekstura-niz
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
Trenutna i buduća upotreba CUDA platforme
- Ubrzano prikazivanje 3D grafike
- Ubrzana konverzija formata video fajlova
- Ubrzana enkripcija, dekripcija i kompresija
- Izračunavanja u biologiji
- Simulacije u fizici, naročito kod dinamike fluida.
- Distribuirana obrada
Reference
Spoljašnje veze
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads