Programmazione di GPUs con CUDA:
Un nuovo approccio al parallelismo
Francesco [email protected]
16/12/2009
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 1 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 2 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 3 / 45
I limiti fisici delle architetture scalari
Un processore e un chip di silicio con dei transistor stampati.
Processori piu potenti grazie alla miniaturizzazione dei transistor, difeature size λ:
Se λ → 0 :
Il numero dei transistor scala come N ∝ 1λ2
Il tempo di calcolo solo come τ ∝ 1λ
⇒ E’ piu facile costruire macchine capaci di compiere piu e piu task inparallelo che uno piu velocemente.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 4 / 45
I limiti fisici delle architetture scalari
Un processore e un chip di silicio con dei transistor stampati.
Processori piu potenti grazie alla miniaturizzazione dei transistor, difeature size λ:
Se λ → 0 :
Il numero dei transistor scala come N ∝ 1λ2
Il tempo di calcolo solo come τ ∝ 1λ
⇒ E’ piu facile costruire macchine capaci di compiere piu e piu task inparallelo che uno piu velocemente.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 4 / 45
Storia del parallelismo
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 5 / 45
Meglio una bassa latenza o un alto troughput?
CPUs:
Ottimizzate per avere accesso a bassa latenza ad estese memorie cache.Molti transistor impegnati nella predizione dei branches.Drawbacks:
Parallelismo massivo inibito.
Illusione della serialita.Scarsa potenza di calcolo.
GPUs:
Ottimizzate per computazioni parallele, piu transistors dedicati alleoperazioni di calcolo.Latenze ammortizzate dall’esecuzione concorrente di piu threads(SIMT).Efficienza derivante da capacita di tenere locali i dati.Alto troughput e parallelismo garantiti dalla presenza di centinaia diunita di calcolo.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 6 / 45
Meglio una bassa latenza o un alto troughput?
CPUs:
Ottimizzate per avere accesso a bassa latenza ad estese memorie cache.Molti transistor impegnati nella predizione dei branches.Drawbacks:
Parallelismo massivo inibito.
Illusione della serialita.Scarsa potenza di calcolo.
GPUs:
Ottimizzate per computazioni parallele, piu transistors dedicati alleoperazioni di calcolo.Latenze ammortizzate dall’esecuzione concorrente di piu threads(SIMT).Efficienza derivante da capacita di tenere locali i dati.Alto troughput e parallelismo garantiti dalla presenza di centinaia diunita di calcolo.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 6 / 45
Meglio una bassa latenza o un alto troughput?
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 7 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 8 / 45
Struttura di una GPU
Terminologia comune:
CPU (central processing unit) ≡ Host: il computer su cui e installata la GPUGPU (graphics processing unit) ≡ Device: scheda video/GPU.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 9 / 45
Struttura di una GPU
Il device ha una RAM (device memory) off-chip ma sulla scheda.
Il processore (chip) e formato da centinaia di processori scalari (SP).
Gli SP sono raggruppati fisicamente in gruppi da 8 in Multiprocessors.
Gli SP in uno stesso multiprocessor condividono la stessa shared memory.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 10 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 11 / 45
Threads
Una GPU mantiene in esecuzione migliaia di threads perammortizzare le latenze dei singoli.
Un thread e un’istanza di un algoritmo che viene fatta eseguire su unaporzione dei dati.
Lo stato di un thread e definito da:
Il valore nei suoi registri.Il suo indice.La posizione dell’istruzione che sta eseguendo (∼ instruction pointer).
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 12 / 45
Threads
Una GPU mantiene in esecuzione migliaia di threads perammortizzare le latenze dei singoli.
Un thread e un’istanza di un algoritmo che viene fatta eseguire su unaporzione dei dati.
Lo stato di un thread e definito da:
Il valore nei suoi registri.Il suo indice.La posizione dell’istruzione che sta eseguendo (∼ instruction pointer).
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 12 / 45
Kernels
L’insieme dei threads che risolvono un problema e chiamato kernel, ogriglia di threads.
!
Ogni thread all’interno del kernel (griglia) e identificato da un indice.
Un kernel viene lanciato dall’host su uno o piu device.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 13 / 45
Blocks
I vari device eseguono i threads raggruppandoli in blocks (vicinati).
I threads in un block condividono la shared memory.
Un block e l’analogo software del multiprocessor, ma unmultiprocessor ha allocati piu blocks.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 14 / 45
In sintesi
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 15 / 45
In sintesi
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 16 / 45
In sintesi
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 17 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 18 / 45
CUDA
Framework proprietario di NVIDIA per la programmazione di GPUNVIDIA.
Pro:
Ben documentato.Strutturato come estensione al linguaggio C.Compatibile con C++, templates.MultipiattaformaEsistono port per multicore.Molte librerie ottimizzate (cuFFT, cublas, cudpp, thrust).Standard de-facto.
Contro:
Lock-in?
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 19 / 45
OpenCL
Framework standard open per la programmazione di GPU earchitetture parallele massive in genere.
Pro:
Funziona su tutte le schede e anche sulle CPU multicore.E’ uno standard open sviluppato da tutte le maggiori caseproduttrici/sviluppatrici.
Contro:
Ancora poche librerie rilasciate.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 20 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 21 / 45
cudaMalloc
!
le memorie device e host sono RAM diverse e separate.
Serve per allocare memoria sul device.
Simile a malloc sull’host.
float *device pointer=0;
cudaMalloc(&device pointer, sizeof(float)*N);
serve per allocare sulla GPU un array di N floats.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 22 / 45
cudaMalloc
!
le memorie device e host sono RAM diverse e separate.
Serve per allocare memoria sul device.
Simile a malloc sull’host.
float *device pointer=0;
cudaMalloc(&device pointer, sizeof(float)*N);
serve per allocare sulla GPU un array di N floats.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 22 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 23 / 45
cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,cudaMemcpyDeviceToDevice);
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,cudaMemcpyDeviceToDevice);
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,cudaMemcpyDeviceToDevice);
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,cudaMemcpyDeviceToDevice);
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
cudaMemcpy
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 25 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 26 / 45
Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non e possibile eseguire il codice CPU su una GPU.
Il codice per GPU e CPU puo essere scritto nello stesso file .cu.
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale puoessere eseguita:
sulla CPU → puo accedere solo alla memoria hostsulla GPU → puo accedere solo alla memoria device
A seconda dell’ambito di funzione, essa puo essere chiamata:
dalla CPUdalla GPU
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non e possibile eseguire il codice CPU su una GPU.
Il codice per GPU e CPU puo essere scritto nello stesso file .cu.
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale puoessere eseguita:
sulla CPU → puo accedere solo alla memoria hostsulla GPU → puo accedere solo alla memoria device
A seconda dell’ambito di funzione, essa puo essere chiamata:
dalla CPUdalla GPU
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non e possibile eseguire il codice CPU su una GPU.
Il codice per GPU e CPU puo essere scritto nello stesso file .cu.
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale puoessere eseguita:
sulla CPU → puo accedere solo alla memoria hostsulla GPU → puo accedere solo alla memoria device
A seconda dell’ambito di funzione, essa puo essere chiamata:
dalla CPUdalla GPU
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device ehost servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambitodevice e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate comedevice .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore e acceso di default se e omessoogni altro qualificatore)I kernels, dichiarati come global .
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device ehost servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambitodevice e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate comedevice .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore e acceso di default se e omessoogni altro qualificatore)I kernels, dichiarati come global .
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device ehost servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambitodevice e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate comedevice .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore e acceso di default se e omessoogni altro qualificatore)I kernels, dichiarati come global .
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device ehost servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambitodevice e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate comedevice .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore e acceso di default se e omessoogni altro qualificatore)I kernels, dichiarati come global .
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
Esempio
Dichiarazione di una funzione device:
d e v i c e f l o a t gpu sq r ( f l o a t x ){ return x∗x ;}
Dichiarazione kernel:
g l o b a l void s q r a l l ( f l o a t ∗ x , i n t N){
i n t i = t h r e a d I d x . x + b l o c k I d x . x∗blockDim . x ;i f ( i>=N) return ;x [ i ] = gpu sq r ( x [ i ] ) ;
}
NB: threadIdx.x, blockIdx.x, blockDim.x variabili definite automaticamentedal compilatore che servono per far comunicare al thread la sua posizionenella griglia e quindi quali dati processare.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 29 / 45
Kernel Call
La funzione global e il punto di ingresso per il calcolo su GPU.
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in unarray.
Il kernel si lancia dall’host sulla GPU con la seguente istruzione:
sqr all<<<N/block size,block size>>> (device ptr, N);
Finita l’elaborazione l’array device device ptr conterra i quadrati deinumeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e sisceglie di solito per minimizzare l’occupancy (si vedano gli esempiNVIDIA).
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
Kernel Call
La funzione global e il punto di ingresso per il calcolo su GPU.
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in unarray.
Il kernel si lancia dall’host sulla GPU con la seguente istruzione:
sqr all<<<N/block size,block size>>> (device ptr, N);
Finita l’elaborazione l’array device device ptr conterra i quadrati deinumeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e sisceglie di solito per minimizzare l’occupancy (si vedano gli esempiNVIDIA).
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
Kernel Call
La funzione global e il punto di ingresso per il calcolo su GPU.
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in unarray.
Il kernel si lancia dall’host sulla GPU con la seguente istruzione:
sqr all<<<N/block size,block size>>> (device ptr, N);
Finita l’elaborazione l’array device device ptr conterra i quadrati deinumeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e sisceglie di solito per minimizzare l’occupancy (si vedano gli esempiNVIDIA).
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
Montaggio
// . . .i n t main ( void ) // e h o s t d i d e f a u l t !{
i n t N = 1024 ;f l o a t ∗ x ho s t = new f l o a t [N ] ;f l o a t ∗ x dev = 0 ;cudaMal loc (&x dev , s i z eo f ( f l o a t )∗N) ;
f o r ( i n t i =0; i<N; i++)x ho s t [ i ]= i ;cudaMemcpy ( x dev , x hos t , s i z eo f ( f l o a t )∗N, cudaMemcpyHostToDevice ) ;
s q r a l l <<<N/256,256>>>( x dev ,N) ;
cudaMemcpy ( x hos t , x dev , s i z eo f ( f l o a t )∗N, cudaMemcpyDeviceToHost ) ;f o r ( i n t i =0; i<N; i++)p r i n t f (% f \n , x ho s t [ i ] ) ;
}
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 31 / 45
Caveat
for(int i=0;i<N;i++)printf(“%f\n”, x dev[i]);
NEIN: x dev e memoria del device,ci si puo accedere solo da funzioniglobal o device!
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 32 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 33 / 45
Un esempio“fisico”
Moto di molti corpi puntiformi e di massa trascurabile in un campogravitazionale generato da due corpi massivi fissi.
Dinamica non lineare, richiede simulazione numerica.
Equazioni del moto (integrate poi con lo schema leapfrog):
F = ma
F = km1m2
r2
Il moto di ogni corpo e indipendente dagli altri
→ e possibile parallelizzare brutalmente e assegnare un thread perogni corpo.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 34 / 45
Un esempio“fisico”
Moto di molti corpi puntiformi e di massa trascurabile in un campogravitazionale generato da due corpi massivi fissi.
Dinamica non lineare, richiede simulazione numerica.
Equazioni del moto (integrate poi con lo schema leapfrog):
F = ma
F = km1m2
r2
Il moto di ogni corpo e indipendente dagli altri
→ e possibile parallelizzare brutalmente e assegnare un thread perogni corpo.
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 34 / 45
Il codice
Il sorgente del programme e contenuto nei files draw.cpp, 2body.cu.
2body.cu contiene la parte dedicata alla simulazione e a CUDA.
Puo essere compilato con nvcc, il compilatore NVIDIA CUDA e gcc:
nvcc -c -O3 –compiler-options -fopenmp 2body.cu
g++ -c -O3 -m32 draw.cpp -ftree-vectorize
g++ -O3 -fopenmp -m32 -framework GLUT -framework OpenGL2body.o draw.o -lcudart -L/usr/local/cuda/lib
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 35 / 45
Il codice
Il sorgente del programme e contenuto nei files draw.cpp, 2body.cu.
2body.cu contiene la parte dedicata alla simulazione e a CUDA.
Puo essere compilato con nvcc, il compilatore NVIDIA CUDA e gcc:
nvcc -c -O3 –compiler-options -fopenmp 2body.cu
g++ -c -O3 -m32 draw.cpp -ftree-vectorize
g++ -O3 -fopenmp -m32 -framework GLUT -framework OpenGL2body.o draw.o -lcudart -L/usr/local/cuda/lib
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 35 / 45
Risultati: Performance boost
Processore ˜Time Speedup
1 core Core2 613s 1x2 cores Core2 367 1,7x8 cores XEON 86s 7,12x
1 Geforce 9400M GPU 38.7s 16x1 Tesla C1060 GPU 7.1s 87.5x1 Geforce GTX280 6.4s 95,7x
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 36 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 37 / 45
Codici PIC
Plasma: interazione bidirezionale particelle-campi elettromagnetici.
Speedup ˜15x.
(se c’e tempo faccio vedere qualche simulazioncina live)
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 38 / 45
Outline
1 IntroduzionePerche le GPU
2 Programmare le GPUStruttura di una GPUThreads, kernels, blocksDue frameworks: CUDA e OpenCL
3 Primi passi con CUDAAllocare la memoriaSincronizzare i datiLanciare l’elaborazioneUn esempio piu pratico
4 ApplicazioniMetodi PIC per la simulazione di fenomeni laser-plasmaRaytracing
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 39 / 45
Visualizzazione tomografia
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 40 / 45
NUME @ cineca
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 41 / 45
NUME @ cineca
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 42 / 45
NUME @ cineca
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 43 / 45
NUME @ cineca
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 44 / 45
Links utili
Info generali:
http://developer.nvidia.com/cuda
http://www.ddj.com/cpp/207200659
http://gpgpu.org
Librerie utilissime:
cublas, cufft (NVIDIA)
http://code.google.com/p/thrust/
http://gpgpu.org/developer/cudpp
Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 45 / 45