computação de alto desempenho utilizando gpu

89
Introdução à Computação de Alto Desempenho Utilizando GPU Seminário de Programação em GPGPU Eng. Thársis T. P. Souza [email protected] Instituto de Matemática e Estatística - Universidade de São Paulo

Upload: luander-henrique

Post on 29-Nov-2014

44 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Computação de Alto Desempenho utilizando GPU

Introdução à Computação de Alto Desempenho Utilizando GPU

Seminário de Programação em GPGPU

Eng. Thársis T. P. [email protected]

Instituto de Matemática e Estatística - Universidade de São Paulo

Page 2: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 2

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 3: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 3

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 4: Computação de Alto Desempenho utilizando GPU

CPU GPU

Própria para tarefas sequenciais Cache eficiente Maior quantidade de memória

principal Controle de fluxo Número de cores de 1 ordem de

grandeza 1, 2 threads por core

Própria para tarefas com paralelismo de dados

Múltiplas ULAs Maior (capacidade) operações de

ponto flutuante por segundo Alto throughput de memória Dezenas de multiprocessors Múltiplas threads por

multiprocessor

01/04/2011 4Instituto de Matemática e Estatística - Universidade de São Paulo

Page 5: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 5

Figura 1: Número de operações de ponto flutuante por segundo

Page 6: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 6

Figura 2: Throughput de memória CPU x GPU

Page 7: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 7

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 8: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 8

General-purpose computing on Graphics Processing Units Técnica de uso de GPU para computação de propósito geral

Linguagens/API’s

OpenGL DirectX Cg Brook Brook+ OpenCL CUDA

Page 9: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 9

Page 10: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 10

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 11: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 11

Código otimizado depende de conhecimento da arquiteturaespecífica

Shared memory / Cache configuráveis

Quantos cores?

Precisão de ponto flutuante depende da geração da arquitetura

SFUs (Special Function Units): limitante de operaçõestranscendentais

Qual memória usar: Shared memory, Constant Memory, Global Memory, registradores, local memory, Host Memory?

Quantas threads/bloco, blocos/SM, registradores/thread, threads/SM, Warps/SM, threads/Warp ????

Page 12: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 12

Page 13: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 13

Page 14: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 14

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 15: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 15

Define arquitetura base e features de uma GPU NVIDIA

Page 16: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 16

Page 17: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 17

Compute capability: 2.0 Single Precision Floating

Point Performance : 1.03 TFlops

Device copy overlap: Enabled

Kernel timeout : Disabled

Total dedicated memory: 3GB GDDR5

Constant mem: 64KB

Numero de multiprocessadores: 14

Shared mem por mp: 48KB

Registers por mp: 32768 Threads in warp: 32 Max threads per block: 1024 Max thread dimension:

(1024, 1024, 64) Max grid dimension: (65535,

65535, 1)

Page 18: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 18

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 19: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 19

Page 20: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 20

Global memory de até 6GB

Cache L2 (768KB) compartilhado entre todos os Cores

16 SMs

Comunicação CPU-GPU via PCI-E

GigaThread: distribuiblocos de threads emescalonadores de SM

Page 21: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 21

32 CUDA Cores por SM 1 CUDA Core executa 1 thread

por ciclo

16 Load/Store Units Pode limitar execução a 16

threads por clock

4 Special Function Units Executa instruções

transcedentais Pode limitar execução de warp

a 8 ciclos

64kB (48kB/16kB) configuráveispara Shared Memory e L1 Cache

Page 22: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 22

1 Warp = 32 threads

2 Warps (potencialmente) executados ao mesmotempo

Máximo de 48 Warps por SM

Total de 1536 threads possíveis por SM

Page 23: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 23

Fermi dual warp scheduler seleciona 2 warps e realiza umainstrução de cada warp em um grupo de 16 cores, 16 unidadesde load/store ou 4 SFUs

48 warps/SM. Para quê? Latency hiding: warp com

instrução de alta-latência é escalonado

Muitos escalonamentos = queda de desempenho? Zero-overhead thread

scheduling: seleção de warp para execução não introduzoverhead

Page 24: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 24

Modelo SIMT: Single Instruction Multiple Thread

Apropriado quando todasthreads em um mesmo warp seguem o mesmo caminho de fluxo de controle

Quando threads em um warp seguem caminhos de fluxo de controle diferentes dizemosque elas divergem

Em situação de divergência, um warp necessita de múltiplos passos para ser executado. Um para cadacaminho de divergência.

Page 25: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 25

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 26: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 26

Compute Unified Device Architecture

Arquitetura paralela de propósito geral

Tecnologia proprietária NVIDIA

Page 27: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 27

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 28: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 28

Arquitetura de Computação Paralelapara propósito geral Facilita computação heterogênea (CPU +

GPU)

Suporte a varias linguagens e APIs

CUDA define: Modelo de programação

Modelo de memória

Modelo de execução

