Programação de Processadores Massivamente Paralelos: Uma Abordagem Prática
Este curso oferece uma introdução abrangente ao computação em GPU e programação paralela usando o ambiente CUDA C. Aborda arquiteturas de GPU, paralelismo de dados, gerenciamento de threads, otimização de memória e considerações avançadas de desempenho, ilustradas por estudos de caso do mundo real como reconstrução de ressonância magnética e visualização molecular.
Visão Geral do Curso
Resumo do Conteúdo
Este curso oferece uma introdução abrangente ao computação em GPU e programação paralela usando o ambiente CUDA C. Ele aborda arquiteturas de GPU, paralelismo de dados, gerenciamento de threads, otimização de memória e considerações avançadas de desempenho, ilustrados por estudos de caso do mundo real, como reconstrução de ressonância magnética e visualização molecular.
Domine a arte da computação paralela de alto desempenho com um guia prático e baseado em exercícios sobre CUDA e arquiteturas de GPU.
Autor: David B. Kirk, Wen-mei W. Hwu
Agradecimentos: Ian Buck, John Nickolls, equipe NVIDIA DevTech, Jensen Huang, David Luebke, Bill Bean, Simon Green, Mark Harris, Manju Hedge, Nadeem Mohammad, Brent Oster, Peter Shirley, Eric Young e Cyril Zeller.
Objetivos de Aprendizagem
- Distinguir entre os filosofias de design e trajetórias de desempenho de CPUs multicore e GPUs many-core.
- Identificar os componentes principais de uma arquitetura de GPU moderna, incluindo Multiprocessadores de Fluxo (SMs) e estruturas de memória.
- Aplicar a Lei de Amdahl para calcular o ganho teórico de velocidade e identificar o impacto de gargalos sequenciais.
- Contrastar as diferenças arquitetônicas entre pipelines fixos e matrizes de processadores unificadas programáveis.
- Explicar o papel do "GPGPU" como um passo intermediário e as restrições dos modelos iniciais de programação de shaders.
- Analisar como recursos de hardware como operações atômicas, sincronização de barreira e suporte a precisão dupla permitiram a transição para computação geral escalável.
- Identificar e explorar o paralelismo de dados em algoritmos de multiplicação de matrizes.
- Implementar o gerenciamento de memória do dispositivo, incluindo alocação, transferência de dados entre host e dispositivo e desalocação.
- Criar e lançar kernels CUDA usando indexação de thread e configurações apropriadas de grade/bloco.
- Projetar hierarquias multidimensionais de threads (grades e blocos) para mapear estruturas de dados complexas no hardware da GPU.