83
CUDA/OpenCL Arquiteturas Avan¸cadas de Computadores Krissia de Zawadzki Instituto de F´ ısica de S˜ ao Carlos - Universidade de S˜ ao Paulo 06 de Maio 2014 Krissia de Zawadzki CUDA/OpenCL 1 / 61

CUDA/Open CL

Embed Size (px)

DESCRIPTION

Conceitos básicos de CUDA e OpenCL: das arquiteturas de computadores às diretivas de programação.

Citation preview

Page 1: CUDA/Open CL

CUDA/OpenCLArquiteturas Avancadas de Computadores

Krissia de Zawadzki

Instituto de Fısica de Sao Carlos - Universidade de Sao Paulo

06 de Maio 2014

Krissia de Zawadzki CUDA/OpenCL 1 / 61

Page 2: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Outline

1 CUDA - Introducao

2 GPU e CUDA

3 Programando em CUDA

4 OpenCL

5 Caos

6 Conclusao

Krissia de Zawadzki CUDA/OpenCL 2 / 61

Page 3: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

CUDA - Introducao

CUDA

Compute Unified Device Architecture

3 Plataforma de computacao paralela emodelo de programacao

3 Desenvolvido pela NVIDIA eimplementada para GPU’s NVIDIA

3 Conjunto de instrucoes e memoriadiretamente acessıveis ao programador

Krissia de Zawadzki CUDA/OpenCL 3 / 61

Page 4: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Background historico

Background historico

2002: Stanford University

Steam processing

Prototipo e arquitetura muito parecidacom GPU

Baseline programmablestream processor

Krissia de Zawadzki CUDA/OpenCL 4 / 61

Page 5: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Background historico

Background historico

2002: GeForce 3 e ATI Radeon 9700

3 Shaders programaveis

Krissia de Zawadzki CUDA/OpenCL 5 / 61

Page 6: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Background historico

Background historico

2006: GeForce 8

Arquitetura unificada → CUDA!

Krissia de Zawadzki CUDA/OpenCL 6 / 61

Page 7: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Background historico

Background historico

2006: GeForce 8

3 Programabilidade realmente flexıvel

3 Revolucionou os conceitos depipeline de pixel e vertices

3 Cadeia de processadores

Krissia de Zawadzki CUDA/OpenCL 7 / 61

Page 8: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

GPU’s com suporte para CUDA

GPU’s com suporte para CUDA

GeForce > 8

3 8, 9, 100, 200, 400, 500 e

600-series (mın 256MB memloc)

3 1.0, 1.1, 1.2, 1.3, 2.0, 2.1, 3.0,3.5 e 5.0

GeForce GTX-750 (5.0)

NVS

3 Quadro 295, 420, 450

3 NVIDIA NVS 300, 315, 510

3 1.1, 1.2, 2.1 e 3.0

NVIDIA NVS 510 (3.0)

Krissia de Zawadzki CUDA/OpenCL 8 / 61

Page 9: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

GPU’s com suporte para CUDA

GPU’s com suporte para CUDA

QUADRO

3 Quadro NVS, Quadro FX, Quadro K

3 1.0, 1.1, 1.2, 1.3, 2.0, 2.1, 3.0 e3.5

QUADRO K600 (3.5)

Tesla

3 D780, C870, C1060, C2050/2070,

C2075

3 K20, K40

3 1.0, 1.3, 2.0, 3.5

Tesla K20 (3.5)

Krissia de Zawadzki CUDA/OpenCL 9 / 61

Page 10: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Aplicacoes

Alem de processamento grafico

Krissia de Zawadzki CUDA/OpenCL 10 / 61

Page 11: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Aplicacoes

Krissia de Zawadzki CUDA/OpenCL 11 / 61

Page 12: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Aplicacoes

Ganho de desempenho em aplicacoes cientıficas

Krissia de Zawadzki CUDA/OpenCL 12 / 61

Page 13: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

GPU

GPU vs. CPU

CPU

3 Codigos sequenciais

3 Baixa latencia

3 Controle complexo

GPU

3 Paralelismo de dados

3 Alto throughtput

3 Aritmetica com pouco controle

