PPGCC oferece o curso “Introdução à Programação de GPUs”

Oferecido como parte do Programa de Pós-graduação em Ciência da Computação, o curso Introdução à Programação de GPUs recebe inscrições, até a próxima quarta-feira, 27, também de alunos de outros cursos ou externos à UFMG, na forma de disciplina eletiva ou isolada.

No curso, os alunos irão aprender programação de GPUs usando algoritmos paralelos e um pouco de arquitetura de computadores. 

Período:
- 7 de Outubro a 2 de Dezembro.
- Horário: Terça e Quinta, entre 13h00 e 14h40
- Local: ICEx, sala 2014
- DATA LIMITE PARA MATRICULA: 27 de Agosto de 2014
  (interessados melhor não demorarem para manifestar seu interesse, mesmo porque o curso deve lotar rápido!!!)

Instruções para efetivar a matrícula:
    O aluno interessado deve escrever para "ppgcc@dcc.ufmg.br" (copiar fernando@dcc.ufmg.br - coordenador do curso), informando a sua situação estudantil (aluno de graduação DCC/UFMG ou aluno da pós graduação DCC/UFMG ou aluno da UFMG ou aluno externo). Alunos externos farão o curso como disciplina isolada.

Metodologia:
- 15 horas de aulas expositivas, em INGLÊS, e 15 horas de práticas de laboratório.

Bibliografia:
- Programming Massively Parallel Processors: A Hands-on Approach, Wen-Mei Hwu, David Kirk
- CUDA HANDBOOK: A COMPREHENSIVE GUIDE TO GPU PROGRAMMING, Nicholas Wilt
- CUDA Application Design and Development, Rob Farber

Instrutor:
    Sylvain Collange é pesquisador/professor no Laboratório de Pesquisas ALF, parte do Inria em Rennes, França. Ele obteve seu doutorado em Ciência da Computação pela Université de Perpignan Via Domitia em 2010. Sylvain faz pesquisa na área de computação de alto desempenho, com ênfase em arquiteturas SIMD e arquiteturas reconfiguráveis (FPGAs).

Descrição:
    This course serves as an introduction to general-purpose programming on Graphics Processing Units (GPGPU). The target audience are students in Computer Science or Computer Engineering in the last year, or in graduate programs. The objective is to allow students to understand the inner workings of GPUs, program them, and optimize their code to get the most performance out of GPUs. It is based on the prevalent CUDA toolkit from NVIDIA. The course is divided into three main parts, whose outlines are presented below.

1. Introduction to GPU architecture
• GPU and many-core: why and what for?
- Technological trends and constraints
- The evolution from graphics to general purpose

• The kinds of parallelism, how to exploit them
- Why we need parallelism: latency hiding and increased throughput - The sources of parallelism: ILP, TLP, DLP
- The uses of parallelism: horizontal, vertical

• How we would design a GPU
- Building blocks: Sequential core, Multi-core, Multi-threaded core,
SIMD - Architecture of current GPUs: cores, memory
- Future trends

2. GPU programming in CUDA
• Overview GPU programming environments
- Programming in CUDA: host side task and memory management - Tools: compiler, profiler

• Expressing parallelism
- Theory: PRAM, BSP and Multi-BSP
- Implementation: CUDA threads, blocks, grids
- Vector add example

• Inter-thread communication and scheduling
- Managing communications and synchronization - Parallel reduction example
- Enabling data reuse
- Matrix multiplication example

3. GPU code optimization
• Work partitioning and memory optimization
- How many threads?
- Optimizing for locality: tiling and loop interchange - Example: matrix multiplication revisited

• Instruction-level optimization - Thread divergence
- Trading TLP for ILP

• Extra features
- Atomics, zero-copy memory
- Streams and concurrent kernel execution - Dynamic parallelism