Pour exécuter le code sur le GPU on a ajouté le qualificatif __global__ à la fonction et en appelant en utilisant une syntaxe spéciale entre crochets.
Cependant, jusqu’à présent, nous n’avons lancé qu’un noyau qui s’exécute en série sur le GPU.
Dans ce chapitre, nous voyons à quel point il est simple de lancer un noyau qui effectue ses calculs en parallèle.
La somme de vecteurs
Nous allons créer un exemple simple pour illustrer les threads et comment nous les utilisons pour coder avec CUDA C.
Soit deux listes de nombres où nous voulons additionner les éléments correspondants de chaque liste et stocker le résultat dans une troisième liste (somme de deux vecteurs).
C(c1,c2,c3,…ck) ; A(a1,a2,a3,…ak); B(b1,b2,b3,…bk)
C=A+B=(c1,c2,c3,…ck) =(a1+b1,a2+b2,a3+b3,…,ak+bk)
Le programme c standard sur CPU pur effectuer ce calcul :
<<< M , T >>> : Indique qu'un noyau se lance avec une grille de M blocs de threads.
Chaque bloc de threads possède T threads parallèles. add<<>>( dev _ a, dev _ b, dev _ c ) :
N: crée N copies du noyau(thread) et les exécute en parallèle dans une grille de N bloques(grid) .
Int tid=blockIdx.x : Ces threads auront des valeurs variables pour blockIdx.x, le premier prenant la valeur 0 et le dernier prenant la valeur N-1. Si N=4 voici comment le calcul se déroule :
-si votre carte graphique est NVIDIA et listé dans http://developer.nvidia.com/cuda-gpus, votre GPU est CUDA-capable.
- $ lspci | grep -i nvidia P3 - $ uname -m && cat /etc/*release # connaitre la version lunix et l’architecture du cpu
- $ gcc –version # si gcc existe
- $ sudo apt-get install linux-headers-
- $(uname -r) #nécessaire pour le driver CUDA Pour voir les performances:
Ref : https://cuda-tutorial.readthedocs.io/en/latest/tutorials/tutorial01/
$> nvcc vector_add.cu -o vector_add
$> time ./vector_add or
$> nvprof ./vector_add