MPI - Message Passing Interface

Autora: Tamara Hayashi Santos

O que é?

É um conjunto de macros e bibliotecas que foi desenvolvido para ser o padrão em ambientes de memória distribuída.

Como surgiu?

Surgiu da necessidade de se resolver alguns problemas relacionados às plataformas de portabilidade, como restrições em relação à real portabilidade de programas, devido ao grande número de plataformas, e o mau aproveitamento de características de algumas arquiteturas paralelas.

Características: 

  • Oferece baixa transparência.
  • Não oferece tolerância a falhas.
  • Tem alta performance.

Motivos que explicam a necessidade de um padrão para esse tipo de sistema: 

  • Portabilidade e facilidade de uso.
  • Fornecer uma especificação precisa.
  • Crescimento da indústria de software paralelo.

Padronização do MPI

O processo de padronização foi iniciado em abril de 1992, sendo apresentada a primeira versão (MPI 1) em novembro do mesmo ano.

Envolveu cerca de 80 pessoas provenientes de 40 organizações, principalmente americanas e européias.  

A maioria dos fabricantes de computadores paralela participou do desenvolvimento do MPI, além de universidades e laboratórios ligados ao governo americano. 

Principais objetivos que guiaram o processo de padronização 

  • Lançar uma versão inicial em um tempo predefinido, de maneira que não se perdesse o controle do padrão;
  • prover portabilidade real;
  • prover implementação eficiente em plataformas paralelas distintas;
  • possuir uma aparência compatível com a atualidade, visando mais fácil aceitação;
  • em novembro de 1993, foi apresentada a especificação do MPI 1;
  • em maio de 1994, foi publicada a especificação;
  • em junho de 1995, foi publicada a versão 1.1, apresentando correções de erros e melhor esclarecimento de determinadas propriedades do MPI;
  • em 1997, foi publicado o MPI 2.

INOVAÇÕES DO MPI 2

  • Gerenciamento de processos dinâmicos: adicionar processos a uma computação MPI que esteja rodando e permitir que computações MPI paralelas conectem/desconectem.
  • Acesso remoto à memória.
  • Ligação para C++ e Fortran.
  • Misc: interação com threads, interoperabilidade entre linguagens.

Processos X MPI

MPI fornece uma relação que permite a comunicação entre os processos de um programa paralelo com um outro processo, porém não especifica como os processos são criados, nem como ele estabelece uma comunicação. Além disso, uma aplicação MPI é estática, isto é, nenhum processo pode ser adicionado ou suprimido de uma aplicação depois de começada. As razões para adicionar um processo ao MPI são técnicas e práticas. As classes importantes de mensagens que passam pelas aplicações requerem um controle do processo. Estes incluem tarefas, aplicações de série com módulos paralelos e problemas que requerem uma avaliação run-time do número e do tipo de processos que devem ser começados.

Um programa de MPI consiste em processos autônomos, executando seu próprio código, em um estilo MIMD. Os códigos executados por cada processo não necessitam ser idênticos. Tipicamente, cada um é executado em seu próprio espaço de endereço, embora sejam possíveis as execuções que compartilham memória de MPI. A menos que indicado de outra maneira na especificação do padrão, MPI não coloca nenhuma exigência no resultado de sua interação com mecanismos externos que fornecem a funcionalidade similar ou equivalente.

Composição do MPI

O MPI define um conjunto de 129 rotinas, que oferecem os seguintes serviços: 

  • Comunicação ponto-a-ponto.
  • Comunicação coletiva.
  • Suporte para grupo de processos.
  • Suporte para contextos de comunicação.
  • Suporte para topologia de processos.

COMUNICAÇÃO PONTO-A-PONTO

A necessidade de garantir eficiência e generalidade levou o Fórum MPI a definir um padrão relativamente extenso, de maneira que determinadas funções do MPI possuem muitas variações. Dentro deste contexto inserem-se as operações de comunicação ponto-a-ponto, que são caracterizadas por quatro aspectos básicos:

  • Quanto ao bloqueio: pode ser bloqueante ou não bloqueante.
  • Quanto ao modo de comunicação: pode ser Padrão, Síncrono, Bufferizado e Ready.
  • Quanto à persistência: as rotinas podem ser ativadas por requisições persistentes ou não persistentes.
  • Quanto ao sentido da comunicação: As rotinas de comunicação podem ser em dois sentidos ou isoladas.

 COMUNICAÇÃO BLOQUEANTE E NÃO BLOQUEANTE

  • Rotinas bloqueantes garantem que o processo transmissor ou receptor ficará bloqueado até que a transmissão da mensagem seja completada. Caso contrário, tem-se uma rotina não bloqueante.

