SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...
GPU, CUDA, OpenCL and OpenACC for Parallel Applications
1. GPU, CUDA e OpenCL for parallel Applications
Ms. Eng. Marcos Amar´ıs Gonz´alez
Dr. Alfredo Goldman vel Lejbman
University of S˜ao Paulo
Institute of Mathematics an Statistics
Department of Science Computing
April, 2014
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 0 / 52
2. Timeline
1 GPUs e GPGPU
2 CUDA
Profiling e Optimiza¸c˜oes
3 OpenCL e OpenACC
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 0 / 52
3. GPUs
GPU, CUDA e OpenCL for parallel Applications
1 GPUs e GPGPU
2 CUDA
3 OpenCL e OpenACC
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 0 / 52
4. GPUs
Introdu¸c˜ao
80’ primeiro controlador de v´ıdeo.
Evolu¸c˜ao dos jogos 3D.
Maior poder computacional.
Al´em de gerar o cen´ario 3D, ´e preciso
aplicar texturas, ilumina¸c˜ao, som-
bras, reflex˜oes, etc.
Para tal, as placas gr´aficas pas-
saram a ser cada vez mais flex´ıveis
e poderosas
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 1 / 52
5. GPUs
Introdu¸c˜ao
O termo GPU foi popularizado pela Nvidia em
1999, que inventou a GeForce 256 como a
primeira GPU no mundo.
No 2002 fou lan¸cada a primeira GPU para
prop´osito geral.
O termo GPGPU foi cunhado por Mark Harris.
Os principais fabricantes de GPUs s˜ao a NVIDIA
e a AMD.
2005 NVIDIA lan¸cou CUDA, 2008 grupo
Khronos lan¸cou OpenCL, 2011 foi anunciado
OpenACC.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 2 / 52
6. GPUs
GPU de Prop´osito Geral
GPGPU (GPU de Prop´osito Geral).
GPGPU podem atuar em conjunto com CPUs Intel ou AMD.
Paralelismo do tipo SIMD.
Programa principal executa na CPU (host) e ´e o respons´avel por iniciar as threads
na GPU (device).
Tem sua pr´opria hierarquia de mem´oria e os dados devem ser transferidos atrav´es
de um barramento PCI Express.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 3 / 52
7. GPUs
Lei de Amdahl e Taxonomia de Flynn
Lei de Amdahl - 1967
A Lei de Amdahl ´e a lei que governa o speedup na utiliza¸c˜ao de proces-
sadores paralelos em rela¸c˜ao ao uso de apenas um processador.
Speedup:
S = Speed-up
P = Number of Processors
T = Time
Sp =
T1
Tp
(1)
Taxonomia de Flynn - 1966
Single Instruction Multiple Instruction
Single Data SISD - Sequential MISD
Multiple Data SIMD [SIMT] - GPU MIMD - Multicore
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 4 / 52
8. GPUs
Medidas de desempenho: FLOPS
FLOPS - FLoating-point Operations Per Second
Opera¸c˜oes de ponto flutuante por segundo
Forma simples: medir o n´umero de instru¸c˜oes por unidade de tempo.
No caso, instru¸c˜oes de ponto flutuante.
Linpack (sistemas densos de equa¸c˜oes lineares)
Melhor rela¸c˜ao desempenho/custo (Gflops/ $$);
Melhor rela¸c˜ao desempenho/consumo (Gflops/Watts);
Melhor rela¸c˜ao desempenho/volume (Gflops/Volume).
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 5 / 52
9. GPUs
GPU Versus CPU
Hoje em dia elas s˜ao capaz de realizar a computa¸c˜ao paralela mais eficiente
do que CPUs multicore.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 6 / 52
10. GPUs
Top 500 Supercomputers
Intel Core i7 990X: 6 n´ucleos, US$ 1000 Desempenho te´orico m´aximo de 0.4 TFLOP
GTX680: 1500 n´ucleos e 2GB, pre¸co US$500 Desempenho te´orico m´aximo de 3.0 TFLOP
Aceleradores e co-processadores no ranking dos 500 Supercomputadores mais r´apidos do mundo.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 7 / 52
11. GPUs
Top 500 Green Supercomputers $$$$$$
Ranking dos supercomputadores mais eficientes no mundo em termos de
energia.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 8 / 52
12. GPUs
RoadMap de Arquiteturas de GPU NVIDIA
Em GPUs modernas o consumo de energia ´e uma restri¸c˜ao importante.
Projetos de GPU s˜ao geralmente altamente escal´avel.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 9 / 52
13. GPUs
RoadMap de Arquiteturas de GPU NVIDIA
Em GPUs modernas o consumo de energia ´e uma restri¸c˜ao importante.
Projetos de GPU s˜ao geralmente altamente escal´avel.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 9 / 52
14. GPUs
RoadMap de Arquiteturas de GPU NVIDIA
Compute Capability ´e uma diferencia¸c˜ao entre arquiteturas e modelos de
GPUs da NVIDIA, para certas especifica¸c˜oes de hardware e software em
elas.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 10 / 52
15. GPUs
Arquitetura de uma GPU NVIDIA
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 11 / 52
16. GPUs
Arquitetura Tesla
Arquitetura Tesla, ela ´e umas das primeiras com suporte a CUDA. Seu mul-
tiprocessador tem 8 processadores e at´e 16 Kb de mem´oria compartilhada.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 12 / 52
18. GPUs
Escalonador de Warps
Ocultar latˆencia
1 escalonador de Warps em arquiteturas Tesla, 2 na arquitetura Fermi e
Kepler tem 4 escalonadores de Warp.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 14 / 52
19. GPUs
Escalonador de Warps
Ocultar latˆencia
1 escalonador de Warps em arquiteturas Tesla, 2 na arquitetura Fermi e
Kepler tem 4 escalonadores de Warp.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 14 / 52
20. GPUs
Arquitetura Kepler
Arquitetura Kepler tem um multiprocessador (SMX) de 192 processadores,
32 SFU, 32 unidades de escrita e leitura, arquivo de 64 kb de registradores,
etc...
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 15 / 52
21. GPUs
Arquitetura Kepler
Arquitetura Kepler tem um multiprocessador (SMX) de 192 processadores,
32 SFU, 32 unidades de escrita e leitura, arquivo de 64 kb de registradores,
etc...
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 15 / 52
22. CUDA
GPU, CUDA e OpenCL for parallel Applications
1 GPUs e GPGPU
2 CUDA
3 OpenCL e OpenACC
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 15 / 52
23. CUDA
Compute Unified Device Architecture
CUDA - Compute Unified Device Architecture
CUDA ´e uma linguagem propriet´aria para programa¸c˜ao em GPUs desenvolvida pela
NVIDIA.
O CUDA est´a na vers˜ao 7.0 atualmente, avan¸ca tamb´em segundo o Compute
Capability das GPUs.
Ela ´e uma extens˜ao da linguagem C, e permite controlar a execu¸c˜ao de threads na
GPU e gerenciar sua mem´oria.
Ambiente CUDA
CUDA Driver
CUDA Toolkit
CUDA SKD
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 16 / 52
24. CUDA
Compute Capability
As GPUs com compute capability 3.5 podem fazer uso do paralelismo
dinˆamico e Hyper-Q.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 17 / 52
25. CUDA
Paralelismo dinˆamico
Permite que segmentos de processamento da GPU gerem dinamicamente
novos segmentos, possibilitando que a GPU se adapte de modo dinˆamico
aos dados
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 18 / 52
26. CUDA
Hyper-Q
Permite que at´e 32 processos MPI sejam lan¸cados simultaneamente em uma
GPU. O Hyper-Q ´e ideal para aplica¸c˜oes de cluster que usam MPI.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 19 / 52
27. CUDA
Fun¸c˜oes Kernel
Threads executam o c´odigo definido em uma fun¸c˜ao kernel. A chamada da fun¸c˜ao
kernel, dispara a execu¸c˜ao de N instˆancias paralelas para N threads.
Executado sobre S´o ´e chamada desde
device float deviceFunction() device device.
global float KernelFunction() device device/host.
host float hostFunction() host host.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 20 / 52
28. CUDA
Fun¸c˜oes de Transferˆencia e Manipula¸c˜ao de dados
Se declaram e alocam as vari´aveis no host e no device.
* cudaMalloc(void **pointer, size_t nbytes)
* cudaMemcpy(void *dst, const void *src, size_t count, enum
cudaMemcpyKind kind)
* cudaFree(void *pointer)
cudaMemcpyKind
cudaMemcpyHostToHost Host ⇒ Host
cudaMemcpyHostToDevice Host ⇒ Device
cudaMemcpyDeviceToHost Device ⇒ Host
cudaMemcpyDeviceToDevice Device ⇒ Device
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 21 / 52
29. CUDA
Exemplo: Soma de Vetores
Processo de Transferˆencia de dados para a GPU, execu¸c˜ao do kernel da
Soma de Vetores e transferˆencia da solu¸c˜ao de cada bloco de threads.
// allocate the memory on the GPU
cudaMalloc( (void **)& dev_a , N*sizeof(float ));
cudaMalloc( (void **)& dev_b , N*sizeof(float ));
cudaMalloc( (void **)& dev_partial_c , GridSize*sizeof(float ));
// copy the arrays ’a’ and ’b’ to the GPU
cudaMemcpy( dev_a , host_a , N*sizeof(float), cudaMemcpyHostToDevice );
cudaMemcpy( dev_b , host_b , N*sizeof(float), cudaMemcpyHostToDevice );
VecAdd <<<GridSize ,BlockSize >>>( dev_a , dev_b , dev_partial_c , N );
// copy the array ’c’ back from the GPU to the CPU
cudaMemcpy( host_partial_c , dev_partial_c , GridSize*sizeof(float),
cudaMemcpyDeviceToHost );
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 22 / 52
30. CUDA
Organiza¸c˜ao da Execu¸c˜ao
Uma chamada a uma fun¸c˜ao kernel cria um grid de blocos de threads, as
quais executam o c´odigo.
Um SM, SMX ou SMM executa um ou mais blocos de threads e os cores e
outras unidades de execu¸c˜ao no multiprocessador executam as instru¸c˜oes de
cada thread.
Vari´aveis e palavras reservadas s˜ao identificadores de cada thread dentro de
um bloco.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 23 / 52
31. CUDA
Modelo de Programa¸c˜ao
Organizado em grids, blocos e threads. Threads s˜ao agrupadas em blocos e estes
s˜ao agrupados em um grid.
Tradu¸c˜ao para endere¸camento linear para saber o id de uma thread em um grid.
Para saber a posi¸c˜ao de uma thread usamos as palavras reservadas:
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 24 / 52
32. CUDA
Espa¸cos de Mem´oria sobre um dispositivo CUDA
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 25 / 52
33. CUDA
Espa¸cos de Mem´oria sobre um dispositivo CUDA
A latˆencia de acesso a mem´oria global ´e 100x que da mem´oria com-
partilhada.
Tem palavras reservadas para a declara¸c˜ao das variaveis a ser alocadas
em cada n´ıvel de mem´oria.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 26 / 52
34. CUDA
./devicequery
Device 0: "GeForce GTX 295"
CUDA Driver Version / Runtime Version 6.0 / 5.5
CUDA Capability Major/Minor version number: 1.3
Total amount of global memory: 896 MBytes (939327488 bytes)
(30) Multiprocessors, ( 8) CUDA Cores/MP: 240 CUDA Cores
GPU Clock rate: 1242 MHz (1.24 GHz)
Memory Clock rate: 1000 Mhz
Memory Bus Width: 448-bit
Maximum Texture Dimension Size (x,y,z) 1D=(8192), 2D=(65536, 32768), 3D=(2048, 2048, 2048)
Maximum Layered 1D Texture Size, (num) layers 1D=(8192), 512 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(8192, 8192), 512 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 16384
Warp size: 32
Maximum number of threads per multiprocessor: 1024
Maximum number of threads per block: 512
Max dimension size of a thread block (x,y,z): (512, 512, 64)
Max dimension size of a grid size (x,y,z): (65535, 65535, 1)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 256 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): No
Device PCI Bus ID / PCI location ID: 4 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 27 / 52
35. CUDA
./devicequery
Device 1: "GeForce GT 630"
CUDA Driver Version / Runtime Version 5.5 / 5.5
CUDA Capability Major/Minor version number: 2.1
Total amount of global memory: 2048 MBytes (2147155968 bytes)
( 2) Multiprocessors, ( 48) CUDA Cores/MP: 96 CUDA Cores
GPU Clock rate: 1620 MHz (1.62 GHz)
Memory Clock rate: 667 Mhz
Memory Bus Width: 128-bit
L2 Cache Size: 131072 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65535), 3D=(2048, 2048, 2048)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 32768
Warp size: 32
Maximum number of threads per multiprocessor: 1536
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (65535, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID / PCI location ID: 2 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
> Peer access from GeForce GTX 660 (GPU0) -> GeForce GT 630 (GPU1) : No
> Peer access from GeForce GT 630 (GPU1) -> GeForce GTX 660 (GPU0) : No
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 28 / 52
36. CUDA
./deviceQuery Starting...
Device 0: "Tesla K40c"
CUDA Driver Version / Runtime Version 6.5 / 5.5
CUDA Capability Major/Minor version number: 3.5
Total amount of global memory: 11520 MBytes (12079136768 bytes)
(15) Multiprocessors, (192) CUDA Cores/MP: 2880 CUDA Cores
GPU Clock rate: 745 MHz (0.75 GHz)
Memory Clock rate: 3004 Mhz
Memory Bus Width: 384-bit
L2 Cache Size: 1572864 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 2 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Enabled
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID / PCI location ID: 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 5.5, NumDevs = 1,
Device0 = Tesla K40c Result = PASS
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 29 / 52
37. CUDA
Multiplica¸c˜ao de Matrizes em CUDA - I
Esquema de paraleliza¸c˜ao e kernel da multiplica¸c˜ao de matrizes por padr˜ao
com CUDA.
__global__ void matMul(float* Pd , float* Md ,
float* Nd , int N) {
float Pvalue = 0.0;
int j = blockIdx.x * tWidth + threadIdx.x;
int i = blockIdx.y * tWidth + threadIdx.y;
for (int k = 0; k < N; ++k)
Pvalue += Md[j * N + k] * Nd[k * N + i];
Pd[j * N + i] = Pvalue;
}
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 30 / 52
38. CUDA
Multiplica¸c˜ao de Matrizes em CUDA - II
Esquema da Multiplica¸c˜ao de Matrizes usando mem´oria compartilhada em
CUDA:
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 31 / 52
39. CUDA
Kernel da Multiplica¸c˜ao de Matrizes usando mem´oria compartilhada em
CUDA:
__global__ void matMul(float* Pd , float* Md ,
float* Nd , int N){
__shared__ float Mds[tWidth ][ tWidth ];
__shared__ float Nds[tWidth ][ tWidth ];
int tx = threadIdx.x;
int ty = threadIdx.y;
int Col = blockIdx.x * tWidth + tx;
int Row = blockIdx.y * tWidth + ty;
float Pvalue = 0;
for (int m = 0; m < N/tWidth; ++m) {
Mds[ty][tx] = Md[Row*N + (m*tWidth + tx)];
Nds[ty][tx] = Nd[Col + (m*tWidth + ty)*N];
__syncthreads ();
for (int k = 0; k < Tile_Width; ++k)
Pvalue += Mds[ty][k] * Nds[k][tx];
__syncthreads ();
}
Pd[Row * N + Col] = Pvalue;
}
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 32 / 52
40. CUDA Profiling e Optimiza¸c˜oes
Ferramentas de Profiling
Ferramentas de Profiling oferecidas pela NVIDIA
Figura : Profiling Tools provided by NVIDIA
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 33 / 52
41. CUDA Profiling e Optimiza¸c˜oes
NVIDIA Visual Profiling
Figura : Profile Discrete Cosine Transform
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 34 / 52
42. CUDA Profiling e Optimiza¸c˜oes
Acessos Agrupados a Mem´oria
A partir de GPUs de CC superior a 1.2.
Acessos agrupados realmente melhora o desempenho da aplica¸c˜ao.
Se o endere¸co de base de um bloco ´e n, ent˜ao qualquer thread i dentro desse bloco deve acessar
o endere¸co: (n + i) ∗ typeOfRead.
Acessos Agrupados Acessos No Agrupados
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 35 / 52
43. CUDA Profiling e Optimiza¸c˜oes
Conflito de Bancos na Mem´oria Compartilhada
A mem´oria compartilhada ´e dividida em m´odulos (tamb´em chamados de
bancos). Se duas posi¸c˜oes de mem´oria ocorrem no mesmo banco, ent˜ao
temos um conflito de banco.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 36 / 52
44. CUDA Profiling e Optimiza¸c˜oes
Figura : Achieved Occupancy metric in GTX-Titan
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 37 / 52
45. CUDA Profiling e Optimiza¸c˜oes
Figura : Global Load Transactions metric in GTX-Titan
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 38 / 52
46. CUDA Profiling e Optimiza¸c˜oes
Figura : Global Store Transactions metric in GTX-Titan
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 39 / 52
47. OpenCL
GPU, CUDA e OpenCL for parallel Applications
1 GPUs e GPGPU
2 CUDA
3 OpenCL e OpenACC
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 39 / 52
48. OpenCL
Open Computing Language
Modelo de plataforma
A linguagem serve como uma camada de abstra¸c˜ao ao hardware heterogˆeneo.
´E composto por um host e um ou mais dispositivos OpenCL (OpenCL devices).
Cada dispositivo possui uma ou mais unidades de computa¸c˜ao (compute units).
Estes s˜ao compostos por um conjunto de elementos de processamento (processing ele-
ments).
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 40 / 52
49. OpenCL
Open Computing Language
Aplica¸c˜ao e Fun¸c˜oes Kernel em OpenCL
Uma aplica¸c˜ao OpenCL deve seguir os seguintes passos:
1 Descobrir os componentes heterogˆeneos;
2 Detectar suas caracter´ısticas;
3 Criar os blocos de instru¸c˜oes (kernels) que ir˜ao executar na plataforma
heterogˆenea;
4 Iniciar e manipular objetos de mem´oria;
5 Executar os kernels na ordem correta e nos dispositivos adequados pre-
sentes no sistema;
6 Coletar os resultados finais.
(
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 41 / 52
50. OpenCL
Contexto
Define o ambiente de execu¸c˜ao no qual os kernels s˜ao definidos e executam.
Assim, um contexto ´e todo o conjunto de recursos que um kernel vai
utilizar durante sua execu¸c˜ao.
// Get platform and device information
cl_platform_id platform_id = NULL;
cl_device_id device_id = NULL;
cl_uint ret_num_devices ;
cl_uint ret_num_platforms ;
cl_int ret = clGetPlatformIDs (1, &platform_id , & ret_num_platforms );
ret = clGetDeviceIDs ( platform_id , CL_DEVICE_TYPE_DEFAULT , 1,
&device_id , & ret_num_devices );
// Create an OpenCL context
cl_context context = clCreateContext ( NULL , 1, &device_id , NULL , NULL ,
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 42 / 52
51. OpenCL
Fila de Comandos
Os comandos s˜ao colocados nesta fila e aguardam seu momento de executar.
Esta fila aceita trˆes tipos de comandos:
1 Execu¸c˜ao de kernel,
2 Transferˆencia de dados (objetos de mem´oria)
3 Sincroniza¸c˜ao, s´e ´e necess´aria.
// Create a command queue
cl_command_queue command_queue = clCreateCommandQueue (context , device_id , 0, &ret );
// Create memory buffers on the device for each vector
cl_mem a_mem_obj = clCreateBuffer (context , CL_MEM_READ_ONLY ,
LIST_SIZE * sizeof(int), NULL , &ret );
cl_mem b_mem_obj = clCreateBuffer (context , CL_MEM_READ_ONLY ,
LIST_SIZE * sizeof(int), NULL , &ret );
cl_mem c_mem_obj = clCreateBuffer (context , CL_MEM_WRITE_ONLY ,
LIST_SIZE * sizeof(int), NULL , &ret );
// Copy the lists A and B to their respective memory buffers
ret = clEnqueueWriteBuffer (command_queue , a_mem_obj , CL_TRUE , 0,
LIST_SIZE * sizeof(int), A, 0, NULL , NULL );
ret = clEnqueueWriteBuffer (command_queue , b_mem_obj , CL_TRUE , 0,
LIST_SIZE * sizeof(int), B, 0, NULL , NULL );
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 43 / 52
52. OpenCL
Execute the OpenCL kernel
// Create a program from the kernel source
cl_program program = clCreateProgramWithSource (context , 1,
(const char **)& source_str , (const size_t *)& source_size , &ret );
// Build the program
ret = clBuildProgram (program , 1, &device_id , NULL , NULL , NULL );
// Create the OpenCL kernel
cl_kernel kernel = clCreateKernel (program , "vector_add", &ret );
// Set the arguments of the kernel
ret = clSetKernelArg (kernel , 0, sizeof(cl_mem), (void *)& a_mem_obj );
ret = clSetKernelArg (kernel , 1, sizeof(cl_mem), (void *)& b_mem_obj );
ret = clSetKernelArg (kernel , 2, sizeof(cl_mem), (void *)& c_mem_obj );
// Execute the OpenCL kernel on the list
size_t global_item_size = LIST_SIZE; // Process the entire lists
size_t local_item_size = 64; // Divide work items into groups of 64
ret = clEnqueueNDRangeKernel (command_queue , kernel , 1, NULL ,
&global_item_size , &local_item_size , 0, NULL , NULL );
Kernel de Soma de Vetores.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 44 / 52
53. OpenCL
OpenCL - Tipos de Execu¸c˜ao de Kernels
2 tipos de execu¸c˜ao: Dara Parallel e Task
Parallel. A hierarquia de execu¸c˜ao de
OpenCL ´e tamb´em parecida que em CUDA.
N-Dimensional Range
CUDA OpenCL
grid NDRange
block threads work group
thread work item
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 45 / 52
54. OpenCL
OpenCL - Modelo de Mem´oria
Parecido que em CUDA, em OpenCL existem 4 locais diferentes para a
mem´oria que ´e enviada para o device:
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 46 / 52
55. OpenCL
CUDA - OpenCL
Semelhan¸cas
O host inicia o ambiente de execu¸c˜ao na GPU.
As threads s˜ao identificadas por ´ındices.
As threads s˜ao agrupadas.
O host aloca e preenche dados na mem´oria do device
A execu¸c˜ao dos kernels pode ser s´ıncrona ou ass´ıncrona.
Existem 4 diferentes tipos de mem´oria no device: Global, constante, local
(shared), private.
Diferen¸cas
No OpenCL existem 2 tipos de execu¸c˜ao diferentes:
1 Data Parallel
2 Task Parallel
O CUDA implementa s´o o modelo SIMT(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 47 / 52
56. OpenCL
OpenACC
Anunciado em novembro de 2011 na conferˆencia SuperComputing.
´E um padr˜ao para programa¸c˜ao paralela.
O padr˜ao tem como base o compilador PGI (Portland Group)
Cole¸c˜ao de diretivas para especificar la¸cos e regi˜oes de c´odigo paraleliz´aveis
em aceleradores.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 48 / 52
57. OpenCL
Modelo de execu¸c˜ao de OpenACC
O modelo de execu¸c˜ao do OpenACC tem trˆes n´ıveis: gang, worker e vector.
Em GPU pode ser mapeado como:
gang → bloco de threads
worker → warp
vector → threads em um warp
As Diretivas em C/C++ s˜ao especificadas usando #pragma.
Se o compilador n˜ao utilizar pr´e-processamento, as anota¸c˜oes s˜ao ignoradas
na compila¸c˜ao.
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 49 / 52
59. OpenCL
Compila¸c˜ao com PGI usando acc
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 51 / 52
60. OpenCL
S´o isso... Obrigado.
O EP 2 sobre GPUs, deve estar pronto para a sexta 17 de abril
com data de entrega 1 de maio!
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 52 / 52