Page 29: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 29

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 30: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 30

Porções paralelas da aplicação são executadas como kernels

CUDA threads

Lighweight

Fast switching

Milhares potencialmente executadas ao mesmo tempo

Page 31: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 31

Um kernel é uma função executada emGPU

Cada thread possui um identificadorúnico

Seleção de input/output

Decisões de controle (cuidado!)

Threads com decisões de controledistintas podem causar divergência emwarp

Page 32: Computação de Alto Desempenho utilizando GPU
Page 33: Computação de Alto Desempenho utilizando GPU

Threads são agrupadas em blocos

Page 34: Computação de Alto Desempenho utilizando GPU

Threads são agrupadas em blocos Blocos são agrupados em grid

Page 35: Computação de Alto Desempenho utilizando GPU

Threads são agrupadas em blocos Blocos são agrupados em grid Um kernel é executado como um grid de blocos de threads

Page 36: Computação de Alto Desempenho utilizando GPU

Threads são agrupadas em blocos Blocos são agrupados em grid Um kernel é executado como um grid de blocos de threads

GPU

Page 37: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 37

Um kernel executa um grid de blocosde threads

Um bloco é formado por um conjuntode threads

Cada thread pode ser unicamenteendereçada

Page 38: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 38

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 39: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 39

Thread

Registradores

Page 40: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 40

Thread

Registradores

Thread

Local Memory

Page 41: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 41

Thread

Registradores

Thread

Local Memory

Bloco

Shared Memory

Page 42: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 42

Thread

Registradores

Thread

Local Memory

Bloco

Shared Memory

Grid

Global Memory

Page 43: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 43

Registradores registradores são rápidos, porém escassos. Cadathread possui um conjunto privado de registradores.

Page 44: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 44

Registradores registradores são rápidos, porém escassos. Cadathread possui um conjunto privado de registradores.

Shared Memory threads em um mesmo bloco compartilham um espaço de memória, o qual funciona como um cache manipuladoexplicitamente pelo programa

Page 45: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 45

Registradores registradores são rápidos, porém escassos. Cadathread possui um conjunto privado de registradores.

Shared Memory threads em um mesmo bloco compartilham um espaço de memória, o qual funciona como um cache manipuladoexplicitamente pelo programa

Local Memory cada thread possui acesso a um espaço de memória local, além de seus registradores. Essa área de memóriaestá fora do micro-chip de processamento, junto à memóriaglobal, e portanto, ambas estas memórias possuem o mesmotempo de acesso.

Page 46: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 46

Registradores registradores são rápidos, porém escassos. Cadathread possui um conjunto privado de registradores.

Shared Memory threads em um mesmo bloco compartilham um espaço de memória, o qual funciona como um cache manipuladoexplicitamente pelo programa

Local Memory cada thread possui acesso a um espaço de memória local, além de seus registradores. Essa área de memóriaestá fora do micro-chip de processamento, junto à memóriaglobal, e portanto, ambas estas memórias possuem o mesmotempo de acesso.

Global Memory esta memória está disponível para todas as threads em cada bloco e em todas as grades. Trata-se da únicamaneira de threads de diferentes blocos colaborarem.

Page 47: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 47

Page 48: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 48

Page 49: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 49

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 50: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 50

Threads são executadas porcores

Um bloco consiste de conjuntos de warps

Um Warp é executado emem paralelo (SIMT) em um Multiprocessor

Um Kernel é lançado comoum grid

Um grid é executado no device

Page 51: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 51

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 52: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 52

Biblioteca e um compilador para criação de rotinas em GPUs NVIDIA

API de mais alto nível em comparação com: Cg, OpenGL, DirectX

Exige conhecimento de arquitetura para codificação

Amplamente utilizada

Possui grande comunidade e boa documentação

Maioria de artigos publicados em programação em GPGPU utilizaCUDA C

Page 53: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 53

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 54: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 54

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 55: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 55

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}// C functionint main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 56: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 56

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

// ponteiro para host memoryint *host_array = 0;

// aloca espaço em host memoryhost_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 57: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 57

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);// Ponteiro para device memoryint *device_array = 0;// Aloca espaço em device memorycudaMalloc((void**)&device_array,

num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 58: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 58

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

// configuracao de bloco e gridint block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 59: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 59

#include <stdlib.h>#include <stdio.h>// extensao __global __ define kernel__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

// lancamento do kernelkernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 60: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 60

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

// transfere resultado da GPU para CPUcudaMemcpy(host_array, device_array,

num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 61: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 61

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

// inspecao do resultadofor(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}

free(host_array);cudaFree(device_array);

}

Page 62: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 62

#include <stdlib.h>#include <stdio.h>

