| Ementa: |
1. Introdução: Evolução dos computadores. Programação sequencial e programação paralela. Diferentes arquiteturas dos processadores. Processadores com memória compartilhada. Processadores com memórias não compartilhadas. Placas gráficas. Processamento em placas gráficas. Taxonomia de Flym 2. Medidas de performance de computação paralela: Eficiência e ganho de velocidade (speedup). Lei de Amdahl. Lei de Gustafson-Barsis. Métrica de KarpFlatt. Métrica de isoeficiência. 3. Paralelização com memória compartilhada: O modelo de memória compartilhada. Programação paralela usando openmp: Um primeiro código openmp. Estruturas de repetição em paralelo. Condições de corrida. Seções críticas. Exemplos de códigos de programação paralela com openmp: soma dos elementos de um vetor, multiplicação vetor-vetor, multiplicação matriz-vetor, multiplicação matriz-matriz, resolução da equação de calor usando diferenças finitas. 4. Programação paralela com memória distribuída: O modelo de memória distribuída. Princípios do Message passing interface (MPI). A comunicação via mensagem entre os processadores. Distribuição dos dados nas memórias. Acesso aos dados. Exemplos de códigos de programação paralela com openmp: soma dos elementos de um vetor, multiplicação vetor-vetor, multiplicação matriz-vetor, multiplicação matriz-matriz, resolução da equação de calor usando diferenças finitas. 5. Processamento em placas gráficas: Os modelos de programação Cuda e opencl. Transferência de dados entre a CPU e a GPU. Exemplos de códigos de programação paralela com cuda: soma dos elementos de um vetor, multiplicação vetor-vetor, multiplicação matriz-vetor, multiplicação matriz-matriz, resolução da equação de calor usando diferenças finitas. 6. A biblioteca Petsc para programação paralela de métodos numéricos: Exemplos de programação com a biblioteca Petsc. Diferenças finitas e elementos finitos. 7. Programas opensource de elementos finitos com programação paralela: O programa Deal.ii. O programa Fenics. |