Krissia de Zawadzki CUDA/OpenCL 13 / 61

Page 14: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

GPU

GPU vs. CPU

CPU

3 Fluxo iterativo

7 Tempo de computacao

7

GPU

3 Operacoes simultaneas

7 Desvio de fluxo

7

Krissia de Zawadzki CUDA/OpenCL 13 / 61

Page 15: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

GPU

CPU vs. GPU

Krissia de Zawadzki CUDA/OpenCL 14 / 61

Page 16: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

GPU

CPU vs. GPU

Krissia de Zawadzki CUDA/OpenCL 14 / 61

Page 17: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Linguagens e modelos de programacao paralela

Linguagens e modelos de programacao paralela

OpenMP

shared memory

limite de centenas de nos

CUDA

alta escalabilidade

portabilidade e mais simples!

MPI

capacidade de nos > 100.000

esforco para portar o codigo

OpenCL

modelo de programacao padronizado

suporte para AMD/ATI, NVIDIA,

Apple e Intel

Krissia de Zawadzki CUDA/OpenCL 15 / 61

Page 18: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Arquitetura da GPU

GPU - Unified processor array (GeForce 8800 GTX)

Krissia de Zawadzki CUDA/OpenCL 16 / 61

Page 19: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Estrutura de um programa CUDA

Estrutura de um programa CUDA

Trechos seriais ou com fraco paralelismo no codigo C do host

Porcao altamente paralela no codigo C do kernel associado ao device

Krissia de Zawadzki CUDA/OpenCL 17 / 61

Page 20: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Estrutura de um programa CUDA

CUDA Threads paralelas

// de dados: Todas as threads rodam o mesmo codigo

threadIdx: identificador da thread → & de memoria e controle

Krissia de Zawadzki CUDA/OpenCL 18 / 61

Page 21: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Estrutura de um programa CUDA

CUDA Thread Blocks

Thread Blocks: Array (dim 2x2) the threads que cooperam entre si

bloco: memoria compartilhada, operacoes atomicas ebarreiras de sincronizacao

blockIdx: identificador do bloco em um grid

Krissia de Zawadzki CUDA/OpenCL 19 / 61

Page 22: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Estrutura de um programa CUDA

CUDA Id’s

Ids sao uteis para identificar os

dados sob os quais cada thread ira

trabalhar

Conveniente para simplificar o &

de memoria em dados

multidimensionaisblockIdx:1D (blockIdx.x)

2D (blockIdx.x, blockIdx.y)

threadIdx:1D (threadIdx.x),2D (threadIdx.x, threadIdx.y),

3D (threadIdx.x, threadIdx.y, threadIdx.z)

Krissia de Zawadzki CUDA/OpenCL 20 / 61

Page 23: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Estrutura de um programa CUDA

Parametros de configuracao

block:dimBlock(Widthx , Widthy , , Widthz)

grid:

dimGrid(Wgridx , Wgridy , Wgridz)

Kernel launching

// Setup the execution configuration

dim3 dimBlock(Width , Width , 1);

dim3 dimGrid(1, 1, 1);

// Launch the device computation threads!

MyKernelFunction <<<dimGrid , dimBlock >>>(args);

Krissia de Zawadzki CUDA/OpenCL 21 / 61

Page 24: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Modelo de Memoria CUDA

Modelo de Memoria CUDA

Memoria Global:

comunicacao host-device

R/W

conteudo visıvel por todas as

threads

tipicamente implementada

como DRAM

acesso de longa latencia

(400-800 ciclos)

7 congestionamento

throughput limitado (a 177

GB/s na GTX8800)

Krissia de Zawadzki CUDA/OpenCL 22 / 61

Page 25: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Modelo de Memoria CUDA

Modelo de Memoria CUDA

Memoria Constante:

read only

baixa latencia e alta largura

de banda quando todas as

threadas acessam o mesmo

local

Krissia de Zawadzki CUDA/OpenCL 22 / 61

Page 26: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Modelo de Memoria CUDA

Modelo de Memoria CUDA

Memoria Compartilhada:

3 rapida

altamente paralela

apenas um bloco tem acesso

Krissia de Zawadzki CUDA/OpenCL 22 / 61

Page 27: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Modelo de Memoria CUDA

Modelo de Memoria CUDA

Registradores

3 o componente da memoriada GPU mais rapido

acessıvel por uma threada

Krissia de Zawadzki CUDA/OpenCL 22 / 61

Page 28: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Variaveis CUDA

Variaveis CUDA

kernel: a variavel deve ser declarada no escopo da funcao kernel → fica

disponıvel somente no kernel

application: a variavel deve ser declarada fora de qualquer funcao

constant: a variavel deve ser declarada fora de qualquer funcao →limitado (a 64KB na GTX8800)

Krissia de Zawadzki CUDA/OpenCL 23 / 61

Page 29: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

CUDA Kernel Functions

CUDA Kernel Functions

Kernel functions:

implementam o trechoparalelo de codigo a serexecutado no device

Sua chamada pode ser feitacom as configuracoes deblocos e de threads

Krissia de Zawadzki CUDA/OpenCL 24 / 61

Page 30: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

CUDA Kernel Functions

Atribuicao de threads

base block-by-block

7 Runtime systemcoordena os blocos e asthreads a seremexecutadas: mantem alista de blocos e associanovos blocos a SM’slivres

recursos do SM

unidades aritmeticas

numero de threads quepodem ser rastreadas eescalonadassimultaneamente

Krissia de Zawadzki CUDA/OpenCL 25 / 61

Page 31: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

CUDA Kernel Functions

CUDA Warps

Warps : conjunto de threads comındices consecutivos

A capacidade do warp (num.de threads) e dependente daimplementacao

Warp e a unidade paraescalonar threads no SM

SIMD

ordem qualquer entre warps

7 divergencia causada por branchs

Krissia de Zawadzki CUDA/OpenCL 26 / 61

Page 32: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

CUDA Kernel Functions

Compilador NVCC

Baseado no Open64(opensource originario doMIPSPro - SGI).

Implementado em C e C++.

NVidia atualmente investindono LLVM.

Existe um utilitario queconverte LLVM IR (geradopor qualquer frontend decompilador LLVM) em PTX,que pode ser programado nasGPUs NVidia.

Krissia de Zawadzki CUDA/OpenCL 27 / 61

Page 33: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

CUDA Kernel Functions

Deficiencias

Equipe preferiu implementar codigo para o desafio ECC2K-130diretamente em codigo de maquina.

BERNSTEIN, D. J. et al. Usable Assembly Language for GPUs: ASuccess Story. In: Workshop Records of Special-Purpose Hardwarefor Attacking Cryptographic Systems – SHARCS 2012. [s.n.], 2012.p. 169–178.

Compilador NVCC muito lento para lidar com kernels contendomuitas instrucoes.

Registradores alocados de forma pouco eficiente – muitas variaveisacabaram tendo de ser alocadas pelo NVCC na memoriacompartilhada.

Varios truques necessarios para obter uma implementacao em Caceitavel. Implementacao em Assembly 148% mais rapida quemelhor implementacao em C.

Krissia de Zawadzki CUDA/OpenCL 28 / 61

Page 34: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Multiplicacao Matricial: o Hello World do CUDA

𝑃 = 𝑀 *𝑁

𝑃𝑖𝑗 =∑𝑘

𝑀𝑖,𝑘𝑁𝑘,𝑗

3 Paralelismo de dados!

Cada elemento 𝑃𝑖𝑗 de 𝑃 pode sercalculado simultaneamente aosdemais!

Krissia de Zawadzki CUDA/OpenCL 29 / 61

Page 35: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Representacao matricial em C

Alocacao de memoria no C para arrays bidimensionais:

Krissia de Zawadzki CUDA/OpenCL 30 / 61

Page 36: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Codigo main C sequencial (host)

int main(void){//1. Alocamos e inicializamos as matrizes M, N e P// Funcoes I/O leem as matrizes M e N...//2. Multiplicacao M * NMatMul(M,N,P,Width );...//3. Funcao I/O para escrever a saida P// Liberamos a memoria de M, N e Preturn 0;

}

Krissia de Zawadzki CUDA/OpenCL 31 / 61

Page 37: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Funcao C sequencial (host)

void MatMul(float *M; float *N, float *P, int Width){

for(int i = 0; i < Width; ++i)for (int j = 0; j < Width; ++j){

float sum = 0;for(int k = 0; k < Width; ++k){

float m = M[i*Width + k];float n = N[k*width + j];sum += m * n;

}P[i * Width + j] = sum;

}}

Krissia de Zawadzki CUDA/OpenCL 32 / 61

Page 38: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Portando o codigo para CUDA - alocacao de memoria

cudaMalloc()

aloca um objeto naMemoria Global

parametros: endereco deum ponteiro para o objetoalocado, tamanho do objeto

cudaFree()

libera um objeto naMemoria Global

parametro: ponteiro para oobjeto

Krissia de Zawadzki CUDA/OpenCL 33 / 61

Page 39: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Portando o codigo para CUDA - alocacao

Exemplo:

int Width =64;float* Md , Nd;int size = Width*Width*sizeof(float );

cudaMalloc ((void **)&Md, size);cudaMalloc ((void **)&Nd, size);...cudaFree(Md);cudaFree(Nd);

Krissia de Zawadzki CUDA/OpenCL 34 / 61

Page 40: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Portando o codigo para CUDA - transferencia de dados

cudaMemcpy()

transfere dados entre o hoste o device

Assıncrona

parametros:ponteiro para o destino

ponteiro para a fonte numero

de bytes a serem copiados

tipo de transferencia

tipos:

Host to Host

Host to Device

Device to Host

Device to Device

Krissia de Zawadzki CUDA/OpenCL 35 / 61

Page 41: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Portando o codigo para CUDA - transferencia de dados

Exemplo:

...int size = Width*Width*sizeof(float );...cudaMemcpy(Md, M, size , cudaMemcyHostToDevice );cudaMemcpy(Nd, N, size , cudaMemcyHostToDevice );...cudaMemcpy(Pd, P, size , cudaMemcyDeviceToHost );

Krissia de Zawadzki CUDA/OpenCL 36 / 61

Page 42: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Portando o codigo para CUDA - funcao MatMul no device

void MatMul(float *M; float *N, float *P, int Width){int size = Width * Width * sizeof(float );float* Md , Nd, Pd;//1. Alocamos memoria no device para M, N e PcudaMalloc ((void **)) &Md, size);cudaMemcpy(Md, M, size , cudaMemcyHostToDevice );cudaMalloc ((void **)) &Nd, size);cudaMemcpy(Nd, N, size , cudaMemcyHostToDevice );cudaMalloc ((void **)) &Pd, size);

//2. Evocamos a funcao kernel para a multiplicacao

//3. Copiamos o resultado P para a memoria do hostcudaMemcpy(Pd, P, size , cudaMemcyDeviceToHost );// Liberamos as memorias de M, N e P no devicecudaFree(Md); cudaFree(Nd); cudaFree(Pd);

}

Krissia de Zawadzki CUDA/OpenCL 37 / 61

Page 43: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Funcao kernel MatMul

Krissia de Zawadzki CUDA/OpenCL 38 / 61

Page 44: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Kernel function - um pouco mais sobre especificacoes

global define uma funcao kernel

device e host podem ser usadas simultaneamente

7 recursoes

7 variaveis estaticas

7 chamadas indiretas de funcoes por ponteiros

Krissia de Zawadzki CUDA/OpenCL 39 / 61

Page 45: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Configuracao de execucao

Exemplo: Definir a multiplicacao matricial quando 𝑊𝑖𝑑𝑡ℎ = 32 emblocos Grids 2D com (2x2) blocos Blocos 2D com (16x16) threads

Krissia de Zawadzki CUDA/OpenCL 40 / 61

Page 46: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Configuracao de execucao

A configuracao define a dimensao do problema!!!! No exemplo anterior, usando blocos

1D podemos apenas trabalhar com 𝑊𝑖𝑑𝑡ℎ = 16 !

Solucao: Manipular dimGrid e dimBlock e dividir o calculo de pedacos da matriz

resultado entre threads e blocos!

Krissia de Zawadzki CUDA/OpenCL 41 / 61

Page 47: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando blockIdx e threadIdx

