Pratica: creazione di un programma in CUDA che esegue la somma di due numeri. Nei commenti la spiegazione del codice.
Ricordo che per utilizzare programmi in CUDA bisogna avere una scheda grafica nvidia CUDA capable e un compilatore.

#include < iostream >
using namespace std;
#include < cstdlib >

// questa funzione mi dice di lavorare sulla scheda grafica
// ogni kernel viene dichiarato con __global__
__global__ void add( int a, int b, int *c){ 

  *c= a+b;
}

// nel main creo le variabili
int main( void ){

  int a,b,c;
  int *dev_c;
  a=3;
  b=5;

// la memoria richiesta sul device deve essere allocata:
// dev_c puntatore a intero, sulla scheda viene allocata memoria pari al
// secondo argomento di cudaMalloc associata all'indirizzo di dev_c
// (void **) pointer a pointer (-> non posso scrivere (int **) perché puó 
// essere che la cpu e la gpu leggano in modo diverso gli interi)
  cudaMalloc( (void **)&dev_c, sizeof(int)  );

// il kernel viene invocato e il risultato viene associato a dev_c
// 1,1 indica che sto usando un blocco solo con un thread solo 
// (altrimenti mi verrebbe 1024 volte il risultato!)
  add<<<1>>>(a, b, dev_c); 

// all'indirizzo di c viene copiato 
// quanto si trova sul device a partire da dev_c
// per una lunghezza pari a sizeof(int)

// dev_c non è accessibile dal main perchè va sulla gpu! 
// infatti devo copiarlo sulla cpu con questo codice
  cudaMemcpy( &c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); //cudaMemcpyHostToDevice

  cout << "3+5=" << c << "\n";

// libero la memoria allocata da cudaMalloc
  cudaFree( dev_c);

  return 0;
}


Categories: