Lista de Alunos | Aula 1 | Aula 3

2a. aula - CUDA

Paralelismo de dados

  • propriedade do programa em que várias operações podem ser feitas de forma paralela e simultânea
  • exemplo: operações pontuais na imagem ou matriz, multiplicação de matrizes

Estrutura de um programa CUDA

  • código fonte, parte roda no hospedeiro, parte nos dispositivos da GPU
  • kernel: Código do dispositivo é escrito extensão ANSI C com palavras chaves para marcar operações paralelas
  • threads têm pouco overhead
  • grid: as threads executadas na chamada de um kernel

Hardware GPU NVidia

  • As placas GPU possuem diversos multiprocessadores de fluxo (Streaming Processors SP) que compartilham memória rápida
  • A GPU tem um mecanismo de chaveamento de threads feito por hardware muito avançado que permite gerenciar um grande número de threads por blocos
  • A eficiência do paralelismo consiste em manter os prrocessadores de fluxo ocupados a maior parte do tempo.

Decomposição das threads em CUDA

  • Como os SP compartilham memória local, o modelo CUDA de programação prevê dois níveis de decomposição: - número de blocos (1 ou 2 dimensões) - número de threads por bloco (1, 2 ou 3 dimensões)

Exemplo de multiplicação matriz por escalar

  • No primeiro exemplo dado, tanto o número de blocos como o número de threads foram organizados de forma unidimensional e os endereços dos elementos da matriz foram linearizados.
  • A matriz foi decomposta em N^2/512

Exercício (Lista 2)

  1. Ler o capítulo 4
  2. Refazer o(s) programa(s) entregue(s) no exercício 1, porém agora utilizando CUDA. (Para programar em CUDA veja CUDA em C++). O Wetzel já fez um programa CUDA ( Dilatação em CUDA). O pyCUDA será desativado em breve do Adessowiki, pois ele não mostrou vantagens frente ao uso do CUDA diretamente.
  3. Fazer alguns programas simples de processamento de imagens cuja equação do pixel seja totalmente independente de qualquer outro pixel, de modo que ele é facilmente paralelizável. Exemplo: geração de imagens sintéticas, como círculo, gaussiana, rampa, etc.
  4. Fazer um programa cujo resultado depende do processamento de vários pixels. Por exemplo, calcular a somatória de todos os elementos de uma matriz.
  5. Calcular o histograma de uma imagem cujos pixels sejam do tipo uint8 (byte sem sinal). O resultado é um vetor de 256 elementos, de 0 a 255, onde o i-ésimo elemento contém o número de vezes que existe o valor i na matriz (imagem).