Exemple avec émulation de carte
#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 marche 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
#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