Comunicação ponto-a-ponto (a) bloqueante e (b) não bloqueante

MODOS DE COMUNICAÇÃO 

  • Modo Síncrono: O receptor deve enviar uma confirmação de recebimento da mensagem, de maneira que o transmissor possa ter certeza de que a mensagem foi recebida.
  • Modo Bufferizado: A transmissão de uma mensagem utilizando buffers permite que esta se complete rapidamente, visto que, após ser copiada para o buffer, fica a cargo do sistema transmitir a mensagem quando possível.
  • Modo Ready: É terminada rapidamente, sem a utilização de buffers ou de confirmações do processo receptor, objetivando conseguir melhor desempenho em determinados ambientes computacionais (principalmente arquiteturas paralelas).
  • Modo Padrão: Neste modo padrão, o término de uma operação de comunicação pode ou não significar que o receptor já foi ativado.

COMUNICAÇÃO EM DOIS SENTIDOS

Rotinas de comunicação em dois sentidos são bloqueantes, combinam-se com quaisquer outras rotinas de transmissão ou recepção do MPI e apresentam duas variantes, que são: 

MPI_Sendrecv e MPI_Sendrecv_replace

As duas rotinas diferenciam-se pela utilização de variáveis de transmissão (onde a mensagem se origina) e recepção (onde a mensagem será copiada) coincidentes ou não.

MPI_Sendrecv_replace

Utiliza as mesmas posições de memória para transmitir e receber a mensagem, ao contrário do MPI_Sendrecv.

As tabelas 1 e 2 mostram um resumo de todas as rotinas para comunicação ponto-a-ponto do MPI.

COMUNICAÇÃO COLETIVA 

Uma função é denominada coletiva se todos os processos em um grupo necessitam executá-la para que ela tenha efeito.

As funções coletivas especificadas pelo padrão MPI são divididas em três grupos:

  • Função barrier.
  • Funções para comunicação global de dados.
  • Funções globais de redução.

A função barrier e as funções para comunicação global de dados são descritas na tabela abaixo.

 

Funções barrier e para comunicação coletiva do MPI

Embora as comunicações coletivas tenham sido projetadas para serem consistentes com as comunicações ponto-a-ponto, existem algumas simplificações/restrições destacadas pelo padrão: 

  • a quantidade de dados enviados pela primitiva send deve ser exatamente a mesma determinada pela primitiva receive;
  • comunicações coletivas apresentam apenas versões bloqueantes;
  • ausência do parâmetro tag, impondo a "ordem de execução" como único critério para a realização (casamento) de chamadas coletivas;
  • especificação de apenas um modo para comunicação, análogo ao modo padrão das comunicações ponto-a-ponto.

Requisições Persistentes

Uma requisição persistente de comunicação tem o objetivo de evitar a sobrecarga gerada pelas consecutivas chamadas a uma mesma rotina.

Todos os tipos de procedimentos iniciais relacionados a uma operação de comunicação, que não dependem do conteúdo de uma mensagem, são então executados apenas quando a requisição persistente é criada. 

Programas MPI

Arquivo diretivo ‘mpif.h’

Um programa típico de MPI tem a seguinte forma: 

include 'mpif.h'

call MPI_Init(ierr)

call MPI_Finialize(ierr)

end program

Referências 

1. COULOURIS, G. et al. Distributed systems: concepts and design. Reading: Addison-Wesley, 1994. Cap. 4 e 5.

2. FORTUNA, A. O. ICMC-USP: introdução ao MPI. Disponível em: <http://www.lcad.icmc.sc.usp.br/~fortuna/aulas/SCE217/mpi/mpi.ppt>. Acesso em: Nov./2001.

3. MAITAINER, N. MPI Home Page at Argonne. Disponível em: <http://www.netlib.org/mpi>. Acesso em: Nov./2001.

4. TANENBAUM, A. S. Distributed operating systems. Upper Saddle River: Prentice-Hall, 1995. p. 68-114.