Download pdf - Cuda 16 12 09

Transcript
Page 1: Cuda 16 12 09

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

Page 2: Cuda 16 12 09

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

Page 3: Cuda 16 12 09

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

Page 4: Cuda 16 12 09

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

Page 5: Cuda 16 12 09

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

Page 6: Cuda 16 12 09

Storia del parallelismo

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 5 / 45

Page 7: Cuda 16 12 09

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

Page 8: Cuda 16 12 09

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

Page 9: Cuda 16 12 09

Meglio una bassa latenza o un alto troughput?

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 7 / 45

Page 10: Cuda 16 12 09

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

Page 11: Cuda 16 12 09

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

Page 12: Cuda 16 12 09

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

Page 13: Cuda 16 12 09

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

Page 14: Cuda 16 12 09

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

Page 15: Cuda 16 12 09

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

Page 16: Cuda 16 12 09

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

Page 17: Cuda 16 12 09

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

Page 18: Cuda 16 12 09

In sintesi

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 15 / 45

Page 19: Cuda 16 12 09

In sintesi

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 16 / 45

Page 20: Cuda 16 12 09

In sintesi

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 17 / 45

Page 21: Cuda 16 12 09

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

Page 22: Cuda 16 12 09

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

Page 23: Cuda 16 12 09

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

Page 24: Cuda 16 12 09

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

Page 25: Cuda 16 12 09

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

Page 26: Cuda 16 12 09

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

Page 27: Cuda 16 12 09

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

Page 28: Cuda 16 12 09

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

Page 29: Cuda 16 12 09

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

Page 30: Cuda 16 12 09

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

Page 31: Cuda 16 12 09

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

Page 32: Cuda 16 12 09

cudaMemcpy

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 25 / 45

Page 33: Cuda 16 12 09

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

Page 34: Cuda 16 12 09

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

Page 35: Cuda 16 12 09

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

Page 36: Cuda 16 12 09

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

Page 37: Cuda 16 12 09

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

Page 38: Cuda 16 12 09

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

Page 39: Cuda 16 12 09

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

Page 40: Cuda 16 12 09

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

Page 41: Cuda 16 12 09

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

Page 42: Cuda 16 12 09

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

Page 43: Cuda 16 12 09

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

Page 44: Cuda 16 12 09

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

Page 45: Cuda 16 12 09

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

Page 46: Cuda 16 12 09

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

Page 47: Cuda 16 12 09

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

Page 48: Cuda 16 12 09

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

Page 49: Cuda 16 12 09

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

Page 50: Cuda 16 12 09

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

Page 51: Cuda 16 12 09

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

Page 52: Cuda 16 12 09

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

Page 53: Cuda 16 12 09

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

Page 54: Cuda 16 12 09

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

Page 55: Cuda 16 12 09

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

Page 56: Cuda 16 12 09

Visualizzazione tomografia

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 40 / 45

Page 57: Cuda 16 12 09

NUME @ cineca

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 41 / 45

Page 58: Cuda 16 12 09

NUME @ cineca

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 42 / 45

Page 59: Cuda 16 12 09

NUME @ cineca

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 43 / 45

Page 60: Cuda 16 12 09

NUME @ cineca

Francesco [email protected] ()Programmazione di GPUs con CUDA: 16/12/2009 44 / 45

Page 61: Cuda 16 12 09

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