CUDA

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
CUDA
software
Siglă
Tip GPGPU (nu este listat )
Dezvoltator NVIDIA Corporation
Data primei versiuni 23 iunie 2007 ; Acum 14 ani
Ultima versiune 11.3.0 (15 aprilie 2021 ; acum 4 luni )
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.

Nvidia GeForce
Geforce GTX 10xx
GeForce GTX 9xx
GeForce GTX 7xx
GeForce GT \ GTX 6xx
GeForce GTX 580
GeForce GTX 570
GeForce GTX 560 Ti
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GT 430
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 GT 330M
GeForce 210 / G210
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 880M
GeForce GTX 870M
GeForce GTX 860M
GeForce GTX 780M
GeForce GTX 770M
GeForce GTX 765M
GeForce GTX 760M
GeForce GT \ GTX 6xx
GeForce GT \ GTX 5xx
GeForce GT \ GTX 4xx
GeForce GT \ GTX 3xx
GeForce GTX 285M
GeForce GTX 280M
GeForce GTX 260M
GeForce GTS 260M
GeForce GTS 250M
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 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
Cadrul FX 5800
Cadru FX 5600
Cadrul FX 4800
FX 4700 X2
Cadru FX 4600
Cadrul FX 3800
Cadru FX 3700
Panou FX 1800
Cadrul FX 1700
Cadrul FX 580
Cadrul FX 570
Cadrul FX 380
Panou FX 370
NVS 450 cadru
NVS 420 cadru
NVS 295 cadru
Quadro NVS 290
Cadru Plex 1000 Model IV
Quadro Plex 1000 Model S4
Nvidia Quadro Mobile
Panou FX 3700M
Cadrul FX 3600M
Cadru FX 2700M
Panou FX 1700M
Cadru FX 1600M
Cadrul FX 770M
Cadrul FX 570M
Panou FX 370M
Cadrul FX 360M
Quadro NVS 320M
NVS 160M cadru
Cadru NVS 150M
Cadru NVS 140M
NVS 135M cadru
Cadru NVS 130M
Nvidia Tesla
Tesla S1070
Tesla C1060
Tesla C870
Tesla D870
Tesla S870
Nvidia ION
ION
Următoarea generație-ION

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ă

  1. ^ GPU computing - BOINC , la boinc.berkeley.edu . Adus pe 7 februarie 2016 .

Elemente conexe

Alte proiecte

linkuri externe

Controlul autorității LCCN (EN) sh2013001284 · GND (DE) 7719528-0