31 pontos por GN⁺ 2025-06-10 | 2 comentários | Compartilhar no WhatsApp
  • Pergunta sobre quais livros/cursos/projetos seguir para aprender programação em CUDA (já que muitas empresas onde gostaria de trabalhar exigem experiência com CUDA)

Resumo das respostas do HN

  • Materiais de estudo e primeiros passos

    • Recomendam o CUDA Programming Guide oficial da NVIDIA e os livros de arquivo da NVIDIA
    • Começar com pequenos programas de exemplo e praticar paralelização aos poucos; conhecimento prévio de C/C++ é muito importante
    • Usar código open source (GitHub etc.) e LLMs (por exemplo, ChatGPT) para interpretar a estrutura do código e praticar
    • Recomendam uma abordagem prática com um plano de cerca de 6 a 8 semanas
  • Hardware e ambiente necessários

    • Uma GPU NVIDIA dos últimos 10 anos já é suficiente, especialmente Turing/RTX 20xx, Ampere/RTX 30xx ou superior; modelos antigos (anteriores a Maxwell) têm limitações de suporte e desempenho
    • Usar a versão mais recente do CUDA Toolkit e verificar obrigatoriamente a Compute Capability da GPU (consulte a tabela de suporte)
    • Tanto Windows quanto Linux funcionam, e dependendo do ambiente também é possível usar Docker e VPS
    • Se você não tiver GPU, pode experimentar com emuladores online como o leetgpu.com
  • Fundamentos de programação paralela

    • Mais importante do que a sintaxe do CUDA em si é entender algoritmos paralelos e arquitetura de hardware
    • Livros de referência:
      • Programming Massively Parallel Processors (PMPP)
      • Foundations of Multithreaded, Parallel, and Distributed Programming
      • Scientific Parallel Computing
      • The Art of High Performance Computing (Victor Eijkhout, gratuito)
    • No trabalho real, a demanda por CUDA costuma se concentrar em uso de bibliotecas baseadas em CUDA, como cuBLAS e cuDNN, e em maximizar o desempenho paralelo
  • Metodologia de aprendizado

    • Em vez de estudar só a sintaxe, recomendam portar pequenos códigos de CPU para CUDA → medir desempenho → otimizar gradualmente
    • No começo, foco em corretude; depois, aplicar otimizações de desempenho em etapas (gerenciamento de memória, shared memory, uso de registradores etc.)
    • Exemplos práticos recomendados: prefix scan, GEMM, n-body simulation e outros algoritmos clássicos de paralelismo
    • Estudar primeiro bibliotecas de abstração de mais alto nível, como CUDA Thrust, CUTLASS e cub, e deixar a implementação manual para depois
  • Prática profissional e carreira

    • A exigência de experiência com CUDA aparece principalmente em áreas como deep learning, engenharia de dados, HPC (computação científica) e gráficos de jogos
    • Há vagas que não pedem apenas PyTorch/Tensorflow, mas experiência em otimização de kernels e bibliotecas CUDA centrais
    • Para desenvolver especialização prática, também é importante saber usar ferramentas de baixo nível como PTX, nvcc, cuobjdump e Nsight Systems/Compute
    • Participação em comunidades: gpumode Discord, GPU Puzzles e outras comunidades ativas para revisão de código e discussões práticas
  • Cuidados e conselhos realistas

    • Começar é fácil, mas otimizar para diferentes hardwares (arquitetura/conjunto de instruções) e garantir compatibilidade é muito difícil, com alta barreira de entrada
    • Na prática, experiência profissional e networking são importantes, e aprendizado autodirigido por si só não substitui experiência de mercado
    • CUDA é uma área em que hardware, computação paralela, algoritmos e otimização estão todos interligados, então recomendam focar em uma dessas áreas e se aprofundar nela

2 comentários

 
ahwjdekf 2025-06-12

