SlideShare a Scribd company logo
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
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
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
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
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
Storia del parallelismo




Francesco Rossimail.francesco.rossi@gmail.com ()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 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
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
Meglio una bassa latenza o un alto troughput?




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   7 / 45
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
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
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
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
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
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
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
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
In sintesi




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   15 / 45
In sintesi




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   16 / 45
In sintesi




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   17 / 45
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
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
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
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
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
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
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
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
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
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
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
cudaMemcpy




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   25 / 45
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Visualizzazione tomografia




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   40 / 45
NUME @ cineca




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   41 / 45
NUME @ cineca




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   42 / 45
NUME @ cineca




Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   43 / 45
NUME @ cineca




Francesco Rossimail.francesco.rossi@gmail.com ()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 Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA:   16/12/2009   45 / 45

More Related Content

What's hot

Thread
ThreadThread
La storia della ram
La storia della ramLa storia della ram
La storia della ram
graziano98
 
Dsp cosa sono i digital signal processor - seconda parte - 2010-10-19
Dsp  cosa sono i digital signal processor  - seconda parte - 2010-10-19Dsp  cosa sono i digital signal processor  - seconda parte - 2010-10-19
Dsp cosa sono i digital signal processor - seconda parte - 2010-10-19Ionela
 
Algoritmo di Dijkstra
Algoritmo di DijkstraAlgoritmo di Dijkstra
Algoritmo di Dijkstra
MassimoPalmisano
 

What's hot (6)

Thread
ThreadThread
Thread
 
La storia della ram
La storia della ramLa storia della ram
La storia della ram
 
Cpu
CpuCpu
Cpu
 
Dsp cosa sono i digital signal processor - seconda parte - 2010-10-19
Dsp  cosa sono i digital signal processor  - seconda parte - 2010-10-19Dsp  cosa sono i digital signal processor  - seconda parte - 2010-10-19
Dsp cosa sono i digital signal processor - seconda parte - 2010-10-19
 
Algoritmo di Dijkstra
Algoritmo di DijkstraAlgoritmo di Dijkstra
Algoritmo di Dijkstra
 
E1 Memorie
E1 MemorieE1 Memorie
E1 Memorie
 

Viewers also liked

GPU: Understanding CUDA
GPU: Understanding CUDAGPU: Understanding CUDA
GPU: Understanding CUDA
Joaquín Aparicio Ramos
 
Gpgpu
GpgpuGpgpu
Gpgpu
Su Yan-Jen
 
Cuda Architecture
Cuda ArchitectureCuda Architecture
Cuda Architecture
Piyush Mittal
 
Introduction to CUDA
Introduction to CUDAIntroduction to CUDA
Introduction to CUDA
Raymond Tay
 
Intro to OpenMP
Intro to OpenMPIntro to OpenMP
Intro to OpenMP
jbp4444
 
Cuda
CudaCuda
CUDA
CUDACUDA

Viewers also liked (7)

GPU: Understanding CUDA
GPU: Understanding CUDAGPU: Understanding CUDA
GPU: Understanding CUDA
 
Gpgpu
GpgpuGpgpu
Gpgpu
 
Cuda Architecture
Cuda ArchitectureCuda Architecture
Cuda Architecture
 
Introduction to CUDA
Introduction to CUDAIntroduction to CUDA
Introduction to CUDA
 
Intro to OpenMP
Intro to OpenMPIntro to OpenMP
Intro to OpenMP
 
Cuda
CudaCuda
Cuda
 
CUDA
CUDACUDA
CUDA
 

Similar to Cuda 16 12 09

Assemblare un pc
Assemblare un pcAssemblare un pc
Assemblare un pc
HardwarePcJenny
 
A query-to-hardware compiler for FPGA architectures
A query-to-hardware compiler for FPGA architecturesA query-to-hardware compiler for FPGA architectures
A query-to-hardware compiler for FPGA architecturesEnrico Cambiaso
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatile
BioDec
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatile
Ivan Rossi
 
Struttura dell'elaboratore (sample)
Struttura dell'elaboratore (sample)Struttura dell'elaboratore (sample)
Struttura dell'elaboratore (sample)Parco nord.
 
Cpu Abacus
Cpu AbacusCpu Abacus
Cpu Abacus
abacus2010
 
02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx
02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx
02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx
ssuser62bca5
 
Open Storage Tra Storia E Tecnologia Share
Open Storage Tra Storia E Tecnologia ShareOpen Storage Tra Storia E Tecnologia Share
Open Storage Tra Storia E Tecnologia Share
Walter Moriconi
 