Solucao: tiles!

Krissia de Zawadzki CUDA/OpenCL 42 / 61

Page 48: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando blockIdx e threadIdx: nova funcao kernel

__global__ void MatMulK(float*Md, float*Nd , float*Pd, int Width){

// linha e colunas do elemento de Pdint Row = blockIdx.y*TILE_WIDTH + threadIdx.y;int Col = blockIdx.x*TILE_WIDTH + threadIdx.x;

float Pvalue = 0;// cada thread calcula um elemento da sub -matriz no blocofor(int k = 0; k < Width; ++k)

Pvalue += Md[Row*Width+k] * Nd[k*Width+Col];

Pd[Row * Width + Col] = Pvalue;}

Krissia de Zawadzki CUDA/OpenCL 43 / 61

Page 49: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando blockIdx e threadIdx: parametros de configuracao

// configuracao para varios blocosdim3 dimBlock(Width/TILE_WIDTH , Width/TILE_WIDTH );dim3 dimGrid(TILE_WIDTH , TILE_WIDTH );

// Lancamento do KernelMatMulK <<<dimGrid , dimBlock >>>(Md, Nd, Pd, Width);

Krissia de Zawadzki CUDA/OpenCL 44 / 61

Page 50: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Sincronizacao

syncthreads()

primitiva chamada por umafuncao kernel

o kernel que chamou fica emespera ate que todas as threadsterminem sua execucao

7 conditionals if-then-else

7 threads em blocos diferentesnao podem sincronizar

Krissia de Zawadzki CUDA/OpenCL 45 / 61

Page 51: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Escalabilidade Transparente

3 Potencial para executar o mesmo codigo no hardware com umnumero diferente de recursos de execucao e escalabilidadetransparente.

Krissia de Zawadzki CUDA/OpenCL 46 / 61

Page 52: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando a memoria para obter performance

3 reduzir o trafico de dados damemoria global evitacongestionamento

3 podemos aproveitar a localidadede dados para otimizar o acessoa dados na memoria da GPU

3 Threads que usam dadoscomuns podem colaborar!

3 Solucao:tiling + shared memory

Krissia de Zawadzki CUDA/OpenCL 47 / 61

Page 53: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando a memoria para obter performance

Krissia de Zawadzki CUDA/OpenCL 48 / 61

Page 54: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando a memoria para obter performance

3 Threads 𝑃1,0 e 𝑃1,1 compartilham o elemento 𝑁1,0

3 Threads 𝑃0,0 e 𝑃1,0 compartilham o elemento 𝑁1,0

3 threads com elementos em comum devem estar associadas aomesmo bloco e, assim, os dados comuns podem ser guardados namemoria compartilhada!

Krissia de Zawadzki CUDA/OpenCL 49 / 61

Page 55: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Usando a memoria para obter performance

3 reducao de trafico dedados na mem. global∝ TILE WIDTH

3 P/ NxN blocos, areducao ∝ N

3 num. de fases e Width/TILE WIDTH

Krissia de Zawadzki CUDA/OpenCL 50 / 61

Page 56: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Programando em CUDA: exemplo

Kernel MatMul com memoria compartilhada

__global__ voidMatMulK(float *Md, float *Nd, float *Pd, int Width){

__shared__ float Mds[TILE_WIDTH ][ TILE_WIDTH ];__shared__ float Nds[TILE_WIDTH ][ TILE_WIDTH ];

int bx = blockIdx.x; int by = blockIdx.y;int tx = threadIdx.x; int ty = threadIdx.y;

// Identificamos a linha e a coluna do elemento de Pdint Row = by * TILE_WIDTH + ty;int Col = bx * TILE_WIDTH + tx;

float Pvalue = 0;// Loop sobre os tiles Nd e Mdfor(int m = 0; m < Width/TILE_WIDTH; ++){

Mds[ty][tx] = Md[Row * Width + (m*TILE_WIDTH + tx)];Nds[ty][tx] = Nd[(m+TILE_WIDTH + ty)*Width + Col];_syncthreads ();

for(int k = 0; k < TILE_WIDTH; ++k)Pvalue += Mds[ty][k] * Nds[k][tx]_syncthreads ();

}Pd[Row*Width + Col] = Pvalue;

}

