CUDA/fr
CUDA est une plateforme de calcul parallèle et un modèle de programmation développé par NVIDIA pour des calculs généraux utilisant le GPU.
On peut voir CUDA comme étant un ensemble de bibliothèques et de compilateurs C, C++ et Fortran qui permettent de créer des programmes pour les GPU. Pour d'autres outils de programmation pour GPU, consultez le Tutoriel OpenACC.
Un exemple simple¶
Compilation¶
Nous faisons exécuter ici du code créé avec le compilateur CUDA C/C++ nvcc. Ce même exemple plus détaillé se trouve à la page Tutoriel CUDA.
Chargez d'abord le module CUDA.
Dans cet exemple, nous additionnons deux nombres. Sauvegardez le fichier sous add.cu; le suffixe cu est important.
// add.cu
#include <iostream>
__global__ void add (int *a, int *b, int *c){
*c = *a + *b;
}
int main(void){
int a, b, c;
int *dev_a, *dev_b, *dev_c;
int size = sizeof(int);
// allocate device copies of a,b, c
cudaMalloc ( (void**) &dev_a, size);
cudaMalloc ( (void**) &dev_b, size);
cudaMalloc ( (void**) &dev_c, size);
a=2; b=7;
// copy inputs to device
cudaMemcpy (dev_a, &a, size, cudaMemcpyHostToDevice);
cudaMemcpy (dev_b, &b, size, cudaMemcpyHostToDevice);
// launch add() kernel on GPU, passing parameters
add <<< 1, 1 >>> (dev_a, dev_b, dev_c);
// copy device result back to host
cudaMemcpy (&c, dev_c, size, cudaMemcpyDeviceToHost);
std::cout<<a<<"+"<<b<<"="<<c<<std::endl;
cudaFree ( dev_a ); cudaFree ( dev_b ); cudaFree ( dev_c );
}
Compilez le programme avec nvcc pour créer l'exécutable add.
Soumission de tâches¶
Pour exécuter le programme, créez le script Slurm ci-dessous. Assurez-vous de remplacer def-someuser par votre nom de compte (voir Comptes et projets). Pour les détails sur l'ordonnancement, consultez Ordonnancement Slurm des tâches avec GPU.
#!/bin/bash
#SBATCH --account=def-someuser
#SBATCH --gres=gpu:1 # Number of GPUs (per node)
#SBATCH --mem=400M # memory (per node)
#SBATCH --time=0-00:10 # time (DD-HH:MM)
./add #name of your program
Soumettez la tâche à l'ordonnanceur.
Pour plus d'information sur la commandesbatch, l'exécution et le suivi des tâches, consultez Exécuter des tâches.
Le fichier en sortie sera semblable à ceci :
Sans GPU, le résultat serait semblable à2+7=0.
Lier des bibliothèques¶
Si votre programme doit établir des liens avec des bibliothèques incluses avec CUDA, par exemple cuBLAS, compilez avec ces indicateurs :
Voyez le Tutoriel CUDA pour plus de détails sur cet exemple et pour savoir comment utiliser le parallélisme avec les GPU.
Dépannage¶
Attribut compute capability¶
NVIDIA utilise le terme compute capability pour désigner un des attributs des dispositifs GPU.
Nvidia a créé ce terme technique qui indique les fonctionnalités prises en charge par ce GPU et spécifie certains paramètres matériels de ce dernier.
Pour plus de détails, consultez Compute Capability and Streaming Multiprocessor Versions.
Les messages d’erreur suivants sont causés par un problème en rapport avec cet attribut.
L'ajout d'un indicateur dans l'appel nvcc pourrait résoudre ces problèmes.
Si vous utilisez cmake, l'indicateur serait
où XX est la valeur de compute capability pour le GPU NVIDIA qui sera utilisé pour exécuter votre application. Pour connaître ces valeurs, voir CUDA GPU Compute Capability et omettez le point décimal.
Par exemple, si votre code sera exécuté sur un nœud A100 de Narval, le tableau de NVIDIA mentionne que sa compute capability a la valeur de 8.0.
L'indicateur à utiliser lors de la compilation avec nvcc est
L'indicateur pour cmake est
```text cmake .. -DCMAKE_CUDA_ARCHITECTURES=80