Objectivos

Fornecer aos alunos noções avançadas da teoria e prática dos modelos de computação orientados para arquitecturas paralelas e distribuídas. Particular ênfase na programação em memória distribuída com o MPI, na programação em memória partilhada com processos, threads e OpenMP, e na programação para arquitecturas CUDA.

Programa

Fundamentos
Programação paralela, concorrência e paralelismo. Taxonomia de Flynn. Metodologia de programação de Foster. Principais modelos e paradigmas de programação paralela.

Programação em Memória Distribuída com o MPI
A especificação MPI, troca explícita de mensagens, protocolos de comunicação, tipos derivados e empacotamento de dados, comunicações colectivas, comunicadores, topologias.

Programação em Memória Partilhada com Processos
Processos, segmentos de memória partilhada, mapeamento de ficheiros em memória partilhada, spinlocks, semáforos.

Programação em Memória Partilhada com o Pthreads
Processos multithreaded com o Pthreads, mutexs, variáveis de condição, chaves, implementações do Pthreads.

Programação em Memória Partilhada com o OpenMP
A especificação OpenMP, directivas de compilação, constructores de work-sharing, constructores de sincronização, funções básicas, funções de locking, variáveis de ambiente, remoção de dependências nos dados.

Programação Híbrida com o MPI e o OpenMP
Estratégias de combinação do MPI com o OpenMP em clusters multi-processador. Executar o MPI com suporte para multithreading.

Memórias Cache e Arquitecturas Multi-Processador
A importância das caches em arquitecturas multi-processador: localidade espacial e temporal, sincronização com barreiras e com exclusão mútua.

Programação para Arquitecturas CUDA
Arquitecturas GPU recentes. Interface de programação de sistemas CUDA. Exemplos de programas.

Métricas de Desempenho
Medidas de speedup, eficiência, redundância, utilização e qualidade duma aplicação paralela. Lei de Amdahl. Lei de Gustafson-Barsis. Métrica de Karp-Flatt. Métrica de isoeficiência.

Algoritmos Paralelos
Estratégias de escalonamento e balanceamento de carga. Paralelização de algoritmos de ordenação, de algoritmos de procura, de algoritmos baseados em métodos de Monte Carlo, e de algoritmos para multiplicação de matrizes.

Bibliografia

Parallel Programming with MPI
P. Pacheco. Morgan Kaufmann.

Parallel Programming in C with MPI and OPenMP
Michael J. Quinn. McGraw-Hill.

Advanced Linux Programming
M. Mitchell, J. Oldham and A. Samuel. New Riders.

Pthreads Programming
B. Nichols, D. Buttlar and J.P. Farrell. O'Reilly.

Parallel Programming in OpenMP
R. Chandra, L. Dagum, D. Kohr, D. Maydan, J. McDonald and R. Menon. Morgan Kaufmann.

Parallel Programming: Techniques and Applications Using Networked Workstations and Parallel Computers
B. Wilkinson, M. Allen. Prentice Hall.

Informação Complementar

MPI Forum

A User's Guide to MPI

MPI Primer/Developing With LAM

OpenMP API

An Introduction Into OpenMP