Krissia de Zawadzki CUDA/OpenCL 51 / 61

Page 57: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

OpenCL

OpenCL

extensao de linguagem e API’sp/ GPU’s

applicacoes OpenCL saoportaveis para todos osprocessadores com suporte

3 sintaxe e primitivas semelhantesao CUDA

7 performance ≈ CUDA

Krissia de Zawadzki CUDA/OpenCL 52 / 61

Page 58: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

OpenCL - arquitetura do device

OpenCL - arquitetura do device

Krissia de Zawadzki CUDA/OpenCL 53 / 61

Page 59: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

OpenCL e CUDA

OpenCL e CUDA

OpenCL API call Explicacao equivalente em CUDA

get global id(0); ındice global do work item blockIdx.x ×blocDim.x + threadIdx.x

get local id(0); ındice local do work group threadIdx.x

get global size(0); tamanho do range ND gridDim.x ×blocDim.x

get local size(0); tamanho de cada work group blockDim.x

OpenCL conceito de paralelismo equivalente em CUDA

Kernel Kernel

programa Host programa Host

ND range (espaco de ındice) Grid

work item Thread

work group Block

__kernel void vadd(__global const float *a,__global const float *b,__global float *result){

int id = get_global_id (0);result[id] = a[id]+b[id];

}

Krissia de Zawadzki CUDA/OpenCL 54 / 61

Page 60: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Exemplo de codigo OpenCL: multiplicacao matricial

Exemplo de codigo OpenCL: multiplicacao matricial

#define BLOCK_SIZE 16

__kernel void

matrixMul(__global float* P, __global float* M, __global float* N, int Width)

{

int bx = get_group_id (0), by = get_group_id (1);

int tx = get_local_id (0), ty = get_local_id (1);

int mBegin = Width * BLOCK_SIZE * by;

int mEnd = aBegin + Width - 1;

int mStep = BLOCK_SIZE;

int nBegin = BLOCK_SIZE * bx;

int nStep = BLOCK_SIZE * Width;

for (int m = mBegin , n = nBegin; m <= mEnd; m += mStep , n += nStep)

{

__local float Ms[BLOCK_SIZE ][ BLOCK_SIZE ];

__local float Ns[BLOCK_SIZE ][ BLOCK_SIZE ];

Ms[ty][tx] = M[m + Width * ty + tx];

Ns[ty][tx] = N[n + Width * ty + tx];

barrier(CLK_LOCAL_MEM_FENCE );

for (int k = 0; k < BLOCK_SIZE; ++k)

Psub += Ms[ty][k] * Ns[k][tx];

barrier(CLK_LOCAL_MEM_FENCE );

}

int p = Width * BLOCK_SIZE * by + BLOCK_SIZE * bx;

P[p + Width * ty + tx] = Psub;

}

Krissia de Zawadzki CUDA/OpenCL 55 / 61

Page 61: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Equacao diferencial com caos

��+ 𝑥3 = sin(Ω𝑡) (Ω1,Ω2,Ω3, · · · ,Ω𝑁−1)

(𝑡1, 𝑡2, · · · , 𝑡𝑓 )𝑑𝑥

𝑑𝑡= 𝑢

𝑥0 𝑢0

integracao

Runge-Kutta 4

· · ·

𝑡0 𝑡𝑓𝑑𝑡1 𝑑𝑡

Expoente de Lyapunov

|𝛿Z(𝑡)| ≈ 𝑒𝜆𝑡|𝛿Z0|

Krissia de Zawadzki CUDA/OpenCL 56 / 61

Page 62: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

GPU

CUDA version: v5050

CUDA Devices: 1

0: GeForce GTX 650: 3.0

Global memory: 2047mb

Shared memory: 48kb

Constant memory: 64kb

Block registers: 65536

Multiprocessors: 2

Max threads per multiprocessor:

2048

Warp size: 32

Threads per block: 1024

Max block dimensions: [ 1024,

1024, 64 ]

Max grid dimensions: [

2147483647, 65535, 65535 ]

Krissia de Zawadzki CUDA/OpenCL 57 / 61

