14
Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Embed Size (px)

Citation preview

Page 1: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Introdução a GPGPU• CUDA: arquitetura de computação paralela para GPGPU

1

Page 2: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Introdução a GPGPU

• Por que CUDA?– Desempenho versus custo– NVIDIA é líder de mercado: mais de 108 GPUs– Programação paralela para muitos

• Instalação de CUDA1. Driver2. CUDA toolkit (compilador e bibliotecas)3. CUDA SDK (utilitários e exemplos)

• www.nvidia.com/object/cuda_get.html

2

Page 3: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Host: executa a aplicação (CPU)– Dispositivo (GPU)• Coprocessador da CPU• Executa kernels

– Host e dispositivo tem DRAMs próprias– Host:• Aloca memória no dispositivo• Transfere dados de entrada para o dispositivo• Dispara a execução de kernels• Transfere dados resultantes do dispositivo• Libera memória no dispositivo

3

Page 4: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Kernel

• Função geralmente escrita em C para CUDA• Executa no dispositivo N vezes em N threads em paralelo

– Threads são organizadas em blocos– Um bloco é um arranjo 1D, 2D ou 3D de threads

• Cada thread de um bloco tem um índice 1D, 2D ou 3D

– Blocos são organizados em grids– Um grid é um arranjo 1D ou 2D de blocos

• Cada bloco de um grid tem um índice 1D ou 2D• Os blocos de um grid têm o mesmo número de threads

4

Page 5: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Exemplo: kernel executando em 72 threads– Grid 2D com:• Dimensão 3×2×1• 6 blocos

– Blocos 2D com:• Dimensão 4×3×1• 12 threads cada

5

Page 6: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Um kernel é uma função que:• Começa com o especificador __global__• Tem tipo de retorno void

– Kernels podem invocar outras funções que:• São especificadas como __device__• Podem invocar outras especificadas como __device__

– Funções que executam no dispositivo:• Não admitem número variável de argumentos• Não admitem variáveis estáticas• Não admitem recursão• Não admitem variáveis do tipo endereço de função

6

Page 7: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Kernels são invocados do host– Um dispositivo executa um kernel de cada vez

7

Page 8: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Configuração de execução de um kernel

• Dimensões do grid e dos blocos• Tamanho da memória compartilhada (opcional)• Especificada na invocação (ou lançamento) do kernel

– Dimensão 3D é representada por objeto do tipo dim3– Um grid:

• 1D de dimensão dim3 dG tem dG.x × 1 × 1 blocos• 2D de dimensão dim3 dG tem dG.x × dG.y × 1 blocos

– Um bloco:• 1D de dimensão dim3 dB tem dB.x × 1 × 1 threads• 2D de dimensão dim3 dB tem dB.x × dB.y × 1 threads• 3D de dimensão dim3 dB tem dB.x × dB.y × dB.z threads

8

Page 9: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Identificador global de uma thread– Pode ser usado para indexar vetores em funções __global__ ou __device__

– Determinado a partir das variáveis pré-definidas:• dim3 gridDim

– Dimensão do grid• dim3 blockDim

– Dimensão do bloco• dim3 blockIdx

– Índice do bloco no grid • dim3 threadIdx

– Índice da thread no bloco

9

Page 10: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

10

• Modelo de programação– Hierarquia de memória acessada por uma thread • Memória compartilhada do bloco da thread

– Visível para todas as threads do bloco– Tempo de vida do bloco

• Memória local da thread• Memória global• Memória constante• Memória de textura

Somente leituraTempo de vida

da aplicação

Page 11: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Modelo de programação– Capacidade de computação• 1.0• 1.1• 1.2• 1.3

– Especificações: depende do dispositivo• Número de multiprocessadores e processadores• Dimensões de grids e blocos• DRAM• Memória compartilhada, etc.

11

Page 12: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Interface de programação– C para CUDA e API de runtime– API de driver– Ambas APIs têm funções para:• Gerência de memória no dispositivo• Transferência de dados entre host e dispositivo• Gerência de sistemas com vários dispositivos, etc.

– API de runtime tem também funções para:• Gerenciamento de threads• Detecção de erros

– Manual de referência de CUDA

12

APIs exclusivas

Page 13: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Programa básico em C para CUDA– Seleção do dispositivo a ser usado– Alocação de memória no host– Dados de entrada na memória do host– Alocação de memória no dispositivo– Transferência de dados do host para dispositivo– Invocação do(s) kernel(s)– Transferência de dados do dispositivo para host– Liberação de memória no host– Liberação de memória no dispositivo– Finalização

13

Page 14: Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 1

Fundamentos de programação CUDA

• Programa básico em C para CUDA– Seleção do dispositivo a ser usadocudaSetDevice()

– Alocação de memória no dispositivocudaMalloc()

– Transferência de dados entre host e dispositivocudaMemcpy()

– Liberação de memória no dispositivocudaFree()

– FinalizaçãocudaThreadExit()

14