SlideShare uma empresa Scribd logo
1 de 60
Baixar para ler offline
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
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
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
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
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
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
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
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
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
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
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
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
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
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
GPUs
Arquitetura de uma GPU NVIDIA
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 11 / 52
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
GPUs
Arquitetura Fermi
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 13 / 52
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OpenCL
Exemplo
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 50 / 52
OpenCL
Compila¸c˜ao com PGI usando acc
(gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 51 / 52
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

Mais conteúdo relacionado

Destaque

Parallel K means clustering using CUDA
Parallel K means clustering using CUDAParallel K means clustering using CUDA
Parallel K means clustering using CUDAprithan
 
Applying of the NVIDIA CUDA to the video processing in the task of the roundw...
Applying of the NVIDIA CUDA to the video processing in the task of the roundw...Applying of the NVIDIA CUDA to the video processing in the task of the roundw...
Applying of the NVIDIA CUDA to the video processing in the task of the roundw...Ural-PDC
 
Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...
Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...
Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...Igor Korkin
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
Implementazione di un vincolo table su un CSP solver GPU-based
Implementazione di un vincolo table su un CSP solver GPU-basedImplementazione di un vincolo table su un CSP solver GPU-based
Implementazione di un vincolo table su un CSP solver GPU-basedTommaso Campari
 
Parallel Implementation of K Means Clustering on CUDA
Parallel Implementation of K Means Clustering on CUDAParallel Implementation of K Means Clustering on CUDA
Parallel Implementation of K Means Clustering on CUDAprithan
 
ICISA 2010 Conference Presentation
ICISA 2010 Conference PresentationICISA 2010 Conference Presentation
ICISA 2010 Conference PresentationGonçalo Amador
 
Nvidia cuda tutorial_no_nda_apr08
Nvidia cuda tutorial_no_nda_apr08Nvidia cuda tutorial_no_nda_apr08
Nvidia cuda tutorial_no_nda_apr08Angela Mendoza M.
 
Intro to GPGPU with CUDA (DevLink)
Intro to GPGPU with CUDA (DevLink)Intro to GPGPU with CUDA (DevLink)
Intro to GPGPU with CUDA (DevLink)Rob Gillen
 
Introduction to CUDA
Introduction to CUDAIntroduction to CUDA
Introduction to CUDARaymond Tay
 
GPGPU programming with CUDA
GPGPU programming with CUDAGPGPU programming with CUDA
GPGPU programming with CUDASavith Satheesh
 
PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...
PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...
PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...AMD Developer Central
 
Parallel computing with Gpu
Parallel computing with GpuParallel computing with Gpu
Parallel computing with GpuRohit Khatana
 
CUDA Deep Dive
CUDA Deep DiveCUDA Deep Dive
CUDA Deep Divekrasul
 
GPU Computing: A brief overview
GPU Computing: A brief overviewGPU Computing: A brief overview
GPU Computing: A brief overviewRajiv Kumar
 

Destaque (20)

Parallel K means clustering using CUDA
Parallel K means clustering using CUDAParallel K means clustering using CUDA
Parallel K means clustering using CUDA
 
Applying of the NVIDIA CUDA to the video processing in the task of the roundw...
Applying of the NVIDIA CUDA to the video processing in the task of the roundw...Applying of the NVIDIA CUDA to the video processing in the task of the roundw...
Applying of the NVIDIA CUDA to the video processing in the task of the roundw...
 
CUDA-Aware MPI
CUDA-Aware MPICUDA-Aware MPI
CUDA-Aware MPI
 
Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...
Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...
Acceleration of Statistical Detection of Zero-day Malware in the Memory Dump ...
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
Implementazione di un vincolo table su un CSP solver GPU-based
Implementazione di un vincolo table su un CSP solver GPU-basedImplementazione di un vincolo table su un CSP solver GPU-based
Implementazione di un vincolo table su un CSP solver GPU-based
 
Parallel Implementation of K Means Clustering on CUDA
Parallel Implementation of K Means Clustering on CUDAParallel Implementation of K Means Clustering on CUDA
Parallel Implementation of K Means Clustering on CUDA
 
ICISA 2010 Conference Presentation
ICISA 2010 Conference PresentationICISA 2010 Conference Presentation
ICISA 2010 Conference Presentation
 
Nvidia cuda tutorial_no_nda_apr08
Nvidia cuda tutorial_no_nda_apr08Nvidia cuda tutorial_no_nda_apr08
Nvidia cuda tutorial_no_nda_apr08
 
Intro to GPGPU with CUDA (DevLink)
Intro to GPGPU with CUDA (DevLink)Intro to GPGPU with CUDA (DevLink)
Intro to GPGPU with CUDA (DevLink)
 
Introduction to CUDA
Introduction to CUDAIntroduction to CUDA
Introduction to CUDA
 
GPGPU programming with CUDA
GPGPU programming with CUDAGPGPU programming with CUDA
GPGPU programming with CUDA
 
PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...
PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...
PL-4044, OpenACC on AMD APUs and GPUs with the PGI Accelerator Compilers, by ...
 
Parallel computing with Gpu
Parallel computing with GpuParallel computing with Gpu
Parallel computing with Gpu
 
CUDA Deep Dive
CUDA Deep DiveCUDA Deep Dive
CUDA Deep Dive
 
GPU Computing: A brief overview
GPU Computing: A brief overviewGPU Computing: A brief overview
GPU Computing: A brief overview
 
Introduction to GPU Programming
Introduction to GPU ProgrammingIntroduction to GPU Programming
Introduction to GPU Programming
 
Parallel Computing on the GPU
Parallel Computing on the GPUParallel Computing on the GPU
Parallel Computing on the GPU
 
GPU Programming
GPU ProgrammingGPU Programming
GPU Programming
 

Semelhante a GPU, CUDA, OpenCL and OpenACC for Parallel Applications

Aplicando o poder de uma GPU no SQL Server
Aplicando o poder de uma GPU noSQL ServerAplicando o poder de uma GPU noSQL Server
Aplicando o poder de uma GPU no SQL Serverpichiliani
 
Computação em Finanças em Hardware Gráfico
Computação em Finanças em Hardware GráficoComputação em Finanças em Hardware Gráfico
Computação em Finanças em Hardware GráficoThársis T. P. Souza
 
Por que escolher AMD?
Por que escolher AMD?Por que escolher AMD?
Por que escolher AMD?lucasmfreitas
 
Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...
Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...
Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...André Curvello
 
TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers
TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers
TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers tdc-globalcode
 
Marco trabalho arquitetura de computadores
Marco trabalho arquitetura de computadoresMarco trabalho arquitetura de computadores
Marco trabalho arquitetura de computadoresAntónio Filipe
 
Multithreaded tecnologia
Multithreaded tecnologia Multithreaded tecnologia
Multithreaded tecnologia J Chaves Silva
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesJoao Galdino Mello de Souza
 
Paralelização de Algoritmo do Produto Escalar
Paralelização de Algoritmo do Produto EscalarParalelização de Algoritmo do Produto Escalar
Paralelização de Algoritmo do Produto EscalarWendel Oliveira
 
Webinar: Projeto de Hardware: ASIC e FPGA
Webinar: Projeto de Hardware: ASIC e FPGAWebinar: Projeto de Hardware: ASIC e FPGA
Webinar: Projeto de Hardware: ASIC e FPGAEmbarcados
 
Modelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopModelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopBig Data Week São Paulo
 

Semelhante a GPU, CUDA, OpenCL and OpenACC for Parallel Applications (20)

CUDA/Open CL
CUDA/Open CLCUDA/Open CL
CUDA/Open CL
 
Aplicando o poder de uma GPU no SQL Server
Aplicando o poder de uma GPU noSQL ServerAplicando o poder de uma GPU noSQL Server
Aplicando o poder de uma GPU no SQL Server
 
Map Reduce
Map ReduceMap Reduce
Map Reduce
 
Mini-curso CUDA
Mini-curso CUDAMini-curso CUDA
Mini-curso CUDA
 
Dissertacao
DissertacaoDissertacao
Dissertacao
 
Computação em Finanças em Hardware Gráfico
Computação em Finanças em Hardware GráficoComputação em Finanças em Hardware Gráfico
Computação em Finanças em Hardware Gráfico
 
070498 t2
070498 t2070498 t2
070498 t2
 
Por que escolher AMD?
Por que escolher AMD?Por que escolher AMD?
Por que escolher AMD?
 
TCC Apresentacao Final
TCC Apresentacao FinalTCC Apresentacao Final
TCC Apresentacao Final
 
Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...
Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...
Proposta para Aceleração de Desempenho de Algoritmos de Visão Computacional e...
 
TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers
TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers
TDC2018SP | Trilha Containers - ASGARD: Abstraindo orquestradores de containers
 
Marco trabalho arquitetura de computadores
Marco trabalho arquitetura de computadoresMarco trabalho arquitetura de computadores
Marco trabalho arquitetura de computadores
 
Palestra
PalestraPalestra
Palestra
 
Multithreaded tecnologia
Multithreaded tecnologia Multithreaded tecnologia
Multithreaded tecnologia
 
Evolução das CPUs
Evolução das CPUsEvolução das CPUs
Evolução das CPUs
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno Domingues
 
Paralelização de Algoritmo do Produto Escalar
Paralelização de Algoritmo do Produto EscalarParalelização de Algoritmo do Produto Escalar
Paralelização de Algoritmo do Produto Escalar
 
Inpe
InpeInpe
Inpe
 
Webinar: Projeto de Hardware: ASIC e FPGA
Webinar: Projeto de Hardware: ASIC e FPGAWebinar: Projeto de Hardware: ASIC e FPGA
Webinar: Projeto de Hardware: ASIC e FPGA
 
Modelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopModelos de computação distribuída no Hadoop
Modelos de computação distribuída no Hadoop
 

Mais de Marcos Gonzalez

Slides experimentation softengineering
Slides experimentation softengineeringSlides experimentation softengineering
Slides experimentation softengineeringMarcos Gonzalez
 
Science 2.0: A opening Science
Science 2.0: A opening ScienceScience 2.0: A opening Science
Science 2.0: A opening ScienceMarcos Gonzalez
 
Classification of ECG of AIM using Compression-based Dissimilarity-Measure
Classification of ECG of AIM using Compression-based Dissimilarity-Measure Classification of ECG of AIM using Compression-based Dissimilarity-Measure
Classification of ECG of AIM using Compression-based Dissimilarity-Measure Marcos Gonzalez
 
A menina-do-vale Emprendedorismo
A menina-do-vale EmprendedorismoA menina-do-vale Emprendedorismo
A menina-do-vale EmprendedorismoMarcos Gonzalez
 
Fractional Fourier Transform: Fractional Wiener Filter in Scilab
Fractional Fourier Transform: Fractional Wiener Filter in ScilabFractional Fourier Transform: Fractional Wiener Filter in Scilab
Fractional Fourier Transform: Fractional Wiener Filter in ScilabMarcos Gonzalez
 
Filtros wavelet para Electrocardiogramas en R
Filtros wavelet para Electrocardiogramas en RFiltros wavelet para Electrocardiogramas en R
Filtros wavelet para Electrocardiogramas en RMarcos Gonzalez
 
MPI and Distributed Applications
MPI and Distributed ApplicationsMPI and Distributed Applications
MPI and Distributed ApplicationsMarcos Gonzalez
 
SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...
SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...
SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...Marcos Gonzalez
 

Mais de Marcos Gonzalez (9)

Slides experimentation softengineering
Slides experimentation softengineeringSlides experimentation softengineering
Slides experimentation softengineering
 
Science 2.0: A opening Science
Science 2.0: A opening ScienceScience 2.0: A opening Science
Science 2.0: A opening Science
 
Classification of ECG of AIM using Compression-based Dissimilarity-Measure
Classification of ECG of AIM using Compression-based Dissimilarity-Measure Classification of ECG of AIM using Compression-based Dissimilarity-Measure
Classification of ECG of AIM using Compression-based Dissimilarity-Measure
 
Intrapreneurship
IntrapreneurshipIntrapreneurship
Intrapreneurship
 
A menina-do-vale Emprendedorismo
A menina-do-vale EmprendedorismoA menina-do-vale Emprendedorismo
A menina-do-vale Emprendedorismo
 
Fractional Fourier Transform: Fractional Wiener Filter in Scilab
Fractional Fourier Transform: Fractional Wiener Filter in ScilabFractional Fourier Transform: Fractional Wiener Filter in Scilab
Fractional Fourier Transform: Fractional Wiener Filter in Scilab
 
Filtros wavelet para Electrocardiogramas en R
Filtros wavelet para Electrocardiogramas en RFiltros wavelet para Electrocardiogramas en R
Filtros wavelet para Electrocardiogramas en R
 
MPI and Distributed Applications
MPI and Distributed ApplicationsMPI and Distributed Applications
MPI and Distributed Applications
 
SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...
SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...SlidesA Comparison of GPU Execution Time Prediction using Machine Learning an...
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
  • 17. GPUs Arquitetura Fermi (gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 13 / 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
  • 58. OpenCL Exemplo (gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 50 / 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