Page 63: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Caos - resultados

𝑥 e 𝑢 como funcao de 𝑡

Krissia de Zawadzki CUDA/OpenCL 58 / 61

Page 64: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Caos - resultados

Espaco de fase 𝑢 por 𝑥

Krissia de Zawadzki CUDA/OpenCL 58 / 61

Page 65: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Caos - resultados

Expoente de Lyapunov

Krissia de Zawadzki CUDA/OpenCL 58 / 61

Page 66: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Caos - analise de desempenho

Krissia de Zawadzki CUDA/OpenCL 59 / 61

Page 67: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Caos - analise de desempenho

Krissia de Zawadzki CUDA/OpenCL 59 / 61

Page 68: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Equacao diferencial com caos

Caos - analise de desempenho

Krissia de Zawadzki CUDA/OpenCL 59 / 61

Page 69: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Conclusoes

3 Uso de GPU’s e altamente recomendado em aplicacoes comparalelismo de dados

3 Cada vez mais aplicacoes exigirao alta performance e fomentarao odesenvolvimento de GPU’s e de modelos de programacao paralelos

3 CUDA e um modelo de programacao inteligıvel e permite explorareficientemente o paralelismo de aplicacoes e os recursos da GPU

3 Parallel Thinking: antes de portar um codigo para rodar na GPU eimportante reconhecer quais os trechos sequenciais e os paralelos eexplorar ao maximo este usando os recursos GPU

Krissia de Zawadzki CUDA/OpenCL 60 / 61

Page 70: CUDA/Open CL

CUDA - Introducao GPU e CUDA Programando em CUDA OpenCL Caos Conclusao

Referencias

3 Kirk, D. ; Hwu, W.W. Programming massively parallel processors

3 www.nvidia.com/object/gpu-applications.html

3 https://developer.nvidia.com/cuda-gpus

3 http://cs.nyu.edu/courses/spring12/CSCI-GA.3033-012/

Krissia de Zawadzki CUDA/OpenCL 61 / 61

Page 71: CUDA/Open CL

Krissia de Zawadzki CUDA/OpenCL 1 / 13

Page 72: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

GPU Tesla: Alto paralelismo da arquitetura

Cada GPU G200b (com arquitetura Tesla) contem 30 SMs(Streaming Multiprocessors).

Uma placa de vıdeo pode ter mais de uma GPU. Por exemplo, aGTX295 possui duas dessas GPUs.

Cada um desses SMs contem 8 ALUs (Arithmetic-Logic Units).

NVidia chama ALUs de “CUDA cores”, mas esse nome e ilusorio,pois nao se tratam de cores completos (com unidade de execucao,etc.)

Alto throughput – e possıvel requisitar para cada ALU umaoperacao logica ou aritmetica por ciclo.

Krissia de Zawadzki CUDA/OpenCL 2 / 13

Page 73: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

GPU Tesla: Limitacoes impostas pela arquitetura

Entretanto, cada ALU e construıda na forma de um pipeline devarios estagios, apresentando muitos ciclos de latencia(da ordem de 24 ciclos).

As 8 ALUs de um SM precisam executar a mesma instrucao ao longode 4 ciclos, que e o tempo de resposta do dispatcher de instrucoes.

Por isso, cada instrucao precisa ser executada pelo menos um totalde 32 vezes. Isso e chamado de um warp.

Para superar ambas as limitacoes, o programa deve ser organizadode forma a executar em cada SM um numero de threads bem maiorque o numero de ALUs disponıveis.

O dispatcher da Tesla precisa de pelo menos 2 warps para funcionarde forma contınua, entao o mınimo e de 64 threads para naodesperdicar oportunidades de inserir operacoes nas ALUs.Recomenda-se de 128 a 192 threads. Dessas threads, apenas 8executam simultaneamente por vez. Entao, cada thread fica ociosaciclos o suficiente para compensar a latencia de cada operacao.

Krissia de Zawadzki CUDA/OpenCL 3 / 13

Page 74: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

GPU Tesla: Instrucoes condicionais

Instrucoes subsequentes a umacomparacao podem verificar se osoperandos eram iguais (eq),diferentes (ne), um menor que ooutro (lt), etc.