Agrillo Fedora 11 release party 18 giugno 2009
Agrillo Fedora 11 release party 18 giugno 2009Agrillo Fedora 11 release party 18 giugno 2009
Agrillo Fedora 11 release party 18 giugno 2009Giuseppe Agrillo
 
Introduzione ai Sistemi Operativi
Introduzione ai Sistemi OperativiIntroduzione ai Sistemi Operativi
Introduzione ai Sistemi Operativi
orestJump
 
Lezione 1
Lezione 1Lezione 1
Software libero nei sistemi embedded
Software libero nei sistemi embeddedSoftware libero nei sistemi embedded
Software libero nei sistemi embeddedDaniele Costarella
 
Presentazione tesi 2.0
Presentazione tesi 2.0Presentazione tesi 2.0
Presentazione tesi 2.0
MassimoPalmisano
 
Modulo1 lezione1
Modulo1 lezione1Modulo1 lezione1
Modulo1 lezione1scipag
 
Cell Programming 1
Cell Programming 1Cell Programming 1
Cell Programming 1
Vincenzo De Maio
 
Riassunto informatica ariel
Riassunto informatica arielRiassunto informatica ariel
Riassunto informatica arielloisi97
 
Sistemi lezione i - Presentazione - hardware
Sistemi   lezione i - Presentazione - hardwareSistemi   lezione i - Presentazione - hardware
Sistemi lezione i - Presentazione - hardwareUniversity of Catania
 

Similar to Cuda 16 12 09 (20)

Gpu
GpuGpu
Gpu
 
Assemblare un pc
Assemblare un pcAssemblare un pc
Assemblare un pc
 
A query-to-hardware compiler for FPGA architectures
A query-to-hardware compiler for FPGA architecturesA query-to-hardware compiler for FPGA architectures
A query-to-hardware compiler for FPGA architectures
 
Lezione1 introduzione micro
Lezione1 introduzione microLezione1 introduzione micro
Lezione1 introduzione micro
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatile
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatile
 
Struttura dell'elaboratore (sample)
Struttura dell'elaboratore (sample)Struttura dell'elaboratore (sample)
Struttura dell'elaboratore (sample)
 
Cpu Abacus
Cpu AbacusCpu Abacus
Cpu Abacus
 
Cpu abacus
Cpu abacusCpu abacus
Cpu abacus
 
02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx
02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx
02_-_Il_Personal_Computer_Dentro_e_Fuori_1.pptx
 
Open Storage Tra Storia E Tecnologia Share
Open Storage Tra Storia E Tecnologia ShareOpen Storage Tra Storia E Tecnologia Share
Open Storage Tra Storia E Tecnologia Share
 
Agrillo Fedora 11 release party 18 giugno 2009
Agrillo Fedora 11 release party 18 giugno 2009Agrillo Fedora 11 release party 18 giugno 2009
Agrillo Fedora 11 release party 18 giugno 2009
 
Introduzione ai Sistemi Operativi
Introduzione ai Sistemi OperativiIntroduzione ai Sistemi Operativi
Introduzione ai Sistemi Operativi
 
Lezione 1
Lezione 1Lezione 1
Lezione 1
 
Software libero nei sistemi embedded
Software libero nei sistemi embeddedSoftware libero nei sistemi embedded
Software libero nei sistemi embedded
 
Presentazione tesi 2.0
Presentazione tesi 2.0Presentazione tesi 2.0
Presentazione tesi 2.0
 
Modulo1 lezione1
Modulo1 lezione1Modulo1 lezione1
Modulo1 lezione1
 
Cell Programming 1
Cell Programming 1Cell Programming 1
Cell Programming 1
 
Riassunto informatica ariel
Riassunto informatica arielRiassunto informatica ariel
Riassunto informatica ariel
 
Sistemi lezione i - Presentazione - hardware
Sistemi   lezione i - Presentazione - hardwareSistemi   lezione i - Presentazione - hardware
Sistemi lezione i - Presentazione - hardware
 

Cuda 16 12 09

  • 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
  • 6. Storia del parallelismo Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 5 / 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
  • 18. In sintesi Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 15 / 45
  • 19. In sintesi Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 16 / 45
  • 20. In sintesi Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 17 / 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
  • 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. 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
  • 56. Visualizzazione tomografia Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 40 / 45
  • 57. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 41 / 45
  • 58. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 42 / 45
  • 59. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 43 / 45
  • 60. NUME @ cineca Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 44 / 45
  • 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