1. Programmazione di GPUs con CUDA:
Un nuovo approccio al parallelismo
Francesco Rossi
mail.francesco.rossi@gmail.com
16/12/2009
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 1 / 45
2. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 2 / 45
3. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 3 / 45
4. I limiti fisici delle architetture scalari
Un processore ` un chip di silicio con dei transistor stampati.
e
Processori pi` potenti grazie alla miniaturizzazione dei transistor, di
u
feature size λ:
Se λ → 0 :
Il numero dei transistor scala come N ∝ 1
λ2
Il tempo di calcolo solo come τ ∝ λ1
⇒ E’ pi` facile costruire macchine capaci di compiere pi` e pi` task in
u u u
parallelo che uno pi` velocemente.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 4 / 45
5. I limiti fisici delle architetture scalari
Un processore ` un chip di silicio con dei transistor stampati.
e
Processori pi` potenti grazie alla miniaturizzazione dei transistor, di
u
feature size λ:
Se λ → 0 :
Il numero dei transistor scala come N ∝ 1
λ2
Il tempo di calcolo solo come τ ∝ λ1
⇒ E’ pi` facile costruire macchine capaci di compiere pi` e pi` task in
u u u
parallelo che uno pi` velocemente.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 4 / 45
7. 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 serialit`.
a
Scarsa potenza di calcolo.
GPUs:
Ottimizzate per computazioni parallele, pi` transistors dedicati alle
u
operazioni di calcolo.
Latenze ammortizzate dall’esecuzione concorrente di pi` threads
u
(SIMT).
Efficienza derivante da capacit` di tenere locali i dati.
a
Alto troughput e parallelismo garantiti dalla presenza di centinaia di
unit` di calcolo.
a
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 6 / 45
8. 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 serialit`.
a
Scarsa potenza di calcolo.
GPUs:
Ottimizzate per computazioni parallele, pi` transistors dedicati alle
u
operazioni di calcolo.
Latenze ammortizzate dall’esecuzione concorrente di pi` threads
u
(SIMT).
Efficienza derivante da capacit` di tenere locali i dati.
a
Alto troughput e parallelismo garantiti dalla presenza di centinaia di
unit` di calcolo.
a
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 6 / 45
9. Meglio una bassa latenza o un alto troughput?
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 7 / 45
10. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 8 / 45
11. Struttura di una GPU
Terminologia comune:
CPU (central processing unit) ≡ Host: il computer su cui ` installata la GPU
e
GPU (graphics processing unit) ≡ Device: scheda video/GPU.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 9 / 45
12. Struttura di una GPU
Il device ha una RAM (device memory) off-chip ma sulla scheda.
Il processore (chip) ` formato da centinaia di processori scalari (SP).
e
Gli SP sono raggruppati fisicamente in gruppi da 8 in Multiprocessors.
Gli SP in uno stesso multiprocessor condividono la stessa shared memory.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 10 / 45
13. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 11 / 45
14. Threads
Una GPU mantiene in esecuzione migliaia di threads per
ammortizzare le latenze dei singoli.
Un thread ` un’istanza di un algoritmo che viene fatta eseguire su una
e
porzione dei dati.
Lo stato di un thread ` definito da:
e
Il valore nei suoi registri.
Il suo indice.
La posizione dell’istruzione che sta eseguendo (∼ instruction pointer).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 12 / 45
15. Threads
Una GPU mantiene in esecuzione migliaia di threads per
ammortizzare le latenze dei singoli.
Un thread ` un’istanza di un algoritmo che viene fatta eseguire su una
e
porzione dei dati.
Lo stato di un thread ` definito da:
e
Il valore nei suoi registri.
Il suo indice.
La posizione dell’istruzione che sta eseguendo (∼ instruction pointer).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 12 / 45
16. Kernels
L’insieme dei threads che risolvono un problema ` chiamato kernel, o
e
griglia di threads.
!
Ogni thread all’interno del kernel (griglia) ` identificato da un indice.
e
Un kernel viene lanciato dall’host su uno o pi` device.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 13 / 45
17. Blocks
I vari device eseguono i threads raggruppandoli in blocks (vicinati).
I threads in un block condividono la shared memory.
Un block ` l’analogo software del multiprocessor, ma un
e
multiprocessor ha allocati pi` blocks.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 14 / 45
21. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 18 / 45
22. CUDA
Framework proprietario di NVIDIA per la programmazione di GPU
NVIDIA.
Pro:
Ben documentato.
Strutturato come estensione al linguaggio C.
Compatibile con C++, templates.
Multipiattaforma
Esistono port per multicore.
Molte librerie ottimizzate (cuFFT, cublas, cudpp, thrust).
Standard de-facto.
Contro:
Lock-in?
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 19 / 45
23. OpenCL
Framework standard open per la programmazione di GPU e
architetture parallele massive in genere.
Pro:
Funziona su tutte le schede e anche sulle CPU multicore.
E’ uno standard open sviluppato da tutte le maggiori case
produttrici/sviluppatrici.
Contro:
Ancora poche librerie rilasciate.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 20 / 45
24. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 21 / 45
25. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 22 / 45
26. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 22 / 45
27. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 23 / 45
28. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
29. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
30. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
31. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
33. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 26 / 45
34. Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non ` possibile eseguire il codice CPU su una GPU.
e
Il codice per GPU e CPU pu` essere scritto nello stesso file .cu.
o
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale pu`
o
essere eseguita:
sulla CPU → pu` accedere solo alla memoria host
o
sulla GPU → pu` accedere solo alla memoria device
o
A seconda dell’ambito di funzione, essa pu` essere chiamata:
o
dalla CPU
dalla GPU
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
35. Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non ` possibile eseguire il codice CPU su una GPU.
e
Il codice per GPU e CPU pu` essere scritto nello stesso file .cu.
o
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale pu`
o
essere eseguita:
sulla CPU → pu` accedere solo alla memoria host
o
sulla GPU → pu` accedere solo alla memoria device
o
A seconda dell’ambito di funzione, essa pu` essere chiamata:
o
dalla CPU
dalla GPU
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
36. Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non ` possibile eseguire il codice CPU su una GPU.
e
Il codice per GPU e CPU pu` essere scritto nello stesso file .cu.
o
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale pu`
o
essere eseguita:
sulla CPU → pu` accedere solo alla memoria host
o
sulla GPU → pu` accedere solo alla memoria device
o
A seconda dell’ambito di funzione, essa pu` essere chiamata:
o
dalla CPU
dalla GPU
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
37. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
38. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
39. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
40. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
41. Esempio
Dichiarazione di una funzione device:
device f l o a t gpu sqr ( f l o a t x ){ return x∗x ; }
Dichiarazione kernel:
global v o i d 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) r e t u r n ;
x [ i ] = gpu sqr ( x [ i ] ) ;
}
NB: threadIdx.x, blockIdx.x, blockDim.x variabili definite automaticamente
dal compilatore che servono per far comunicare al thread la sua posizione
nella griglia e quindi quali dati processare.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 29 / 45
42. Kernel Call
La funzione global ` il punto di ingresso per il calcolo su GPU.
e
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in un
array.
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 conterr` i quadrati dei
a
numeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e si
sceglie di solito per minimizzare l’occupancy (si vedano gli esempi
NVIDIA).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
43. Kernel Call
La funzione global ` il punto di ingresso per il calcolo su GPU.
e
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in un
array.
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 conterr` i quadrati dei
a
numeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e si
sceglie di solito per minimizzare l’occupancy (si vedano gli esempi
NVIDIA).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
44. Kernel Call
La funzione global ` il punto di ingresso per il calcolo su GPU.
e
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in un
array.
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 conterr` i quadrati dei
a
numeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e si
sceglie di solito per minimizzare l’occupancy (si vedano gli esempi
NVIDIA).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
45. Montaggio
// . . .
i n t main ( v o i d ) // ` e host di default !
{
int N = 1024;
f l o a t ∗ x h o s t = new f l o a t [ N ] ;
f lo a t ∗ x dev = 0;
c u d a M a l l o c (& x d e v , s i z e o f ( f l o a t ) ∗N ) ;
f o r ( i n t i =0; i <N ; i ++) x h o s t [ i ]= i ;
cudaMemcpy ( x d e v , x h o s t , s i z e o f ( f l o a t ) ∗N, cudaMem
s q r a l l <<<N/256,256>>>( x d e v , N ) ;
cudaMemcpy ( x h o s t , x d e v , s i z e o f ( f l o a t ) ∗N, cudaMem
f o r ( i n t i =0; i <N ; i ++) p r i n t f (% f n , x h o s t [ i ] ) ;
}
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 31 / 45
46. Caveat
for(int i=0;i<N;i++)printf(
“%fn” x dev[i]);
,
NEIN: x dev ` memoria del device,ci si pu` accedere solo da funzioni
e o
global o device!
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 32 / 45
47. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 33 / 45
48. Un esempio “fisico”
Moto di molti corpi puntiformi e di massa trascurabile in un campo
gravitazionale generato da due corpi massivi fissi.
Dinamica non lineare, richiede simulazione numerica.
Equazioni del moto (integrate poi con lo schema leapfrog):
¯
F = ma
m1 m2
F =k
r2
Il moto di ogni corpo ` indipendente dagli altri
e
→ ` possibile parallelizzare brutalmente e assegnare un thread per
e
ogni corpo.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 34 / 45
49. Un esempio “fisico”
Moto di molti corpi puntiformi e di massa trascurabile in un campo
gravitazionale generato da due corpi massivi fissi.
Dinamica non lineare, richiede simulazione numerica.
Equazioni del moto (integrate poi con lo schema leapfrog):
¯
F = ma
m1 m2
F =k
r2
Il moto di ogni corpo ` indipendente dagli altri
e
→ ` possibile parallelizzare brutalmente e assegnare un thread per
e
ogni corpo.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 34 / 45
50. Il codice
Il sorgente del programme ` contenuto nei files draw.cpp, 2body.cu.
e
2body.cu contiene la parte dedicata alla simulazione e a CUDA.
Pu` essere compilato con nvcc, il compilatore NVIDIA CUDA e gcc:
o
nvcc -c -O3 –compiler-options -fopenmp 2body.cu
g++ -c -O3 -m32 draw.cpp -ftree-vectorize
g++ -O3 -fopenmp -m32 -framework GLUT -framework OpenGL
2body.o draw.o -lcudart -L/usr/local/cuda/lib
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 35 / 45
51. Il codice
Il sorgente del programme ` contenuto nei files draw.cpp, 2body.cu.
e
2body.cu contiene la parte dedicata alla simulazione e a CUDA.
Pu` essere compilato con nvcc, il compilatore NVIDIA CUDA e gcc:
o
nvcc -c -O3 –compiler-options -fopenmp 2body.cu
g++ -c -O3 -m32 draw.cpp -ftree-vectorize
g++ -O3 -fopenmp -m32 -framework GLUT -framework OpenGL
2body.o draw.o -lcudart -L/usr/local/cuda/lib
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 35 / 45
53. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 37 / 45
54. Codici PIC
Plasma: interazione bidirezionale particelle-campi elettromagnetici.
Speedup ˜15x.
(se c’` tempo faccio vedere qualche simulazioncina live)
e
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 38 / 45
55. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 39 / 45