Cuda 16 12 09

3,836 views

Published on

Lezione tenuta dal Dr. Francesco Rossi sulla programmazione scientifica usando le GPU

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,836
On SlideShare
0
From Embeds
0
Number of Embeds
2,074
Actions
Shares
0
Downloads
49
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Cuda 16 12 09

  1. 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. 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. 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. 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. 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
  6. 6. Storia del parallelismo Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 5 / 45
  7. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  18. 18. In sintesi Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 15 / 45
  19. 19. In sintesi Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 16 / 45
  20. 20. In sintesi Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 17 / 45
  21. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  32. 32. cudaMemcpy Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 25 / 45
  33. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  52. 52. Risultati: Performance boost Processore ˜Time Speedup 1 core Core2 613s 1x 2 cores Core2 367 1,7x 8 cores XEON 86s 7,12x 1 Geforce 9400M GPU 38.7s 16x 1 Tesla C1060 GPU 7.1s 87.5x 1 Geforce GTX280 6.4s 95,7x Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 36 / 45
  53. 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. 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. 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
  56. 56. Visualizzazione tomografia Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 40 / 45
  57. 57. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 41 / 45
  58. 58. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 42 / 45
  59. 59. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 43 / 45
  60. 60. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 44 / 45
  61. 61. 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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 45 / 45

×