La scheda grafi ca è un complesso componente hardware contenuto nella maggior parte dei dispositivi elettronici con una uscita video: nasce appunto con lo scopo di generare, a fronte di istruzioni della CPU, un segnale elettrico che possa essere inviato ad un display per poi essere tradotto in segnale ottico. La grande potenzialità delle schede grafi che, che le rende uno strumento molto utile anche per eseguire operazioni matematiche, risiede nella loro capacità intrinseca di eseguire un certo numero di operazioni contemporanea-
mente; devono infatti essere in grado di gestire contemporaneamente tutti i pixel dello schermo, modi candoli in tempo reale.
Tramite il linguaggio CUDA, sviluppato dalla NVIDIA sulle sue schede gra fiche, è possibile scrivere programmi basati sul C++ che permettono di sfruttare la potenza del calcolo parallelo.

Il calcolo in parallelo puo rappresentare una soluzione intelligente per approcciare alcuni problemi computazionali, come ad esempio le simulazioni, dove un certo numero di operazioni uguali devono essere eseguite da un programma di calcolo.

Il linguaggio CUDA permette di velocizzare i processi parallelizzando le operazioni uguali, che vengono cos svolte in contemporanea dalla GPU, a fronte di istruzioni date dalla CPU.



Vediamo ora un primo esempio di programma scritto in CUDA:


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

__global__ void kernel( void ){ // questa funzione mi dice di lavorare sulla scheda grafica
}

int main(){
  cudaSetDevice(1); // scelgo la scheda grafica (in caso la macchina ne abbia più di una)
  kernel<<<1>>>();
  cout << "ciao\n";
  return 0;
}


Come possiamo vedere, le funzioni che devono girare sulla scheda grafica hanno bisogno dell'attributo __global__ prima della definizione, e al momento del lancio del kernel CUDA è necessario scegliere mediante il comando <<<1>>> il numero di threads e blocks su cui farla girare.

In questo caso il kernel CUDA è solo una funzione void, che però è lanciata non dalla CPU ma dalla GPU.


Per eseguire utilizziamo il seguente makefile:



LIBS=
#-lcuda -lm -L/usr/local/cuda/lib/ -lcudart #la uso solo se sono sulla macchina q
OBJS=
NVCC=nvcc

ECHO=/bin/echo

#default: hello.x
#default: devprop.x
#default: add.x
#default: somma_vec.x
#default: scalar_prod_blocchi.x
#default: scalar_prod_thread.x
default: scalar_prod_full.x

%.x: %.cu
$(NVCC) $(OBJS) $(LIBS) $< -o $@

clean:
rm -f *.x *.o




Categories: