5 pontos por GN⁺ 2023-10-22 | 1 comentários | Compartilhar no WhatsApp
  • Uma compreensão básica de computação em GPU é essencial para todo engenheiro de software
  • Este texto foca principalmente em GPUs da Nvidia e usa a terminologia da Nvidia
  • GPUs são projetadas para processamento massivamente paralelo e alta taxa de transferência em gráficos, computação numérica, deep learning e mais

Comparando CPU e GPU

  • CPUs são projetadas para execução sequencial de instruções e incluem vários recursos para reduzir a latência na execução de instruções.
  • GPUs são projetadas para processamento massivamente paralelo e alta taxa de transferência, e têm latência de execução de instruções de média a alta.
  • GPUs podem processar um número muito maior de operações, muito mais rapidamente, do que CPUs.

# Arquitetura de GPU

Arquitetura de computação da GPU

  • Uma GPU é composta por um conjunto de streaming multiprocessors (SMs).
  • Cada SM inclui vários streaming processors (cores ou threads).
  • Um SM possui uma quantidade limitada de memória on-chip (memória compartilhada ou scratchpad), compartilhada por todos os cores.

Arquitetura de memória da GPU

  • Uma GPU possui vários tipos de memória em múltiplos níveis.
  • Cada SM possui uma grande quantidade de registradores, que são compartilhados entre os cores.
  • O cache de constantes é usado para armazenar em cache dados constantes usados na execução do código.
  • A memória compartilhada é uma memória SRAM on-chip rápida, de baixa latência e programável.
  • O cache L1 armazena em cache dados frequentemente acessados do cache L2.
  • O cache L2 é compartilhado por todos os SMs e armazena em cache dados frequentemente acessados da memória global.
  • A memória global é uma DRAM de alta capacidade e alta largura de banda, distante dos SMs, portanto com alta latência.

# Entendendo o modelo de execução da GPU

Breve introdução a kernels CUDA e blocos de threads

  • CUDA é uma interface de programação para escrever programas para GPUs da Nvidia.
  • Um kernel é uma computação expressa em uma forma semelhante a uma função C/C++ que é executada em paralelo na GPU.
  • Para executar um kernel, é iniciado um conjunto de threads chamado grid.

Etapas da execução de um kernel na GPU

  1. Copiar dados do host para o device
  2. Escalonar blocos de threads para os SMs
  3. Single Instruction Multiple Threads (SIMT) e warps
  4. Escalonamento de warps e tolerância à latência
  5. Copiar os dados de resultado do device para a memória do host

# Conceitos de particionamento de recursos e ocupação

  • A utilização de recursos da GPU é medida por uma métrica chamada "ocupação", que representa a razão entre o número de warps alocados e o número máximo de warps que um SM pode suportar.
  • A ocupação é limitada pelos recursos de execução do SM, registradores, memória compartilhada, slots de blocos de threads e slots de threads.
  • É importante minimizar a latência mantendo alta ocupação por meio da otimização do código.

# Resumo

  • Uma GPU é composta por vários SMs, e cada SM possui vários cores de processamento.
  • A memória global fica distante no chip e tem alta latência.
  • Os caches L1 e L2 funcionam de forma semelhante aos caches L1/L2 da CPU.
  • Cada SM tem memória compartilhada, que é compartilhada entre os cores.
  • Para executar um kernel na GPU, é iniciado um grid de threads.
  • A GPU atribui blocos para execução nos SMs, e todas as threads de um bloco são executadas no mesmo SM.
  • As threads atribuídas a um SM são ainda agrupadas em conjuntos de 32 chamados warps.
  • A GPU realiza particionamento dinâmico de recursos entre threads de acordo com os requisitos das threads e os limites do SM.

# Encerrando

  • GPUs são amplamente usadas hoje em dia, e sua arquitetura e modelo de execução são fundamentalmente diferentes dos das CPUs.
  • Este texto aborda vários aspectos das GPUs e oferece insights sobre por que elas são tão amplamente usadas e como funcionam.

Opinião do GN⁺

  • GPUs são uma tecnologia essencial para deep learning e computação numérica complexa, e este texto ajuda a entender a arquitetura básica e o modelo de execução de uma GPU.
  • O conteúdo é especialmente importante para engenheiros de software iniciantes interessados em processamento paralelo e computação de alto desempenho.
  • Este texto oferece conhecimento básico sobre programação para GPU e é um material interessante que desperta curiosidade sobre a área.

1 comentários

 
GN⁺ 2023-10-22
Comentários do Hacker News
  • O artigo é criticado por ser especializado em Nvidia e ignorar outras alternativas válidas, como Sycl, Sapphire Rapids e o MI300 da AMD.
  • Há apontamentos de que faltou mencionar cópia assíncrona para evitar que a GPU fique ociosa durante a transferência de dados.
  • O artigo é elogiado como uma boa introdução à programação de GPU, mas há a sugestão de explorar técnicas mais avançadas.
  • Alguns leitores questionam a precisão da afirmação do artigo de que a lei de Little, da teoria das filas, se aplica à GPU.
  • A explicação do artigo sobre arquitetura de memória é criticada por não mencionar que o cache não fornece garantias de coerência entre threads.
  • Há a proposta de renomear a GPU para PPU (Parallel Processing Units) para refletir melhor suas capacidades.
  • O artigo é elogiado como uma das melhores explicações sobre programação de GPU e recomendado para uso em mentoria.
  • A programação SIMD é descrita como "selvagem", com cálculos fáceis para todos os pixels, mas dificuldade com condições de desvio.
  • Foi levantada uma dúvida sobre a eficiência de usar GPU para determinadas tarefas de computação em arrays, considerando a necessidade de enviar dados para a GPU e trazê-los de volta.