CUDA
CUDA software | |
---|---|
Tip | GPGPU (nu este listat ) |
Dezvoltator | NVIDIA Corporation |
Data primei versiuni | 23 iunie 2007 |
Ultima versiune | 11.3.0 (15 aprilie 2021 | )
Sistem de operare | Windows 10 , Windows 8 , Windows 7 , Windows Vista , Windows XP , Windows Server 2008 , Windows Server 2003 , Linux , macOS (nu este listat ) |
Licență | freeware ( licența nu este gratuită ) |
Site-ul web | Zona CUDA a Nvidiei |
CUDA (acronim pentru Compute Unified Device Architecture ) este o arhitectură hardware de procesare paralelă creată de NVIDIA . Prin mediul de dezvoltare pentru CUDA, programatorii software pot scrie aplicații capabile să efectueze calcul paralel pe GPU - urile plăcilor video NVIDIA .
Limbajele de programare disponibile în mediul de dezvoltare CUDA sunt extensii ale celor mai populare limbaje pentru scrierea programelor. Principala este „CUDA-C” (C cu extensii NVIDIA), altele sunt extensii Python , Fortran , Java și MATLAB .
Programele care profită de arhitectura CUDA pot fi, de asemenea, scrise folosind bibliotecile software OpenCL și DirectCompute .
CUDA oferă dezvoltatorilor acces la un set de instrucțiuni native pentru elementele de calcul paralele ale GPU-urilor CUDA. Folosind CUDA, cele mai recente GPU-uri Nvidia devin efectiv arhitecturi deschise, cum ar fi procesoarele . Spre deosebire de procesoare, GPU-urile au o arhitectură paralelă cu mai multe nuclee, fiecare capabil să ruleze sute de procese simultan: dacă o aplicație este potrivită pentru acest tip de arhitectură, GPU poate oferi performanțe și beneficii extraordinare. Această abordare de depanare este cunoscută sub numele de GPGPU .
Beneficii
CUDA are mai multe avantaje față de tehnicile tradiționale de calcul GPU care utilizează API-uri grafice.
- Codul poate fi citit din locații arbitrare din memorie.
- Memorie partajată: CUDA expune o regiune de 16kB în dimensiune care poate fi partajată rapid între fire. Acesta poate fi folosit ca cache gestionat de utilizator, făcând disponibile lățimi de bandă mari, care pot fi utilizate pentru structuri de textură .
- Citește și scrie rapid, către și de la GPU.
- Suport complet pentru divizii întregi și operațiuni bit-by-bit, inclusiv acces la texturi complete.
Limitări
- CUDA a fost inițial un subset al limbajului C , lipsit de indicații de recursivitate și funcție, plus câteva extensii simple. Un singur proces trebuie să ruleze pe mai multe disjuncții ale spațiului de memorie, spre deosebire de alte medii de runtime C. Cu toate acestea, versiunile mai noi utilizează sintaxa C ++. Este posibil ca codul scris pentru versiunile anterioare să nu se compileze sau să se comporte diferit.
- Redarea texturii nu este acceptată.
- Pentru precizie dublă, acceptată începând cu seria GTX 2XX, există mai multe abateri de la standardul IEEE 754: chiar rotunjirea este singura aproximare acceptată pentru: reciproce, diviziuni și rădăcini pătrate. Într-o singură precizie, NAN-urile raportate și denormalizate nu sunt acceptate; acestea sunt specifice instrucțiunilor de bază, cu privire la un singur cuvânt de verificare [ neclar ] ; iar precizia punctelor zecimale ale diviziunilor sau rădăcinilor n este mult mai mică decât precizia unică.
- Lățimea de bandă și latența dintre CPU și GPU pot fi un obstacol.
- Firele trebuie să ruleze în multipli de 32 pentru cea mai bună performanță, cu un număr total de fire în mii. Ramurile de cod nu afectează performanța, atâta timp cât fiecare dintre cele 32 de fire de execuție are aceeași cale de execuție. Modelul de execuție SIMD devine o limitare semnificativă pentru mai multe sarcini, de exemplu parcurgerea unui spațiu partiționat al structurilor de date în timpul trasării razelor .
- Spre deosebire de OpenCL , GPU-urile echipate cu CUDA sunt disponibile doar de la NVIDIA (seria GeForce 8 superioară, Quadro și Tesla )
- Gestionarea excepțiilor nu este acceptată în codul CUDA din cauza degradării rezultate a rezultatelor cu rularea a mii de fire.
- În versiunile mai noi nu există emulatoare software pentru executarea codului CUDA.
Lista GPU acceptată
Iată o listă de hardware care acceptă oficial CUDA. Rețineți că multe aplicații necesită cel puțin 256 MB de VRAM dedicat.
|
|
|
|
CUDA Nvidia și BOINC
Platforma BOINC (Berkeley Open Infrastructure for Network Computing) are mai multe proiecte de calcul distribuite care susțin și exploatează pe deplin potențialul și beneficiile tehnologiei CUDA.
Proiectele BOINC sprijinite de platforma Nvidia CUDA sunt: [1]
- Conjectura Collatz: soluția faimoasei conjecturi Collatz (sau 3n + 1 ) este vizată
- DistrRTgen: este un proiect menit să creeze mese curcubeu distribuite gratuit
- Einstein @ home: își propune să analizeze datele produse de observatoarele astronomice pentru a detecta undele gravitaționale din diferite surse, cum ar fi găurile negre
- GPUgrid.net: este un proiect în domeniul cercetării biomedicale
- Milkyway @ home: scopul acestui proiect este de a crea un model tridimensional precis al Căii Lactee, folosind datele furnizate de Sloan Digital Sky Survey
- Moo!: Vă permite să participați la competiția RC5-72, este un wrapper distribuit.net
- PrimeGrid: Căutați cele mai mari numere prime din lume
- SETI @ home: este foarte renumitul proiect de calcul distribuit, folosește datele radiotelescopului Arecibo pentru a căuta semnale legate de inteligența extraterestră
Exemple
Acest exemplu de cod din C ++ încarcă o textură dintr-o imagine într-o matrice GPU:
* cudaArray * cu_array ;
textura < float , 2 > tex ;
// Alocați matricea
cudaChannelFormatDesc description = cudaCreateChannelDesc < float > ();
cudaMallocArray ( & cu_array , & descriere , lățime , înălțime );
// Copiați datele de imagine în matrice
cudaMemcpy ( cu_array , imagine , lățime * înălțime * sizeof ( float ), cudaMemcpyHostToDevice );
// Legați tabloul de textură
cudaBindTextureToArray ( tex , cu_array );
// Rulați nucleul
dim3 blockDim ( 16 , 16 , 1 );
dim3 gridDim ( lățime / blocDim . x , înălțime / blocDim . y , 1 );
kernel <<< gridDim , blockDim , 0 >>> ( d_odata , înălțime , lățime );
cudaUnbindTexture ( tex );
__global__ void nucleu (float * odata, inaltime int, latime int)
{
unsigned int x = blockIdx . x * blockDim . x + threadIdx . x ;
unsigned int y = blockIdx . y * blockDim . y + threadIdx . y ;
float c = tex2D ( tex , x , y );
odata [ y * width + x ] = c ;
}
Mai jos este un exemplu în Python care calculează produsul a două tablouri din GPU. Limbajul neoficial Python poate fi obținut de la PyCUDA .
import pycuda.driver ca drv
import numpy
import pycuda.autoinit
mod = drv . SourceModule ( "" "
__global__ void multiply_them (float * dest, float * a, float * b)
{
const int i = threadIdx.x;
dest [i] = a [i] * b [i];
}
"" " )
multiplicați-le = mod . get_function ( "multiply_them" )
a = numpy . aleatoriu . randn ( 400 ) . astype ( numpy . float32 )
b = numpy . aleatoriu . randn ( 400 ) . astype ( numpy . float32 )
dest = numpy . zeros_like ( a )
multiplicați-le (
drv . Out ( dest ), drv . În ( a ), drv . În ( b ),
bloc = ( 400 , 1 , 1 ))
print ( dest - a * b )
Alte legături Python pentru a simplifica produsele inter-matrice pot fi găsite pe pycublas .
import numpy
din pycublas import CUBLASMatrix
A = CUBLASMatrix ( numpy . Mat ([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]], numpy . Float32 ) )
B = CUBLASMatrix ( numpy . Mat ([[ 2 , 3 ], [ 4 , 5 ], [ 6 , 7 ]], numpy . Float32 ) )
C = A * B
C print. np_mat ()
Notă
- ^ GPU computing - BOINC , la boinc.berkeley.edu . Adus pe 7 februarie 2016 .
Elemente conexe
Alte proiecte
- Wikimedia Commons conține imagini sau alte fișiere pe CUDA
linkuri externe
Controlul autorității | LCCN (EN) sh2013001284 · GND (DE) 7719528-0 |
---|