Cet article est uneébauche concernant l’informatique.
CUDA (initialement l'acronyme deCompute Unified Device Architecture[2]) est une technologie propriétaire[3] deGPGPU (General-Purpose Computing on Graphics Processing Units), c'est-à-dire utilisant unprocesseur graphique (GPU) pour exécuter des calculs généraux à la place duprocesseur central (CPU). En effet, ces processeurs comportent couramment de l'ordre d'un millier de circuits de calcul fonctionnant typiquement à 1 GHz, ce qui représente un potentiel très supérieur à un processeur central à 4 GHz, fût-ilmulticœurs etmulti-threads. Cette utilisation requiert que le calcul à effectuer soitparallélisable.
CUDA permet de programmer des GPU enC++. Elle est développée parNvidia, initialement pour ses cartes graphiquesGeForce 8, et utilise unpilote unifié utilisant une technique destreaming (flux continu).
Le premierkit de développement pour CUDA est publié le[4].
Est réalisable en CUDA tout ce qui demande ducalcul intensif maillable en deux ou trois dimensions, ainsi que ce qui est décomposable en calculs indépendants sur des facteurs premiers, tel que cassage de codes,cassage de mot de passe[5], calculs de structures, simulation de fluides, algorithmes de recuit simulé, calculs économétriques sur de très grandesmatrices (des techniques de découpages de ces matrices en blocs permettent de largement en paralléliser le produit).
L'architectureTesla, introduite en novembre 2006, qui offre selonNvidia la puissance de calcul d'unsuperordinateur (4 téraflops en simple précision, 80 gigaflops en double précision) pour une somme de 10 000 dollars, est construite sur CUDA.
L'architectureFermi, introduite en 2010 avec le GF100, est maintenant obsolète, les versions de CUDA ultérieures aux versions 8.0.x ne la prenant pas en charge.
L'architecturePascal, introduite en 2016 avec les cartes GTX1080 et GTX1070 à 2560 cœurs (gravure en 16 nm) et qui utilise de laGDDR5Xsurcadençable à 2,1 GHz, est également utilisable avec CUDA. NVidia lui annonce 11 téraflops en simple précision.
L'architectureVolta, conçue pour des usages professionnels, a été introduite en 2017 et intègre la carte V100, première architecture de NVidia à introduire l'usage des Tensor Cores, des cœurs d'arithmétique spéciaux qui permettent d'accélérer grandement les calculs de matrices en réduisant la précision de 32 à16 bit[6].
L'architectureTuring, introduite en 2018 avec les RTX 20, succède aussi à Pascal, mais vise les particuliers, contrairement à Volta. Elle possède de nouvelles unités arithmétiques en plus de Tensor Cores améliorés, les RT Cores, qui eux permettent d'accélérer les calculs deray tracing. Cependant ces derniers ne sont pas programmables via CUDA[7].
CUDA présente plusieurs particularités par rapport à la programmation en C, en proposant d'effectuer des calculs génériques sur GPU :
Quelques réalisations combinent l'usage du langageGo, très orienté sur la programmation de processus concurrents et la gestion de mémoire sans fuites, avec celui de CUDA[8].
#include<stdio.h>#include<stdlib.h>#include<cuda.h>#include<cuda_runtime.h>__global__voidmykernel(float*A1,float*A2,float*R){intp=threadIdx.x;R[p]=A1[p]+A2[p];}intmain(){floatA1[]={1,2,3,4,5,6,7,8,9};floatA2[]={10,20,30,40,50,60,70,80,90};floatR[9];// 9 additions, aucune boucle !mykernel<<<1,9>>>(A1,A2,R);// sortie à l'ecranfor(inti=0;i<9;i++){printf("%f\n",R[i]);}}
Cet exemple fonctionne seulement si on émule la carte graphique, car on ne recopie pas les données sur la carte. L'émulation a été supprimée à partir de CUDA 3.1[11][réf. non conforme].
Compilation par :
nvcc -deviceemu -o run prog.cu
#include<stdio.h>#include<stdlib.h>#include<cuda.h>#include<cuda_runtime.h>__global__voidmykernel(float*A1,float*A2,float*R){intp=threadIdx.x;R[p]=A1[p]+A2[p];}intmain(){floatA1[]={1,2,3,4,5,6,7,8,9};floatA2[]={10,20,30,40,50,60,70,80,90};floatR[9];inttaille_mem=sizeof(float)*9;// on alloue de la memoire sur la carte graphiquefloat*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 cartecudaMemcpy(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 resultatcudaMemcpy(R,r_device,taille_mem,cudaMemcpyDeviceToHost);// sortie à l'ecranfor(inti=0;i<9;i++){printf("%f\n",R[i]);}}
Compilation par :
nvcc -o add_cuda add_cuda.cu
TechnologiesNvidia | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Processeur graphique |
| ||||||||
| Autres séries | |||||||||
| GPU pourconsole | |||||||||
| Électronique grand public | |||||||||
| Chipsets nForce | |||||||||
| Technologies | |||||||||
| Logiciels | |||||||||