Bem, sei lá. Talvez haja casos em que se use cuda diretamente. Especialmente na Coreia, então.

 
GN⁺ 2025-06-10
Comentário no Hacker News
  • Como participante do concurso cudacontest da NVidia em 2008, e uma das poucas pessoas da Índia a enviar uma submissão, além de ter recebido um prêmio de participação com uma BlackEdition Card, compartilho o método que segui

    • Consultar o NVidia CUDA Programming Guide
    • Usar os livros sobre programação CUDA distribuídos pela NVidia (veja developer.nvidia.com/cuda-books-archive)
    • Começar escrevendo programas pequenos com base em implementações existentes (uma base forte em C é essencial, então vale revisar se necessário)
    • Considerar que você já instalou o toolchain, o compilador e tem o hardware necessário para trabalhar
    • Analisar código de projetos CUDA no GitHub e, hoje em dia, também usar LLMs para pedir explicações do código
    • Começar com programas pequenos baseados em paralelismo e ir expandindo aos poucos
    • Em 1 a 2 meses, com calma, já dá para começar bem em programação CUDA
    • Hoje o ambiente tem muito mais materiais e recursos do que em 2007/08
    • Recomendo montar e executar um plano de estudos de 6 a 8 semanas
    • Se deixar perguntas, posso tentar ajudar no que for possível
      • Tenho curiosidade sobre o hardware necessário. Uma placa Nvidia de cerca de 5 anos atrás já basta, ou é preciso algo mais específico?
      • Também queria saber qual ambiente de desenvolvimento você usa. O Windows ainda é o principal ambiente para desenvolvimento com CUDA?
  • Dei uma olhada direta no código CUDA do Leela Chess Zero e achei compreensível

    • Na época, o Leela usava uma arquitetura DCNN em vez de transformer, e aprendi o básico de DCNN com relativa facilidade por meio dos vídeos da fast.ai
    • Transformer é mais complexo, então ainda não consegui começar a estudar isso
    • A linguagem CUDA em si é baseada em C++, então, se você já tem experiência com C++, dá para entrar sem tanta dificuldade
    • Mas, se você quer se tornar desenvolvedor CUDA, é bem importante chegar ao nível de programação para IA — e IA é um campo muito mais profundo e vasto que CUDA, exigindo muito tempo e experiência prática
    • Ainda assim, quando você adquire essa competência, a demanda de mercado é muito alta
    • Recomendo fortemente os vídeos da fast.ai
    • Se for para jogos, a conversa acaba chegando em gráficos 3D, mas hoje isso ficou muito mais complexo e eu já não sei qual seria o caminho de entrada
      • Procurar vaga como desenvolvedor CUDA hoje é menos pesado do que em outras áreas de engenharia de software? Trabalho atualmente com middleware Java e acho que CUDA e IA podem ser uma boa transição de carreira
      • Esse código é este aqui? E tenho duas perguntas de iniciante
        • Por que escreveram diretamente em C++/CUDA? O PyTorch ou TensorFlow simplesmente não seriam rápidos o suficiente para treinar o Leela?
        • E também há código em TensorFlow; por que isso?
  • Se a motivação é dinheiro, eu recomendaria pular HPC e áreas muito matemáticas

    • Nessa área, se você não tiver nível de doutorado, é difícil chamar atenção por melhor que seja
    • O que realmente vale dinheiro é dominar ferramentas como PTX, nvcc, cuobjdump, Nsight Systems, Nsight Compute, além de analisar codebases open source como CUTLASS
    • Recomendo consultar estas notas práticas
    • Acima de tudo, não fique só no HN; vale entrar na comunidade discord gpu mode, onde estão desenvolvedores de verdade
      • Parece incrível e prático, mas também muito nichado
      • A entrada em si é difícil, e isso só é usado em áreas limitadas como indústria de jogos, drivers etc.
      • Foi mencionado que, para chegar direto nesse nível desde o começo, é preciso bastante talento
  • Os recursos e a comunidade no Discord do gpumode.com oferecem material de estudo suficiente para vários meses

    • O livro Programming massively parallel processors
    • A documentação oficial do nvidia cuda é muito abrangente
    • Também recomendo encarar o GPU-Puzzles
      • Olhando o código de exemplo do ThunderKittens flashattention-2, dá para sentir uma complexidade de código difícil de explicar em palavras
      • Acho que esses puzzles têm uma dinâmica de "o vencedor leva tudo", então a diferença prática de resultado fica dentro de 1%, e o exercício em si não tem tanto significado
  • Recomendo dividir o escopo de estudo para tornar a entrada mais acessível

      1. Aprender CUDA em si (frameworks/bibliotecas/camadas de abstração)
      1. Fundamentos de computação de alto desempenho (isso vale não só para GPU e Nvlink, mas para arquitetura HPC em geral)
      1. Especialização na área de aplicação (se for Transformer, começar por abstrações modernas de alto nível como Torch, TensorFlow etc.)
    • Se você realmente quer dominar CUDA, o ponto central é experimentar e entender os princípios da programação massivamente paralela, e boa parte disso é transferível
      • Como ex-desenvolvedor de GPU, eu daria exatamente o mesmo conselho, com ênfase especial nos itens 2 e 3
      • Dependendo do objetivo profissional, o mais importante talvez seja experiência com bibliotecas CUDA como cuDNN, cuBLAS, cuFFT etc.
      • Entender os princípios da programação paralela vem antes de tudo
      • Essa abordagem é a correta; começar direto pelo item 1 sem o item 2 só gera mais confusão
      • Livro recomendado
  • Compartilhando minha experiência pessoal de aprendizado de CUDA

    • Não foi um processo muito sistemático, mas me ajudou bastante na academia e na pesquisa
    • Precisei aprender CUDA diretamente por causa do meu projeto de doutorado
    • Como não havia ninguém experiente no laboratório, comecei pelos cursos básicos da NVIDIA (Getting Started with Accelerated Computing with CUDA C/C++ e a versão em Python) para construir os fundamentos conceituais
    • Além dos tutoriais oficiais, na prática houve muito aprendizado por tentativa e erro
    • Usei tutoriais e livros online, mas funções e APIs mudavam rápido, então havia muita confusão entre versões antigas e novas, além da necessidade de prestar atenção à compatibilidade entre minha GPU e o ambiente real
    • O mais difícil foi que a maior parte do tempo acabou sendo gasta com debugging (descobrir por que estava mais lento do que eu esperava) e com ferramentas como compute-sanitizer e Nsight
    • Recomendo não ter pressa: pegue um projeto simples que rode em CPU, faça o port para CUDA e ganhe experiência otimizando com benchmark
    • Deixe a otimização para o final; primeiro priorize implementar o comportamento correto
    • Um kernel lento, mas sem corrupção de memória, vale mais do que um kernel otimizado
      • Tive uma experiência parecida no doutorado — resultado prático com flashrnn
      • Se você já entendeu os princípios básicos e a arquitetura de GPU, este é o workflow que recomendo
        1. Monte um ambiente onde seja possível testar kernels e comparar com um baseline em linguagem de nível mais alto
        2. Se não houver projeto urgente, revise ou reimplemente problemas clássicos conhecidos (como MatMul) — sem tentar cobrir todos os casos, focando em funcionalidades específicas
        3. Aumente a complexidade gradualmente — loops, paralelização em grid, uso de memória global/compartilhada/de registradores, e então avance de multiplicação simples de matrizes para TensorCore (MMA)
        4. Releia repetidamente o CUDA C Programming Guide — isso só é realmente assimilado junto com a prática
        5. Abstrações de nível mais alto como CUTLASS e ThunderKitten também podem ser recomendadas dependendo do caso; se estiver em ambiente JAX/Torch, use Triton primeiro
      • Leva mais tempo para dominar até PTX, mas o ponto é enfatizar o aprendizado na prática, no corpo a corpo com problemas reais
      • Concordo profundamente sobre a dor do debugging de performance em CUDA
  • Apresento um material que usei ao ensinar CUDA para um estudante do ensino médio — não basta para dominar tudo sozinho, mas ajuda bastante no começo

  • Ainda não usei, mas parece bem interessante, então quero recomendar a plataforma leetgpu.com

  • Gostaria de ouvir opiniões de quem trabalha na área sobre cargos, posições e tipos de empresa que contratam engenheiros CUDA

    • Hoje muitas empresas usam bibliotecas baseadas em CUDA, como PyTorch, mas não sei se desenvolvimento nativo em CUDA é algo que muitas empresas realmente precisam
    • Espero identificar organizações ou funções que trabalhem diretamente com CUDA
      • No caso da nossa equipe, usamos CUDA diretamente para análise de dados geoespaciais
      • Rasterizamos tiles de slippy map e fazemos a sumarização raster na GPU
      • Como a maior parte do processamento é independente por pixel, isso se encaixa bem em GPU
      • Fazemos paralelização da sumarização por linha e depois agregamos no final
      • Mas, atualmente, a cópia de dados para a GPU é o gargalo
  • Adaptando-se à mudança dos tempos, também vale usar LLMs como Claude para fazer perguntas e receber de uma vez só código resultante e explicações

    • Em 2025 isso talvez ainda funcione, mas em 2026 a exigência provavelmente será um nível acima, na opinião de um comentário