__global__ void kernel(int *array){

//do work}

int main(void){int num_elements = 256;

int num_bytes = num_elements * sizeof(int);

int *host_array = 0;

host_array = (int*)malloc(num_bytes);

int *device_array = 0;

cudaMalloc((void**)&device_array, num_bytes);

int block_size = 128;int grid_size = num_elements /

block_size;

kernel<<<grid_size,block_size>>>(device_array);

cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

for(int i=0; i < num_elements; ++i){

printf("%d ", host_array[i]);}// desaloca memoriafree(host_array);cudaFree(device_array);

}

Page 63: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 63

Page 64: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 64

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 65: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 65

Definido por extensão __global__

Configurado por sintaxe <<<grid_size, block_size>>>

Page 66: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 66

Page 67: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 67

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 68: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 68

Page 69: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 69

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 70: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 70

Todas as threads em um mesmo grid executam o mesmo kernel Necessidade de haver coordenadas únicas para distinção

Page 71: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 71

Todas as threads em um mesmo grid executam o mesmo kernel Necessidade de haver coordenadas únicas para distinção

Coordenadas criadas pelo CUDA Runtime System:

Page 72: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 72

Todas as threads em um mesmo grid executam o mesmo kernel Necessidade de haver coordenadas únicas para distinção

Coordenadas criadas pelo CUDA Runtime System: blockIdx índice do bloco

Page 73: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 73

Todas as threads em um mesmo grid executam o mesmo kernel Necessidade de haver coordenadas únicas para distinção

Coordenadas criadas pelo CUDA Runtime System: blockIdx índice do bloco

threadIdx índice da thread

Page 74: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 74

Todas as threads em um mesmo grid executam o mesmo kernel Necessidade de haver coordenadas únicas para distinção

Coordenadas criadas pelo CUDA Runtime System: blockIdx índice do bloco

threadIdx índice da thread

gridDim dimensão do grid

Page 75: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 75

Todas as threads em um mesmo grid executam o mesmo kernel Necessidade de haver coordenadas únicas para distinção

Coordenadas criadas pelo CUDA Runtime System: blockIdx índice do bloco

threadIdx índice da thread

gridDim dimensão do grid

blockDim dimensão dos blocos

Page 76: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 76

Kernel é bidimensional

Page 77: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 77

Kernel é bidimensional

Indexação de bloco blockIdx.x blockIdx.y

Page 78: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 78

Kernel é bidimensional

Indexação de bloco blockIdx.x blockIdx.y

Blocos são tridimensionais

Page 79: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 79

Kernel é bidimensional

Indexação de bloco blockIdx.x blockIdx.y

Blocos são tridimensionais

Indexação de thread threadIdx.x

threadIdx.y

threadIdx.z

Page 80: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 80

Page 81: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 81

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 82: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 82

Page 83: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 83

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

Comunidade GPGPU

Referências

Page 84: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 84

Page 85: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 85

Universidades brasileiras ensinando CUDA

Page 86: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 86

Centro Nacional de Processamento de Alto Desempenho

Page 87: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 87

Introdução CPU X GPU GPGPU

Arquitetura GPU moderna Compute Capability NVIDIA Fermi

CUDA Arquitetura Modelo de programação Modelo de memória Modelo de execução

CUDA C ModeIo de Computação Heterogênea Kernels CUDA Memories CUDA Threads Libs

ComunidadeGPGPU

Referências

Page 88: Computação de Alto Desempenho utilizando GPU

01/04/2011 Instituto de Matemática e Estatística - Universidade de São Paulo 88

CUDA by example, an introduction to General-Purpose GPU Programming, J. Sanders and E. Kandrot, Addison Wesley.

CUDA Zone (http://www.nvidia.com/object/cuda home new.html), Março 2011.

GPUBrasil (http://gpubrasil.com), Março 2011.

Optimization principles and application performance evaluation of a multithreaded gpu using cuda. Shane Ryoo, Christopher I. Rodrigues, Sara S. Baghsorkhi, Sam S. Stone, David B. Kirk, and Wen mei W. Hwu. In PPoPP, pages73-82. ACM, 2008.

NVIDIA CUDA C Best Practices Guide. NVIDIA, Version 3.2, 20/8/2010.

NVIDIA CUDA C Programming Guide. NVIDIA, Version 3.2, 11/9/2010.

Programming Massively Parallel Processors: A Hands-on Approach, D. Kirk, W. Hwu, Morgan Kaufman.

The GPU Computing Era. J. Nickolls and W. Dally. IEEE Micro, 30(2):56–69, 2010.

The Top 10 Innovations in the New NVIDIA Fermi Architecture, and the Top 3 Next Challenges. David Patterson, September 30, 2009.

NVIDIA's Next Generation CUDA Compute Architecture: Fermi. NVIDIA Whitepaper, Version 1.1.

Page 89: Computação de Alto Desempenho utilizando GPU

Introdução à Computação de Alto Desempenho Utilizando GPU

Seminário de Programação em GPGPU

Eng. Thársis T. P. [email protected]

Instituto de Matemática e Estatística - Universidade de São Paulo