SlideShare una empresa de Scribd logo
1 de 61
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

La storia della ram
La storia della ramLa storia della ram
La storia della ramgraziano98
 
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
 

La actualidad más candente (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
 

Destacado (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 a Cuda 16 12 09

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 versatileBioDec
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileIvan Rossi
 
Struttura dell'elaboratore (sample)
Struttura dell'elaboratore (sample)Struttura dell'elaboratore (sample)
Struttura dell'elaboratore (sample)Parco nord.
 
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.pptxssuser62bca5
 
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 ShareWalter 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 OperativiorestJump
 
Software libero nei sistemi embedded
Software libero nei sistemi embeddedSoftware libero nei sistemi embedded
Software libero nei sistemi embeddedDaniele Costarella
 
Modulo1 lezione1
Modulo1 lezione1Modulo1 lezione1
Modulo1 lezione1scipag
 
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 a 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
 

Último

Tosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxTosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxlorenzodemidio01
 
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...Nguyen Thanh Tu Collection
 
Una breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereUna breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereMarco Chizzali
 
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxTeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxteccarellilorenzo
 
Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................giorgiadeascaniis59
 
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxlorenzodemidio01
 
TeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxTeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxteccarellilorenzo
 
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxlorenzodemidio01
 
Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxtecongo2007
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticanico07fusco
 
descrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxdescrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxtecongo2007
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxlorenzodemidio01
 
Storia-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxStoria-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxteccarellilorenzo
 
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024IISGiovanniVallePado
 
LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................giorgiadeascaniis59
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....giorgiadeascaniis59
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileNicola Rabbi
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxsasaselvatico
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxtecongo2007
 
Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.camillaorlando17
 

Último (20)

Tosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxTosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptx
 
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
 
Una breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereUna breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opere
 
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxTeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
 
Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................
 
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
 
TeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxTeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docx
 
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
 
Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptx
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informatica
 
descrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxdescrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptx
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
 
Storia-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxStoria-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptx
 
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
 
LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibile
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptx
 
Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.
 

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