Calculați arhitectura dispozitivelor unificate

Calculați arhitectura dispozitivelor unificate Descrierea imaginii CUDA.png.

informație
Dezvoltat de Nvidia
Prima versiune 23 iunie 2007
Ultima versiune 11.2.2 (Martie 2021)
Sistem de operare Microsoft Windows , Linux și macOS
Tip Limbaj de programare
Licență Freeware
Site-ul web developer.nvidia.com/cuda-zone

CUDA (inițial acronimul pentru Compute Unified Device Architecture ) este o tehnologie a GPGPU ( General-Purpose Computing on Graphics Processing Units ), adică folosind un procesor grafic (GPU) pentru a efectua calcule generale în locul nucleului procesorului (CPU). Într-adevăr, aceste procesoare cuprind în mod obișnuit ordinea a o mie de circuite de calcul care funcționează de obicei la 1  GHz , ceea ce reprezintă un potențial mult mai mare decât un procesor central la 4  GHz , chiar dacă este multicore și multi-threaded , dacă și numai dacă calculul de realizat este paralelizabil .

CUDA permite programarea pe GPU C . Este dezvoltat de Nvidia , inițial pentru plăcile sale grafice GeForce 8 Series și folosește un driver unificat folosind o tehnică de streaming .

Primul kit de dezvoltare pentru CUDA lansat pe15 februarie 2007.

Aplicații

Orice lucru care necesită calcul intensiv care poate fi plasat în două sau trei dimensiuni, precum și ceea ce poate fi împărțit în calcule independente pe factori primi, cum ar fi ruperea codului, calcule structurale, simularea fluidelor, algoritmi de recoacere simulate, se poate face în CUDA . , calculele econometrice pe matrici foarte mari (tehnicile de împărțire a acestor matrice în blocuri permit paralelizarea în mare parte a produsului) pot profita de CUDA. Parola cracare nu este o excepție.

Arhitecturi recunoscute de CUDA

Tesla Architecture

Arhitectura Tesla , care conform NVidia oferă puterea de calcul a unui supercomputer (4 teraflopuri cu o singură precizie, 80 gigaflopuri cu o precizie dublă) pentru o sumă de 10.000 de dolari, este construită pe CUDA.

Arhitectura Pascal

Arhitectura Pascal , introdusă în 2016 cu cardurile GTX1080 și GTX1070 cu 2560 nuclee (gravură de 16 nm) și care utilizează GDDR5X overclockabil la 2,1 GHz, poate fi utilizată și cu CUDA. NVidia anunță 11 teraflops într-o singură precizie.

Arhitectura Fermi (învechită)

Arhitectura Fermi , introdusă în 2010 cu GF100, este acum depreciată, versiunile CUDA mai târziu de 8.0.x nu o suportă.

Programare

CUDA are mai multe particularități în comparație cu programarea C, oferind efectuarea de calcule generice pe GPU-uri:

Unele realizări combină utilizarea limbajului Go , foarte orientat spre programarea proceselor concurente și gestionarea memoriei fără scurgeri, cu cea a CUDA.

Beneficii

Limite

Exemple

Exemplu cu emulare de card

#include <stdio.h> #include <stdlib.h> #include <cuda.h> #include <cuda_runtime.h> __global__ void mykernel(float *A1, float *A2, float *R) { int p = threadIdx.x; R[p] = A1[p] + A2[p]; } int main() { float A1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; float A2[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 }; float R[9]; // 9 additions, aucune boucle ! mykernel<<<1 ,9>>>(A1, A2, R); // sortie à l'ecran for (int i = 0; i < 9; i++) { printf("%f\n", R[i]); } }

Acest exemplu funcționează numai dacă emulăm placa grafică deoarece nu copiem datele de pe card.

Compilat de:

nvcc -deviceemu -o run prog.cu

Exemplu cu o placă grafică NVidia

#include <stdio.h> #include <stdlib.h> #include <cuda.h> #include <cuda_runtime.h> __global__ void mykernel(float *A1, float *A2, float *R) { int p = threadIdx.x; R[p] = A1[p] + A2[p]; } int main() { float A1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; float A2[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 }; float R[9]; int taille_mem = sizeof(float) * 9; // on alloue de la memoire sur la carte graphique float *a1_device; float *a2_device; float *r_device; cudaMalloc((void**) &a1_device, taille_mem); cudaMalloc((void**) &a2_device, taille_mem); cudaMalloc((void**) &r_device, taille_mem); // on copie les donnees sur la carte cudaMemcpy(a1_device, A1, taille_mem, cudaMemcpyHostToDevice); cudaMemcpy(a2_device, A2, taille_mem, cudaMemcpyHostToDevice); //9 additions, aucune boucle ! mykernel<<<1, 9>>>(a1_device, a2_device, r_device); // on recupere le resultat cudaMemcpy(R, r_device, taille_mem, cudaMemcpyDeviceToHost); // sortie à l'ecran for(int i = 0; i < 9; i++) { printf("%f\n", R[i]); } }

Compilat de:

nvcc -o add_cuda add_cuda.cu

Note și referințe

  1. „  https://docs.nvidia.com/cuda/  ”
  2. „  https://developer.nvidia.com/cuda-toolkit-archive  ”
  3. (în) Anand Lal Shimpi și Wilson, Derek, "  Nvidia's GeForce 8800 (G80) GPUs re-arhitecturate pentru DirectX 10  " , AnandTech,8 noiembrie 2006(accesat la 16 mai 2015 ) .
  4. (în) „  http://news.developer.nvidia.com/2007/02/cuda_for_gpu_co.html  ” ( ArhivăWikiwixArchive.isGoogle • Ce să faci? ) , Pe Nvidia .
  5. „  Cryptohaze  ” , pe SourceForge (accesat la 13 august 2020 ) .
  6. https://hpcugent.github.io/easybuild/files/FOSDEM14/FOSDEM14_HPC_devroom_14_GoCUDA.pdf

Vezi și tu

Articole similare

Produse concurente

linkuri externe

Instalarea CUDA în funcție de sistemele de operare Arhitectura CUDA