Compute Unified Device Architecture
CUDA (initialement l'acronyme de Compute Unified Device Architecture[23]) est une technologie propriétaire[24] de GPGPU (General-Purpose Computing on Graphics Processing Units), c'est-à-dire utilisant un processeur graphique (GPU) pour exécuter des calculs généraux à la place du processeur 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-il multicœurs et multi-threads. Cette utilisation requiert que le calcul à effectuer soit parallélisable.
Développé par | Nvidia |
---|---|
Première version | |
Dernière version |
7.0 7.5 () 8.0[1] 9.1 ()[2] 9.1.85[3] 9.2.88 ()[4] 10.0.130 ()[5] 10.1.105 ()[6] 10.1.243 ()[7] 10.2.89 ()[8] 11.0.2 ()[9] 11.0.3 ()[10] 11.2.2 ()[11],[12] 11.5.1 ()[13],[12] 11.7.0 ()[14],[15] 12.0 ()[16],[17] 12.1 ()[18],[19] 12.2 ()[20] 12.3.1 ()[21] 12.5.1 ()[22] |
Système d'exploitation | Microsoft Windows, Linux et macOS |
Type |
Pile de logiciels Interface de programmation |
Licence | Licence propriétaire |
Site web | developer.nvidia.com/cuda-zone |
CUDA permet de programmer des GPU en C++. Elle est développée par Nvidia, initialement pour ses cartes graphiques GeForce 8, et utilise un pilote unifié utilisant une technique de streaming (flux continu).
Le premier kit de développement pour CUDA est publié le [25].
Applications
modifierEst réalisable en CUDA tout ce qui demande du calcul 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[26], calculs de structures, simulation de fluides, algorithmes de recuit simulé, calculs économétriques sur de très grandes matrices (des techniques de découpages de ces matrices en blocs permettent de largement en paralléliser le produit).
Architectures reconnues par CUDA
modifierArchitecture Tesla
modifierL'architecture Tesla, qui offre selon Nvidia la puissance de calcul d'un superordinateur (4 téraflops en simple précision, 80 gigaflops en double précision) pour une somme de 10 000 dollars, est construite sur CUDA.
Architecture Fermi (obsolète)
modifierL'architecture Fermi, 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.
Architecture Pascal
modifierL'architecture Pascal, introduite en 2016 avec les cartes GTX1080 et GTX1070 à 2560 cœurs (gravure en 16 nm) et qui utilise de la GDDR5X surcadençable à 2,1 GHz, est également utilisable avec CUDA. NVidia lui annonce 11 téraflops en simple précision.
Programmation
modifierCUDA présente plusieurs particularités par rapport à la programmation en C, en proposant d'effectuer des calculs génériques sur GPU :
- hiérarchisation explicite des zones de mémoire (privée, locale, globale) permettant d'organiser finement les transferts entre elles ;
- regroupement des threads en grilles de grilles : grille 1D, 2D ou 3D locale de threads pouvant se partager rapidement la mémoire locale. Les grilles locales sont ordonnées en grille globale permettant d'accéder à la mémoire globale.
Quelques réalisations combinent l'usage du langage Go, très orienté sur la programmation de processus concurrents et la gestion de mémoire sans fuites, avec celui de CUDA[27].
Avantages
modifier- Accès relativement standardisé à la puissance de calcul.
- Un programme réalisé avec CUDA reste utilisable sur plus d'une génération de matériel.
Limites
modifier- Les vitesses de transfert entre l'hôte et le client peuvent être un goulet d'étranglement ; il peut être évité par des copies asynchrones.
- Regroupement des threads par groupe de trente-deux, pour des questions de performances (les warps). Les divergences au sein d'un warp, dues aux exécutions conditionnelles, peuvent nuire grandement aux performances. Il s'agit d'une limitation due au modèle SIMD. De ce fait, tous les algorithmes ne gagnent pas à être portés sur CUDA, et plus généralement sur un modèle SIMD.
- Un code C valide peut être rejeté à cause des contraintes matérielles, telles que le manque de mémoire ou le nombre de threads.
- Les premières versions (1.x) de CUDA ne supportent pas la récursion, les pointeurs de fonctions, et d'autres limites qui tendent à disparaître.
- La précision des calculs : la double-précision n'est disponible que depuis la version 1.3. De plus, la norme IEEE 754 n'est que partiellement atteinte : en double précision, le seul mode d'arrondi est round-to-nearest-even. En simple précision, les nombres ne sont pas dénormalisés, le signal NaN est absent, et les deux seuls modes d'arrondi sont chop et round-to-nearest even.
- Seuls les GPU nVidia supportent CUDA, les fabricants concurrents ne peuvent pas l'implémenter[28],[24].
Exemples
modifierExemple avec émulation de carte
modifier#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]);
}
}
Cet exemple fonctionne seulement si on émule la carte graphique car on ne recopie pas les données sur la carte.
Compilation par :
nvcc -deviceemu -o run prog.cu
Exemple avec une carte graphique NVidia
modifier#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]);
}
}
Compilation par :
nvcc -o add_cuda add_cuda.cu
Notes et références
modifier- « https://developer.nvidia.com/cuda-downloads »
- « CUDA Toolkit Archive », (consulté le )
- « NVIDIA CUDA Toolkit Release Notes » (consulté le )
- « NVIDIA CUDA TOOLKIT 9.2.88 » (consulté le )
- « NVIDIA CUDA TOOLKIT 10.0.130 » (consulté le )
- « NVIDIA CUDA TOOLKIT 10.1.105 » (consulté le )
- « NVIDIA CUDA TOOLKIT 10.1.243(English) » (consulté le )
- « CUDA 10.2 Released With VMM APIs, libcu++ As Parallel Standard C++ Library For GPUs » (consulté le )
- « CUDA Toolkit 11 and Nsight Developer Tools Released for General Availability » (consulté le )
- « NVIDIA CUDA Toolkit Release Notes » (consulté le )
- « https://docs.nvidia.com/cuda/ »
- « https://developer.nvidia.com/cuda-toolkit-archive »
- « https://docs.nvidia.com/cuda »
- « https://docs.nvidia.com/cuda/ » (consulté le )
- « https://developer.nvidia.com/cuda-toolkit-archive » (consulté le )
- « CUDA Toolkit Documentation v12.0 » (consulté le )
- « CUDA Toolkit 12.0 Released for General Availability », (consulté le )
- « CUDA 12.1 Release Notes »,
- « https://docs.nvidia.com/cuda/pdf/CUDA_Toolkit_Release_Notes.pdf »,
- « CUDA 12.2 Release Notes » (consulté le )
- « CUDA 12.3 Release Notes » (consulté le )
- « CUDA Toolkit Archive » (consulté le )
- (en) Anand Lal Shimpi et Wilson, Derek, « Nvidia's GeForce 8800 (G80): GPUs Re-architected for DirectX 10 », AnandTech, (consulté le ).
- (en) Agam Shah, « Nvidia not totally against third parties making CUDA chips », sur theregister.com (consulté le ).
- (en) « http://news.developer.nvidia.com/2007/02/cuda_for_gpu_co.html »(Archive.org • Wikiwix • Archive.is • Google • Que faire ?), sur Nvidia.
- « Cryptohaze », sur SourceForge (consulté le ).
- https://hpcugent.github.io/easybuild/files/FOSDEM14/FOSDEM14_HPC_devroom_14_GoCUDA.pdf
- (en) « CUDA GPUs - Compute Capability », sur NVIDIA Developer (consulté le ).
Voir aussi
modifierArticles connexes
modifierProduits concurrents
modifier- OpenCL (API/langage créé à l'origine par Apple, sous licence BSD), et gérée par le Khronos Group Khronos OpenCL comme OpenGL.
- Larrabee de Intel qui a donné naissance aux cartes accélératrices Intel MIC
- ATI Stream.
- Compute Shaders de Direct3D 11
Liens externes
modifierInstallation de CUDA en fonction des systèmes d'exploitation
modifierArchitecture CUDA
modifier- (en) Page sur CUDA du site de Nvidia
- Article sur CUDA Tom's Hardware
- Explications sur CUDA du site Hardware.fr
- Introduction à CUDA sur le site Developpez.com
- Intel MIC
- Khronos OpenCL