CUDA

From CC Doc
Jump to: navigation, search
This page is a translated version of the page CUDA and the translation is 100% complete.

Other languages:
English • ‎français


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 GPUs. Pour d'autres outils de programmation pour GPU, consultez 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 sur Tutoriel CUDA.

Chargez d'abord le module CUDA.

$ module purge
$ module load cuda

Dans cet exemple, nous additionnons deux nombres. Sauvegardez le fichier sous add.cu; le suffixe cu est important.


File : 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.

$ nvcc add.cu -o 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.

File : gpu_job.sh

#!/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.

$ sbatch gpu_job.sh
Submitted batch job 3127733

Pour plus d'information sur la commande sbatch, l'exécution et le suivi des tâches, consultez Exécuter des tâches.

Le fichier en sortie sera semblable à ceci ː

$ cat slurm-3127733.out
2+7=9

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 cet indicateur :

nvcc -lcublas -Xlinker=-rpath,$CUDA_PATH/lib64

Voyez Tutoriel CUDA pour plus de détails sur cet exemple et pour savoir comment utiliser le parallélisme sur GPU.