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

GPU, CUDA, OpenCL and OpenACC for Parallel Applications

  • 1.
    GPU, CUDA eOpenCL 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 eGPGPU 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 eOpenCL 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 controladorde 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 GPUfoi 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´ositoGeral 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 Amdahle 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 Hojeem 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 IntelCore 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 GreenSupercomputers $$$$$$ 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 Arquiteturasde 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 Arquiteturasde 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 Arquiteturasde 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 umaGPU 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 Ocultarlatˆ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 Ocultarlatˆ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 Keplertem 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 Keplertem 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 eOpenCL 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 DeviceArchitecture 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 GPUscom 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 quesegmentos 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´e32 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 executamo 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ˆenciae 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 deVetores 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 Umachamada 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 Organizadoem 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´oriasobre um dispositivo CUDA (gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 25 / 52
  • 33.
    CUDA Espa¸cos de Mem´oriasobre 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: "GeForceGTX 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: "GeForceGT 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 Matrizesem 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 Matrizesem 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˜aode 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 eOptimiza¸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 eOptimiza¸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 eOptimiza¸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 eOptimiza¸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 eOptimiza¸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 eOptimiza¸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 eOptimiza¸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 eOpenCL 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 Modelode 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˜aoe 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 ambientede 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 Oscomandos 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 OpenCLkernel // 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 - Tiposde 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 - Modelode 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 Ohost 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 novembrode 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˜aode 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 PGIusando acc (gold, amaris)@ime.usp.br (IME - USP) GPU, CUDA e OpenCL April, 2014 51 / 52
  • 60.
    OpenCL S´o isso... Obrigado. OEP 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