A instrucao so executa se a condicaofor verdadeira, caso contrario a ALUfica ociosa por um ciclo.

Inspirado na arquitetura ARM.Porem capaz de memorizar oresultado de ate 4 comparacoes($p0–$p3) em vez de somente aultima realizada.

No ARM, evita esvaziar o pipelineem pequenas condicionais difıceis deprever.

Na GPU, evita a divergencia dewarps.

Krissia de Zawadzki CUDA/OpenCL 4 / 13

Page 75: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

GPU Tesla: Recursos compartilhados de uma SM

Cada SM tem 16384 registradores de 32 bits que sao divididosigualmente entre as threads.

O conjunto de instrucoes e capaz de enderecar no maximo 128registradores por thread. Porem o ultimo registrador ($r127) esomente-escrita, apelidado de bitbucket.

Se alocarmos menos de 128 threads por SM, estaremosdesperdicando registradores!

Cada SM tem 16384 bytes de memoria compartilhada. Essamemoria e dividida em 16 bancos de memoria. Apenas enderecossituados em bancos diferentes podem ser acessados simultamente nomesmo ciclo.

Essa memoria e entrelacada. Cada 4 bytes (32 bits) adjacentes saocolocados em um banco diferente.Se duas threads tentarem acessar simultameamente o mesmo banco,o acesso e serializado pelo hardware e perde-se paralelismo.

Krissia de Zawadzki CUDA/OpenCL 5 / 13

Page 76: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

GPU Tesla: Memoria global

A memoria global e compartilhada entre todas as SMs e e acessıveltambem pela CPU hospedeira.

A latencia de acesso e na faixa de 400 a 600 ciclos.

O throughput e de no maximo um acesso de 32 bits para cada SMpor ciclo.

Na arquitetura Tesla, nao existe cache. O programador deveexplicitamente copiar os dados para memorias mais locais, conformenecessario para obter desempenho.

Krissia de Zawadzki CUDA/OpenCL 6 / 13

Page 77: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

GPU Fermi: Principais diferencas

Cache para memoria global; mais memoriacompartilhada; dobro de registradores.

Quadruplo de ALUs em cada SM.

NVidia aumentou o poder de uma SM

em vez de aumentar muito o numero de

SMs, reduzindo numero de transistores

necessarios para o mesmo pico de

GFLOPS.

Warps agora duram 2 ciclos e, devido as 2

unidades de dispatch, agora e possıvel

executar 2 warps simultaneamente em uma

SM, um em cada grupo de 16 ALUs.

Portanto, o tamanho do warp continua

sendo de 32 threads.

Melhor suporte a precisao dupla.

Porem apenas um warp por vez (metade

do throughput da precisao simples).

Krissia de Zawadzki CUDA/OpenCL 7 / 13

Page 78: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

Unified memory - CUDA6

Unified memory - CUDA6

7 memorias da CPU e da GPU eram fisicamente distintas e separadas pelo PCI-Express bus

3 Unified memory permite a CPU o acesso direto a dados da GPU e vice-versa

3 Ha uma managed memory que torna dads acessıveis para CPU e para GPU por um unico

ponteiro

Krissia de Zawadzki CUDA/OpenCL 8 / 13

Page 79: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

Top 500 - maquinas com CUDA

Top 500 - maquinas com CUDA

Krissia de Zawadzki CUDA/OpenCL 9 / 13

Page 80: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

Performance em aplicacoes cientıticas - Tesla K40

Performance em aplicacoes cientıticas - Tesla K40

Krissia de Zawadzki CUDA/OpenCL 10 / 13

Page 81: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

Papers Web of Science

Papers Web of Science

Krissia de Zawadzki CUDA/OpenCL 11 / 13

Page 82: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

Tendencias de salario IT

Tendencias de salario IT

Krissia de Zawadzki CUDA/OpenCL 12 / 13

Page 83: CUDA/Open CL

Tesla vs. Fermi - Arquiteturas CUDA 6 Curiosidades

Tendencias de emprego IT

Tendencias de emprego IT

Krissia de Zawadzki CUDA/OpenCL 13 / 13