Programação Paralela e Distribuída com MPI, OpenMP e OpenACC para computação de alto desempenho
Gabriel P. Silva, Calebe P. Bianchini, Evaldo B. Costa
Prefácio
"Dar-me-eis um grão de trigo pela primeira casa do tabuleiro; dois pela segunda, quatro pela terceira, oito pela quarta, e, assim dobrando sucessivamente, até a sexagésima quarta e última casa do tabuleiro. Peço-vos, ó rei, de acordo com a vossa magnânima oferta, que autorizeis o pagamento em grãos de trigo, e assim como indiquei!" - Malba Tahan, O Homem que Calculava
A pesquisa científica moderna, nas diversas áreas de conhecimento, tem desenvolvido modelos computacionais sofisticados para a solução de problemas cada vez mais complexos. Esses modelos são transformados em aplicações paralelas que realizam simulações com o intuito de obter, no menor prazo possível, aproximações cada vez mais precisas da realidade.
Essas aplicações paralelas são construídas com uso de interfaces de programação e bibliotecas associadas a linguagens de programação convencionais tais como C e FORTRAN, fazendo o uso de plataformas de computação paralelas como clusters, sistemas multiprocessadores de memória compartilhada e aceleradores com alto poder computacional para alcançar o desempenho desejado.
A formação de recursos humanos especializados nesta área demanda um longo tempo de investimento e deve ser iniciada o mais cedo possível, já nos primeiros anos dos cursos de graduação, seja nos cursos de Engenharia da Computação, Ciência da Computação ou Engenharia de Software.
Este livro tem como objetivo apresentar conceitos iniciais de programação paralela para estudantes de graduação, pós-graduação e profissionais da área. Fazemos uso da linguagem C para apresentar exemplos simples e práticos com uso das interfaces de programação e bibliotecas MPI, no paradigma de troca de mensagens, além de OpenMP, no paradigma de memória compartilhada e OpenACC, para uso com aceleradores. Longe de ser um compêndio de referência, as facilidades que esses padrões oferecem para obtenção de um código paralelo simples e eficiente são apresentadas gradativamente, junto de uma explanação sobre como criar programas paralelos básicos.
O MPI é uma das interfaces de programação paralela mais utilizadas na computação científica, podendo ser empregada desde os equipamentos mais simples, com apenas algumas dezenas de processadores, até os clusters de alto desempenho, com dezenas de milhares de processadores. O OpenMP e o OpenACC, por suas vezes, são padrões para programação de sistemas multiprocessadores com memória compartilhada e aceleradores como GPUs e processadores manycores, caracterizados pela sua extrema facilidade de uso e relativo baixo custo.
Este livro está organizado da seguinte maneira: primeiramente são apresentados conceitos gerais de programação paralela, os diversos paradigmas de programação e formas de desenvolvimento de um programa paralelo, com considerações sobre balanceamento de carga e as métricas de avaliação de desempenho, comuns a qualquer tipo de programa paralelo.
No capítulo seguinte as funções básicas para o envio e recepção de mensagens do MPI são introduzidas. Logo após, as funções de comunicação coletiva, de grande importância para o trabalho cooperativo entre processos, são descritas. Em seguida, são apresentados detalhes sobre os diversos modos disponíveis no MPI para o envio e recepção de mensagens. No capítulo sobre o OpenMP, as diversas diretivas e suas respectivas cláusulas que são utilizadas para explorar o paralelismo embutido nos laços computacionais são apresentadas, junto das primitivas de sincronização disponíveis na linguagem, essenciais no paradigma de memória compartilhada.
No último capítulo, as diretivas e cláusulas do OpenACC são discutidos. O OpenACC é compatível com os modelos de programação OpenMP e MPI, ambas as abordagens podem ser combinadas com o OpenACC. O OpenACC é um modelo de programação aberta para computação paralela desenvolvido com o objetivo de simplificar a programação paralela, oferecendo alto desempenho e portabilidade entre diversos tipos de arquiteturas: multicore, manycore e GPUs.
O livro inclui também apêndices com detalhes dos ambientes de execução do MPI, OpenMP e OpenACC. São discutidas as diferenças entre os diversos pacotes e compiladores disponíveis, além das opções de compilação e outros detalhes para extrair o máximo desempenho das aplicações.
Ao longo deste livro são apresentados exemplos simples e objetivos para o uso de cada uma das funções, diretivas e cláusulas dos diversos paradigmas, bibliotecas e interfaces de programação abordados. Todos os exemplos foram cuidadosamente elaborados, compilados e testados em ambientes paralelos, de modo que possam ser baixados, compilados e reproduzidos facilmente em qualquer equipamento onde um mínimo de paralelismo esteja disponível. Estudos de caso e exercícios propostos podem ser encontrados ao final de cada capítulo, como forma de fixação e complemento dos conceitos elencados na parte teórica.
Esperamos que este livro possa ser um guia seguro para os passos iniciais das pessoas interessadas no uso da programação paralela de uma forma eficiente e produtiva.
Os códigos do livro podem ser encontrados em github.com/Programacao-Paralela-e-Distribuida
Gabriel P. Silva,
Calebe P. Bianchini,
Evaldo B. Costa
Sumário
- 1 Introdução
- 1.1 Exemplos de aplicações paralelas
- 1.2 MPI
- 1.3 OpenMP
- 1.4 OpenACC
- 2 Conceitos básicos
- 2.1 Processos e Threads
- 2.2 Programação paralela
- 2.3 Balanceamento de carga
- 2.4 Avaliação de desempenho
- 2.5 Arquiteturas paralelas
- 2.6 Exercícios propostos
- 3 Comunicação ponto a ponto no MPI
- 3.1 Introdução
- 3.2 Comunicadores
- 3.3 Exemplo de um programa em MPI
- 3.4 Funções de gerenciamento do ambiente
- 3.5 Envio e recepção de mensagens
- 3.6 Identificando as mensagens recebidas
- 3.7 Algumas recomendações
- 3.8 Estudo de caso: método do trapézio
- 3.9 Exercícios propostos
- 4 Comunicação coletiva no MPI
- 4.1 Barreira
- 4.2 Difusão
- 4.3 Distribuição
- 4.4 Coleta
- 4.5 Redução
- 4.6 Redução com difusão
- 4.7 Coleta com difusão
- 4.8 Transposição
- 4.9 Algumas observações
- 4.10 Estudo de caso: multiplicação de matriz por vetor
- 4.11 Exercícios propostos
- 5 Comunicação MPI em detalhes
- 5.1 Introdução
- 5.2 Rotinas de envio e recepção bloqueantes
- 5.3 Rotinas de envio e recepção não bloqueantes
- 5.4 Esperando a mensagem
- 5.5 Modos de comunicação
- 5.6 Evitando o impasse ou deadlock
- 5.7 Considerações de desempenho
- 5.8 Estudo de caso: números primos
- 5.9 Exercícios propostos
- 6 OpenMP
- 6.1 Introdução
- 6.2 Diretivas principais
- 6.3 Funções OPENMP
- 6.4 Cláusulas
- 6.5 Sincronização
- 6.6 Variáveis de ambiente
- 6.7 Erros comuns e recomendações
- 6.8 Estudos de caso
- 6.9 Exercícios
- 7 OpenACC
- 7.1 Modelo de programação OpenACC
- 7.2 Diretivas principais
- 7.3 Movimentação de dados
- 7.4 Cláusulas das diretivas parallel
- 7.5 Cláusulas da diretiva loop
- 7.6 Diretivas avançadas
- 7.7 Funções OpenACC
- 7.8 Variáveis de ambiente
- 7.9 Erros comuns e recomendações
- 7.10 Estudos de caso
- 7.11 Exercícios
- 8 Ambientes de execução
- 8.1 Preparação do ambiente de execução MPI
- 8.2 Preparação do Ambiente de Execução OpenMP
- 8.3 Preparação do ambiente de execução OpenACC
- Referências
Dados do produto
- Número de páginas:
- 364
- ISBN:
- 978-85-5519-303-3
- Data publicação:
- 05/2022