1
Núcleo de Computação Científica Tópicos Avançados em Computação II
Message Passing Interface - MPI
Pedro de Botelho Marcos Maio/2008
2
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Sumário
Introdução; Conceitos básicos; Comunicação; Principais rotinas; Compilando e executando códigos MPI; Exemplos;
3
Núcleo de Computação Científica Tópicos Avançados em Computação II
Introdução
MPI = Message Passing Interface;
É uma biblioteca que define rotinas para
comunicação entre processos paralelos;
É portável para qualquer arquitetura;
É compatível com as linguagens C/C++ e
Fortran;
O paralelismo é explicito, ou seja, o
4
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Estrutura do código com MPI
#include<stdio.h> #include ”mpi.h”
int main(int argc, char *argv[ ]) {
MPI_Init(&argc, &argv); // Inicializa MPI .
.
Código usando rotinas do MPI . .
.
MPI_Finalize(); //Encerra MPI return 0;
5
Núcleo de Computação Científica Tópicos Avançados em Computação II
Conceitos Básicos
Mensagem: É o conteúdo de uma comunicação.
É formado por duas partes:
Endereço: Destino e origem da mensagem; Dados: A informação a ser transmitida;
Rank: É o identificador único do processo. Varia
6
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Conceitos Básicos
Grupo: É um conjunto de processos que
podem se comunicar. Sempre está associado a um comunicador;
Comunicador: É um objeto local que representa
7
Núcleo de Computação Científica Tópicos Avançados em Computação II
Conceitos Básicos
Application Buffer: É o endereço de memória
que armazena um dado que o processo necessita receber ou enviar.
System Buffer: É o endereço de memória
reservado pelo sistema para armazenar mensagens.
8
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Conceitos Básicos
Overhead: É um desperdício de tempo que
ocorre durante a execução do processo. Existem dois tipos de overhead:
System Overhead: Tempo gasto pelo sistema na transferência de dados para o processso
destino.
Synchronization Overhead: Tempo gasto para a sincronização dos processos.
9
Núcleo de Computação Científica Tópicos Avançados em Computação II
10
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Técnicas de Comunicação entre
Processos
Buffering; Blocking; Non-Blocking; Assíncrona; Síncrona;11
Núcleo de Computação Científica Tópicos Avançados em Computação II
Buffering
É a cópia temporária de mensagens entre
endereços de memória efetuada pelo sistema como parte de seu protocolo de comunicação. A cópia ocorre entre o buffer do usuário (application buffer) definido pelo processo e o buffer do sistema (system buffer) definido pela biblioteca.
Exemplo: Processo já começou o envio, porém,
12
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Blocking
A finalização da execução da rotina é
dependente de determinados eventos. O
processo só prosseguirá quando tiver certeza de que o application buffer pode ser usado
novamente.
Exemplo: Quando se deseja obter confirmação
do recebimento de dados para continuar o processamento.
13
Núcleo de Computação Científica Tópicos Avançados em Computação II
Non-Blocking
A finalização da rotina não é dependente de
outros eventos.
Exemplo: Quando não existem dependências
ou necessidade de controle intensivo sobre o programa.
14
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Assíncrona
O processo que envia a mensagem não espera
uma confirmação de recebimento para prosseguir.
15
Núcleo de Computação Científica Tópicos Avançados em Computação II
Síncrona
O processo que enviou uma mensagem
aguarda uma confirmação de recebimento para prosseguir a sua execução.
Exemplo: Utilizada quando se torna necessária
a confirmação de recebimento. Por exemplo, se a rede for instável.
16
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Tipos de Comunicação
Ponto a ponto: Executa a transferência de
dados entre dois processos;
Coletiva: Envolve comunicação entre dois ou
17
Núcleo de Computação Científica Tópicos Avançados em Computação II
Ponto a Ponto
Síncrona (Synchronus); Imediata (Ready);
18
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Síncrona
O processo não retorna sua execução
enquanto não houver uma confirmação de recebimento da mensagem
19
Núcleo de Computação Científica Tópicos Avançados em Computação II
Imediata
Sabe-se, a priori, que o recebimento de uma
mensagem já foi realizado pelo processo destino.
20
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Bufferizada
A operação de envio utiliza uma quantidade
específica para buffer alocada pelo usuário.
Exemplo: Se o tamanho da mensagem
21
Núcleo de Computação Científica Tópicos Avançados em Computação II
Coletiva
Difusão (Broadcast); Redução (Reduction); Coleta (Gather);
22
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Difusão
Um único processo envia os mesmos dados
para todos os processos com o mesmo comunicador.
23
Núcleo de Computação Científica Tópicos Avançados em Computação II
Redução
Um processo coleta dados nos demais
processos e aplica uma determinada operação sobre estes dados. O resultado será
armazenada em um processo definido pelo usuário.
24
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Coleta
A estrutura dos dados distribuída é coletada
25
Núcleo de Computação Científica Tópicos Avançados em Computação II
Espalhamento
A estrutura dos dados que está armazenada
em um único processo é distribuída para todos os processos do comunicador.
26
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Principais Rotinas
Rotinas de Inicialização/Encerramento; Rotinas de Grupo;
27
Núcleo de Computação Científica Tópicos Avançados em Computação II
Inicialização e Encerramento
MPI_Init – Inicializa o ambiente MPI;
28
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
MPI_Init
● Sintaxe: Em C: int MPI_Init (int *argc, char *argv[]) Em Fortran: call MPI_INIT (mpierr) ● Parâmetros: argc Apontador para a quantidade de parametros da linha de comando; argv Apontador para um vetor de strings com os comandos recebidos;29
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI_Finalize
● Sintaxe:
Em C: int MPI_Finalize (void) Em Fortran: call MPI_FINALIZE (mpierr)
30
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Informações sobre o
comunicador
MPI_Comm_rank – Identifica um processo MPI
dentro de um determinado grupo;
MPI_Comm_size – Retorna o número de
31
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI_Comm_rank
● Sintaxe: Em C: int MPI_Comm_rank (MPI_Comm comm, int *rank) Em Fortran: call MPI_COMM_RANK (comm, rank, mpierr) ● Parâmetros: comm Comunicador do MPI; rank Variável inteira com o numero de identificação do processo.32
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
MPI_Comm_size
● Sintaxe: Sintaxe
Em C: int MPI_Comm_size (MPI_Comm comm, int *size)
Em Fortran: call MPI_COMM_SIZE (comm, size, mpierr)
● Parâmetros:
comm Comunicador do MPI; size Variável interna que retorna o número de
33
Núcleo de Computação Científica Tópicos Avançados em Computação II
Troca de Mensagens
MPI_Send – Rotina básica para envio de
mensagens;
MPI_Recv – Rotina básica para recebimento
34
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
MPI_Send
● Sintaxe:
Em C: int MPI_Send (void *sndbuf, int count, MPI_Datatype dtype,
int dest, int tag, MPI_Comm comm)
Em Fortran: call MPI_SEND (sndbuf, count, dtype, dest, tag, comm, mpierr) ● Parâmetros: sndbuf Identificação do buffer; count Número de elementos a serem enviados; dtype Tipo de dado dest Identificação do processo destino; tag Rótulo (label) da mensagem; comm MPI Communicator
35
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI_Recv
● Sintaxe:
Em C: int MPI_Recv (void *recvbuf, int count, MPI_Datatype dtype, int
source, int tag, MPI_Comm comm, MPI_Status status) Em Fortran: call MPI_RECV (recvbuf, count, dtype, source, tag, comm, status, mpierr)
● Parâmetros:
recvbuf Identificação do buffer (endereço inicial do "application buffer" de onde os dados estão sendo enviados); count Número de elementos a serem recebidos; dtype Tipo de dado source Identificação do processo emissor; tag Rótulo (label) da mensagem; comm MPI Communicator status Vetor de informações envolvendo os parâmetros source e tag.
36
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Compilando
Em C/C++
mpicc [fonte.c] -o [executável] [parâmetros]
Em Fortran
37
Núcleo de Computação Científica Tópicos Avançados em Computação II
Executando
Em C/C++/Fortran
mpirun [argumentos] [executável]
Exemplos de argumentos:
-np – Número de processadores;
-nolocal – Não executa na máquina local; -h – Mostra todas opções disponíveis;
-machinefile – Especifica arquivo com nomes das máquinas;
38
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Exemplo – Cada processo
escreve um Hello!
#include "mpi.h“ #include <stdio.h>
Int main( int argc, char * argv[ ] ) {
int processId; /* rank dos processos */
int noProcesses; /* Número de processos */ int nameSize; /* Tamanho do nome */ char computerName[50];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &noProcesses); MPI_Comm_rank(MPI_COMM_WORLD, &processId); MPI_Get_processor_name(computerName, &nameSize); fprintf(stderr,"Hello from process %d on %s\n", processId, computerName);
MPI_Finalize( ); return 0;
39
Núcleo de Computação Científica Tópicos Avançados em Computação II
Exemplo – Master envia
mensagem para demais processos
#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "mpi.h"
main(int argc, char *argv[]) { char message[20];
int i, rank, size, type = 99; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) {
strcpy(message, "Hello, world"); for (i = 1; i < size; i++)
MPI_Send(message, 13, MPI_CHAR, i, type, MPI_COMM_WORLD); }
else
MPI_Recv(message, 20, MPI_CHAR, 0, type, MPI_COMM_WORLD, &status); printf( "Message from process = %d : %.13s\n", rank,message);
MPI_Finalize(); }
40
Núcleo de Computação Científica Tópicos Avançados em Computação II
MPI
Referências
http://www.llnl.gov/computing/tutorials/mpi/ http://www.dartmouth.edu/