[SLIDE]Modellazione della dinamica di un liquido bifase mediante GPU CUDAkylanee
Presentazione per prelaurea.
I risultati del lavoro aggiornati sono disponibili nell'elaborato completo: http://www.slideshare.net/kylanee/tesi-11937891
Oggi sono disponibili supercomputer che raggiungono potenze di calcolo dell'ordine di 10^15 operazioni al secondo. Nel seminario si illustrano le caratteristiche principali di questi supersistemi e si riporterà la realtà sarda del CRS4 in cui è presente un cluster di calcolo ad alte prestazioni e un data center al servizio della ricerca scientifica.
A brute forcing system for DES cryptosystem based on distributed computing architecture built using OpenMP OpenMPI and also with support for CUDA architectures.
Tesi Accesso casuale nei sistemi satellitari utilizzando l'algoritmo slotted ...JasValencic
Tesi sull'accesso casuale nei sistemi satellitari utilizzando l'algoritmo slotted Aloha in presenza di diversità di pacchetto e cancellazione dell'interferenza.
Tesi Accesso casuale nei sistemi satellitari utilizzando l'algoritmo slotted ...Asia Valencic
Tesi sull'accesso casuale nei sistemi satellitari utilizzando
l'algoritmo slotted Aloha in presenza di diversità di
pacchetto e cancellazione dell'interferenza.
[SLIDE]Modellazione della dinamica di un liquido bifase mediante GPU CUDAkylanee
Presentazione per prelaurea.
I risultati del lavoro aggiornati sono disponibili nell'elaborato completo: http://www.slideshare.net/kylanee/tesi-11937891
Oggi sono disponibili supercomputer che raggiungono potenze di calcolo dell'ordine di 10^15 operazioni al secondo. Nel seminario si illustrano le caratteristiche principali di questi supersistemi e si riporterà la realtà sarda del CRS4 in cui è presente un cluster di calcolo ad alte prestazioni e un data center al servizio della ricerca scientifica.
A brute forcing system for DES cryptosystem based on distributed computing architecture built using OpenMP OpenMPI and also with support for CUDA architectures.
Tesi Accesso casuale nei sistemi satellitari utilizzando l'algoritmo slotted ...JasValencic
Tesi sull'accesso casuale nei sistemi satellitari utilizzando l'algoritmo slotted Aloha in presenza di diversità di pacchetto e cancellazione dell'interferenza.
Tesi Accesso casuale nei sistemi satellitari utilizzando l'algoritmo slotted ...Asia Valencic
Tesi sull'accesso casuale nei sistemi satellitari utilizzando
l'algoritmo slotted Aloha in presenza di diversità di
pacchetto e cancellazione dell'interferenza.
Presentazione nell'ambito del corso di Sistemi Operativi Avanzati 14/15 della magistrale in Informatica dell'Università degli Studi di Salerno. Autori: Giovanni Grano & Gino Farisano
This document provides an overview of CUDA (Compute Unified Device Architecture) and GPU programming. It begins with definitions of CUDA and GPU hardware architecture. The history of GPU development from basic graphics cards to modern programmable GPUs is discussed. The document then covers the CUDA programming model including the device model with multiprocessors and threads, and the execution model with grids, blocks and threads. It includes a code example to calculate squares on the GPU. Performance results are shown for different GPUs on a radix sort algorithm. The document concludes that GPU computing is powerful and will continue growing in importance for applications.
The document discusses using GPUs for general purpose computing. It provides examples showing that GPUs can compute normal vectors for images significantly faster than CPUs, with times of 125 clock cycles for a 640x480 image on GPU vs 625 on CPU and 172 clock cycles for a 1280x1024 image on GPU vs 2500 on CPU. It also provides an overview of tools for GPGPU programming, such as CUDA and shader languages, and how GPUs are specialized for parallel processing which allows them to outperform CPUs for certain tasks.
1. CUDA provides a programming environment and APIs that allow developers to leverage GPUs for general purpose computing. The CUDA C API offers both a high-level runtime API and a lower-level driver API.
2. CUDA programs define kernels that execute many parallel threads on the GPU. Threads are organized into blocks that can cooperate through shared memory, and blocks are organized into grids.
3. The CUDA memory model includes a hierarchy from fast per-thread registers to slower shared, global, and host memories. This hierarchy allows threads within blocks to communicate efficiently through shared memory.
CUDA is a parallel computing platform and programming model developed by Nvidia that allows software developers and researchers to utilize GPUs for general purpose processing. CUDA allows developers to achieve up to 100x performance gains over CPU-only applications. CUDA works by having the CPU copy input data to GPU memory, executing a kernel program on the GPU that runs in parallel across many threads, and copying the results back to CPU memory. Key GPU memories that can be used in CUDA programs include shared memory for thread cooperation, textures for cached reads, and constants for read-only data.
An introduction to the OpenMP parallel programming model.
From the Scalable Computing Support Center at Duke University (http://wiki.duke.edu/display/scsc)
The document discusses Compute Unified Device Architecture (CUDA), which is a parallel computing platform and programming model created by Nvidia that allows software developers to use GPUs for general-purpose processing. It provides an overview of CUDA, including its execution model, implementation details, applications, and advantages/drawbacks. The document also covers CUDA programming, compiling CUDA code, CUDA architectures, and concludes that CUDA has brought significant innovations to high performance computing.
Breve guida per assemblare il nostro nuovo
pc. Divisa in fasi l'intera procedura e presentata in solo documento, così da rendere più facile la lettura, e la
comprensione.
Presentazione nell'ambito del corso di Sistemi Operativi Avanzati 14/15 della magistrale in Informatica dell'Università degli Studi di Salerno. Autori: Giovanni Grano & Gino Farisano
This document provides an overview of CUDA (Compute Unified Device Architecture) and GPU programming. It begins with definitions of CUDA and GPU hardware architecture. The history of GPU development from basic graphics cards to modern programmable GPUs is discussed. The document then covers the CUDA programming model including the device model with multiprocessors and threads, and the execution model with grids, blocks and threads. It includes a code example to calculate squares on the GPU. Performance results are shown for different GPUs on a radix sort algorithm. The document concludes that GPU computing is powerful and will continue growing in importance for applications.
The document discusses using GPUs for general purpose computing. It provides examples showing that GPUs can compute normal vectors for images significantly faster than CPUs, with times of 125 clock cycles for a 640x480 image on GPU vs 625 on CPU and 172 clock cycles for a 1280x1024 image on GPU vs 2500 on CPU. It also provides an overview of tools for GPGPU programming, such as CUDA and shader languages, and how GPUs are specialized for parallel processing which allows them to outperform CPUs for certain tasks.
1. CUDA provides a programming environment and APIs that allow developers to leverage GPUs for general purpose computing. The CUDA C API offers both a high-level runtime API and a lower-level driver API.
2. CUDA programs define kernels that execute many parallel threads on the GPU. Threads are organized into blocks that can cooperate through shared memory, and blocks are organized into grids.
3. The CUDA memory model includes a hierarchy from fast per-thread registers to slower shared, global, and host memories. This hierarchy allows threads within blocks to communicate efficiently through shared memory.
CUDA is a parallel computing platform and programming model developed by Nvidia that allows software developers and researchers to utilize GPUs for general purpose processing. CUDA allows developers to achieve up to 100x performance gains over CPU-only applications. CUDA works by having the CPU copy input data to GPU memory, executing a kernel program on the GPU that runs in parallel across many threads, and copying the results back to CPU memory. Key GPU memories that can be used in CUDA programs include shared memory for thread cooperation, textures for cached reads, and constants for read-only data.
An introduction to the OpenMP parallel programming model.
From the Scalable Computing Support Center at Duke University (http://wiki.duke.edu/display/scsc)
The document discusses Compute Unified Device Architecture (CUDA), which is a parallel computing platform and programming model created by Nvidia that allows software developers to use GPUs for general-purpose processing. It provides an overview of CUDA, including its execution model, implementation details, applications, and advantages/drawbacks. The document also covers CUDA programming, compiling CUDA code, CUDA architectures, and concludes that CUDA has brought significant innovations to high performance computing.
Breve guida per assemblare il nostro nuovo
pc. Divisa in fasi l'intera procedura e presentata in solo documento, così da rendere più facile la lettura, e la
comprensione.
1. Programmazione di GPUs con CUDA:
Un nuovo approccio al parallelismo
Francesco Rossi
mail.francesco.rossi@gmail.com
16/12/2009
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 1 / 45
2. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 2 / 45
3. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 3 / 45
4. I limiti fisici delle architetture scalari
Un processore ` un chip di silicio con dei transistor stampati.
e
Processori pi` potenti grazie alla miniaturizzazione dei transistor, di
u
feature size λ:
Se λ → 0 :
Il numero dei transistor scala come N ∝ 1
λ2
Il tempo di calcolo solo come τ ∝ λ1
⇒ E’ pi` facile costruire macchine capaci di compiere pi` e pi` task in
u u u
parallelo che uno pi` velocemente.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 4 / 45
5. I limiti fisici delle architetture scalari
Un processore ` un chip di silicio con dei transistor stampati.
e
Processori pi` potenti grazie alla miniaturizzazione dei transistor, di
u
feature size λ:
Se λ → 0 :
Il numero dei transistor scala come N ∝ 1
λ2
Il tempo di calcolo solo come τ ∝ λ1
⇒ E’ pi` facile costruire macchine capaci di compiere pi` e pi` task in
u u u
parallelo che uno pi` velocemente.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 4 / 45
7. Meglio una bassa latenza o un alto troughput?
CPUs:
Ottimizzate per avere accesso a bassa latenza ad estese memorie cache.
Molti transistor impegnati nella predizione dei branches.
Drawbacks:
Parallelismo massivo inibito.
Illusione della serialit`.
a
Scarsa potenza di calcolo.
GPUs:
Ottimizzate per computazioni parallele, pi` transistors dedicati alle
u
operazioni di calcolo.
Latenze ammortizzate dall’esecuzione concorrente di pi` threads
u
(SIMT).
Efficienza derivante da capacit` di tenere locali i dati.
a
Alto troughput e parallelismo garantiti dalla presenza di centinaia di
unit` di calcolo.
a
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 6 / 45
8. Meglio una bassa latenza o un alto troughput?
CPUs:
Ottimizzate per avere accesso a bassa latenza ad estese memorie cache.
Molti transistor impegnati nella predizione dei branches.
Drawbacks:
Parallelismo massivo inibito.
Illusione della serialit`.
a
Scarsa potenza di calcolo.
GPUs:
Ottimizzate per computazioni parallele, pi` transistors dedicati alle
u
operazioni di calcolo.
Latenze ammortizzate dall’esecuzione concorrente di pi` threads
u
(SIMT).
Efficienza derivante da capacit` di tenere locali i dati.
a
Alto troughput e parallelismo garantiti dalla presenza di centinaia di
unit` di calcolo.
a
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 6 / 45
9. Meglio una bassa latenza o un alto troughput?
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 7 / 45
10. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 8 / 45
11. Struttura di una GPU
Terminologia comune:
CPU (central processing unit) ≡ Host: il computer su cui ` installata la GPU
e
GPU (graphics processing unit) ≡ Device: scheda video/GPU.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 9 / 45
12. Struttura di una GPU
Il device ha una RAM (device memory) off-chip ma sulla scheda.
Il processore (chip) ` formato da centinaia di processori scalari (SP).
e
Gli SP sono raggruppati fisicamente in gruppi da 8 in Multiprocessors.
Gli SP in uno stesso multiprocessor condividono la stessa shared memory.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 10 / 45
13. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 11 / 45
14. Threads
Una GPU mantiene in esecuzione migliaia di threads per
ammortizzare le latenze dei singoli.
Un thread ` un’istanza di un algoritmo che viene fatta eseguire su una
e
porzione dei dati.
Lo stato di un thread ` definito da:
e
Il valore nei suoi registri.
Il suo indice.
La posizione dell’istruzione che sta eseguendo (∼ instruction pointer).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 12 / 45
15. Threads
Una GPU mantiene in esecuzione migliaia di threads per
ammortizzare le latenze dei singoli.
Un thread ` un’istanza di un algoritmo che viene fatta eseguire su una
e
porzione dei dati.
Lo stato di un thread ` definito da:
e
Il valore nei suoi registri.
Il suo indice.
La posizione dell’istruzione che sta eseguendo (∼ instruction pointer).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 12 / 45
16. Kernels
L’insieme dei threads che risolvono un problema ` chiamato kernel, o
e
griglia di threads.
!
Ogni thread all’interno del kernel (griglia) ` identificato da un indice.
e
Un kernel viene lanciato dall’host su uno o pi` device.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 13 / 45
17. Blocks
I vari device eseguono i threads raggruppandoli in blocks (vicinati).
I threads in un block condividono la shared memory.
Un block ` l’analogo software del multiprocessor, ma un
e
multiprocessor ha allocati pi` blocks.
u
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 14 / 45
21. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 18 / 45
22. CUDA
Framework proprietario di NVIDIA per la programmazione di GPU
NVIDIA.
Pro:
Ben documentato.
Strutturato come estensione al linguaggio C.
Compatibile con C++, templates.
Multipiattaforma
Esistono port per multicore.
Molte librerie ottimizzate (cuFFT, cublas, cudpp, thrust).
Standard de-facto.
Contro:
Lock-in?
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 19 / 45
23. OpenCL
Framework standard open per la programmazione di GPU e
architetture parallele massive in genere.
Pro:
Funziona su tutte le schede e anche sulle CPU multicore.
E’ uno standard open sviluppato da tutte le maggiori case
produttrici/sviluppatrici.
Contro:
Ancora poche librerie rilasciate.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 20 / 45
24. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 21 / 45
25. cudaMalloc
!
le memorie device e host sono RAM diverse e separate.
Serve per allocare memoria sul device.
Simile a malloc sull’host.
float *device pointer=0;
cudaMalloc(&device pointer, sizeof(float)*N);
serve per allocare sulla GPU un array di N floats.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 22 / 45
26. cudaMalloc
!
le memorie device e host sono RAM diverse e separate.
Serve per allocare memoria sul device.
Simile a malloc sull’host.
float *device pointer=0;
cudaMalloc(&device pointer, sizeof(float)*N);
serve per allocare sulla GPU un array di N floats.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 22 / 45
27. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 23 / 45
28. cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,
dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,
cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToDevice);
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
29. cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,
dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,
cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToDevice);
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
30. cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,
dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,
cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToDevice);
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
31. cudaMemcpy
Sintassi: cudaMemcpy(puntatore a destinazione, puntatore sorgente,
dimensione in bytes, flag cuda)
Copia un segmento di memoria (nell’esempio copia N floats):
dall’host al device :
cudaMemcpy(device ptr, host ptr, sizeof(float)*N,
cudaMemcpyHostToDevice);
dal device all’host:
cudaMemcpy(host ptr, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToHost);
dal device al device o dall’host all’host (equivalente a memcpy):
cudaMemcpy(device ptr2, device ptr, sizeof(float)*N,
cudaMemcpyDeviceToDevice);
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 24 / 45
33. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 26 / 45
34. Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non ` possibile eseguire il codice CPU su una GPU.
e
Il codice per GPU e CPU pu` essere scritto nello stesso file .cu.
o
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale pu`
o
essere eseguita:
sulla CPU → pu` accedere solo alla memoria host
o
sulla GPU → pu` accedere solo alla memoria device
o
A seconda dell’ambito di funzione, essa pu` essere chiamata:
o
dalla CPU
dalla GPU
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
35. Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non ` possibile eseguire il codice CPU su una GPU.
e
Il codice per GPU e CPU pu` essere scritto nello stesso file .cu.
o
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale pu`
o
essere eseguita:
sulla CPU → pu` accedere solo alla memoria host
o
sulla GPU → pu` accedere solo alla memoria device
o
A seconda dell’ambito di funzione, essa pu` essere chiamata:
o
dalla CPU
dalla GPU
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
36. Ambiti delle funzioni
!
GPU e CPU eseguono codice separato:
non ` possibile eseguire il codice CPU su una GPU.
e
Il codice per GPU e CPU pu` essere scritto nello stesso file .cu.
o
Ogni funzione C (in CUDA) ha un su ambito, a seconda del quale pu`
o
essere eseguita:
sulla CPU → pu` accedere solo alla memoria host
o
sulla GPU → pu` accedere solo alla memoria device
o
A seconda dell’ambito di funzione, essa pu` essere chiamata:
o
dalla CPU
dalla GPU
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 27 / 45
37. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
38. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
39. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
40. Indicare l’ambito
I qualificatori intrinseci del compilatore CUDA global device e
host servono a specificare l’ambito di una funzione C.
!
Le funzioni che vengono eseguite sulla GPU sono quelle di ambito
device e global .
Dalla GPU si possono chiamare solo le funzioni dichiarate come
device .
Dalla CPU si possono chiamare:
Le funzioni host (il qualificatore ` acceso di default se ` omesso
e e
ogni altro qualificatore)
I kernels, dichiarati come global .
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 28 / 45
41. Esempio
Dichiarazione di una funzione device:
device f l o a t gpu sqr ( f l o a t x ){ return x∗x ; }
Dichiarazione kernel:
global v o i d s q r a l l ( f l o a t ∗ x , i n t N)
{
i n t i = t h r e a d I d x . x + b l o c k I d x . x ∗ blockDim . x ;
i f ( i >=N) r e t u r n ;
x [ i ] = gpu sqr ( x [ i ] ) ;
}
NB: threadIdx.x, blockIdx.x, blockDim.x variabili definite automaticamente
dal compilatore che servono per far comunicare al thread la sua posizione
nella griglia e quindi quali dati processare.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 29 / 45
42. Kernel Call
La funzione global ` il punto di ingresso per il calcolo su GPU.
e
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in un
array.
Il kernel si lancia dall’host sulla GPU con la seguente istruzione:
sqr all<<<N/block size,block size>>> (device ptr, N);
Finita l’elaborazione l’array device device ptr conterr` i quadrati dei
a
numeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e si
sceglie di solito per minimizzare l’occupancy (si vedano gli esempi
NVIDIA).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
43. Kernel Call
La funzione global ` il punto di ingresso per il calcolo su GPU.
e
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in un
array.
Il kernel si lancia dall’host sulla GPU con la seguente istruzione:
sqr all<<<N/block size,block size>>> (device ptr, N);
Finita l’elaborazione l’array device device ptr conterr` i quadrati dei
a
numeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e si
sceglie di solito per minimizzare l’occupancy (si vedano gli esempi
NVIDIA).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
44. Kernel Call
La funzione global ` il punto di ingresso per il calcolo su GPU.
e
Nell’esempio serve a quadrare, in parallelo, i numeri contenuti in un
array.
Il kernel si lancia dall’host sulla GPU con la seguente istruzione:
sqr all<<<N/block size,block size>>> (device ptr, N);
Finita l’elaborazione l’array device device ptr conterr` i quadrati dei
a
numeri iniziali.
NB prima bisogna allocare e sincronizzare le memorie!
block size serve per impostare la dimensione dei thread blocks, e si
sceglie di solito per minimizzare l’occupancy (si vedano gli esempi
NVIDIA).
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 30 / 45
45. Montaggio
// . . .
i n t main ( v o i d ) // ` e host di default !
{
int N = 1024;
f l o a t ∗ x h o s t = new f l o a t [ N ] ;
f lo a t ∗ x dev = 0;
c u d a M a l l o c (& x d e v , s i z e o f ( f l o a t ) ∗N ) ;
f o r ( i n t i =0; i <N ; i ++) x h o s t [ i ]= i ;
cudaMemcpy ( x d e v , x h o s t , s i z e o f ( f l o a t ) ∗N, cudaMem
s q r a l l <<<N/256,256>>>( x d e v , N ) ;
cudaMemcpy ( x h o s t , x d e v , s i z e o f ( f l o a t ) ∗N, cudaMem
f o r ( i n t i =0; i <N ; i ++) p r i n t f (% f n , x h o s t [ i ] ) ;
}
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 31 / 45
46. Caveat
for(int i=0;i<N;i++)printf(
“%fn” x dev[i]);
,
NEIN: x dev ` memoria del device,ci si pu` accedere solo da funzioni
e o
global o device!
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 32 / 45
47. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 33 / 45
48. Un esempio “fisico”
Moto di molti corpi puntiformi e di massa trascurabile in un campo
gravitazionale generato da due corpi massivi fissi.
Dinamica non lineare, richiede simulazione numerica.
Equazioni del moto (integrate poi con lo schema leapfrog):
¯
F = ma
m1 m2
F =k
r2
Il moto di ogni corpo ` indipendente dagli altri
e
→ ` possibile parallelizzare brutalmente e assegnare un thread per
e
ogni corpo.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 34 / 45
49. Un esempio “fisico”
Moto di molti corpi puntiformi e di massa trascurabile in un campo
gravitazionale generato da due corpi massivi fissi.
Dinamica non lineare, richiede simulazione numerica.
Equazioni del moto (integrate poi con lo schema leapfrog):
¯
F = ma
m1 m2
F =k
r2
Il moto di ogni corpo ` indipendente dagli altri
e
→ ` possibile parallelizzare brutalmente e assegnare un thread per
e
ogni corpo.
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 34 / 45
50. Il codice
Il sorgente del programme ` contenuto nei files draw.cpp, 2body.cu.
e
2body.cu contiene la parte dedicata alla simulazione e a CUDA.
Pu` essere compilato con nvcc, il compilatore NVIDIA CUDA e gcc:
o
nvcc -c -O3 –compiler-options -fopenmp 2body.cu
g++ -c -O3 -m32 draw.cpp -ftree-vectorize
g++ -O3 -fopenmp -m32 -framework GLUT -framework OpenGL
2body.o draw.o -lcudart -L/usr/local/cuda/lib
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 35 / 45
51. Il codice
Il sorgente del programme ` contenuto nei files draw.cpp, 2body.cu.
e
2body.cu contiene la parte dedicata alla simulazione e a CUDA.
Pu` essere compilato con nvcc, il compilatore NVIDIA CUDA e gcc:
o
nvcc -c -O3 –compiler-options -fopenmp 2body.cu
g++ -c -O3 -m32 draw.cpp -ftree-vectorize
g++ -O3 -fopenmp -m32 -framework GLUT -framework OpenGL
2body.o draw.o -lcudart -L/usr/local/cuda/lib
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 35 / 45
53. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 37 / 45
54. Codici PIC
Plasma: interazione bidirezionale particelle-campi elettromagnetici.
Speedup ˜15x.
(se c’` tempo faccio vedere qualche simulazioncina live)
e
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 38 / 45
55. Outline
1 Introduzione
Perch` le GPU
e
2 Programmare le GPU
Struttura di una GPU
Threads, kernels, blocks
Due frameworks: CUDA e OpenCL
3 Primi passi con CUDA
Allocare la memoria
Sincronizzare i dati
Lanciare l’elaborazione
Un esempio pi` pratico
u
4 Applicazioni
Metodi PIC per la simulazione di fenomeni laser-plasma
Raytracing
Francesco Rossimail.francesco.rossi@gmail.com ()Programmazione di GPUs con CUDA: 16/12/2009 39 / 45