Você está na página 1de 27

Tutorial MPI -

Message Passaging
Interface

http://www.mcs.anl.gov/research/projects/mpi/tutorial/gropp/talk.html
Visão Geral

 Especificação de biblioteca de
passagem de mensagem
 Funcionalidade para dar suporte
 bibliotecas
 ferramentas
 aplicações
Message Passing
Interface - MPI
 Comunicação Ponto-a-Ponto
 Comunicação Coletiva
 Datatypes definidos pelo usuário
 Topologias virtuais
 Inter-communicators
 Suporte para descrição (Profiling)
Programa Inicial
#include <stdio.h>
#include <mpi.h>

main (int argc, char **argv )


{
MPI_Init ( &argc, &argv );
printf ( “Hello World! \n” );
MPI_Finalize ( );
}
Iniciando - MPI

 Deve ser a primeira função incluída


 Inicia ambiente MPI
 Sintaxe

int MPI_Init (int *argc, char ***argv)


Finalizando - MPI

 Deve ser a última função incluída


 Finaliza ambiente MPI
 Sintaxe

int MPI_Finalize ( )
Informações - MPI
 Todos os nomes tem o prefixo MPI_
 Constantes definidas com letras maiúsculas
 Tipos e funções tem primeira letra maiúscula
depois do prefixo e as restantes minúsculas
 Quantidade de processos
MPI_Comm_size (MPI_COMM_WORLD, &numtasks);
 Identificação de processos
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
Exemplo 1
#include "mpi.h"
#include <stdio.h>
int main(int argc,char *argv[])
{
int numtasks, rank, rc;
rc = MPI_Init(&argc,&argv);
if (rc != MPI_SUCCESS) {
printf ("Error starting MPI program. Terminating. \n");
MPI_Abort(MPI_COMM_WORLD, rc);
}
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
printf ("Number of tasks= %d My rank= %d\n", numtasks,rank);
/******* do some work *******/
MPI_Finalize();
}
Comunicadores

 Define a comunicação
 Comunicadores pré-definidos
 MPI_COMM_WORLD
 grupos e informação de contexto
 Processos podem pertencer a
diferentes comunicadores
Ambiente de Execução
MPI
Clique para adicionar texto
Utilização do Cluster
 Login
 Convidado

 Compilação
 mpicc.mpich –o exec fonte.c

 Execução
 mpirun.mpich –n 2 –hostfile hostfile ./exec
Criação de Arquivos

 Diretório com os arquivos executáveis


 Arquivo hostfile
 endereço da máquina
Compilação - MAKEFILE
 Exemplo
CC = /path_do_mpi/mpicc
CFLAGS = -g -O3
LIB_MPI = /path_do_mpi/mpicc
INCLUDE_MPI =/path_do_mpi/mpicc
OBJS = prog1.o prog2.o prog3.o
SRCS = prog1.c prog2.c prog3.c
TARGET = prog

$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)

clean: rm -f $(OBJS)
make –f make_seq
make –f make_par
Execução

 Exemplo

mpirun.mpich –n 4 –hostfile hostfile ./exec args


Comunicação ponto-a-ponto

 Envio de mensagens
Proc 0 Proc 1
A

send receive
B
 Questões
 Para qual processo enviar o dado?
 Onde está o dado?
 Qual tipo de dado enviar?
 Quantos dados enviar?
 Como o receptor identifica o dado?
Organização da Mensagem

 Dividida em data e envelope


 Data
 buffer
 datatype
 count
 Envelope
 process identifier (source/destination rank)
 message tag
 communicator
MPI C - Datatypes
Tipo de Dados MPI Tipo de Dados C
MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long mint
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED_LONG unsigned long int
MPI_UNSIGNED unsigned int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_BYTE
MPI_PACKET
MPI C – Process Identifier
 Comunicador MPI consiste de um grupo de
processos
 Inicialmente todos os processos pertencem ao
grupo
 Rotinas de gerenciamento de processos (criar,
modificar, apagar)
 Comunicação acontece entre todos os membros
de um grupo
 Nomeando um processo
 destination – rank ou grupo
 Grupos são especificados pelo comunicador
 MPI_ANY_SOURCE usado para receber de qualquer
processo
MPI C – Message Tag

 Permite ligar com a chegada das


mensagens de forma ordenada
 São agrupadas no intervalo de 0 a 32767
 Limite superior é dado pelo atributo
MPI_TAG_UB
 MPI_ANY_TAG usado para receber em
qualquer ordem
MPI C – Send/Receive
 Send – blocking
MPI_Send (start, count, datatype, dest, tag, comm)
 Sintaxe
int MPI_Send (void *buf, int count, MPI_Datatype
type, int dest, int tag, MPI_Comm comm )
 Receive - blocking
MPI_Recv (start, count, datatype, source, tag, comm, status)
 Sintaxe
int MPI_Recv (void *buf, int count, MPI_Datatype
datatype, int source, int tag, MPI_Comm comm,
MPI_Status *status )
Informação de Mensagens
 Através das seguintes funções
MPI_Status status;
MPI_Recv (. . ., &status )
Tag da mensagem = status.MPI_TAG;
Fonte da mensagem = status.MPI_SOURCE;
MPI_Get_count ( &status, datatype, &count);
 MPI_TAG e MPI_SOURCE usados quando
MPI_ANY_TAG e MPI_ANY_SOURCE são
passados na recepção de mensagens
 MPI_Get_count determina quantos dados de um
tipo particular foi recebido
Exemplo 2
#include "mpi.h“
#include <stdio.h>

int main(int argc,char *argv[])


{
int numtasks, rank, dest, source, rc, count, tag=1;
char inmsg, outmsg='x';
MPI_Status Stat;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
Exemplo 2 - continuação

if (rank == 0) {
dest = 1;
source = 1;
rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag,
MPI_COMM_WORLD);
rc = MPI_Recv(&inmsg, 1, MPI_CHAR, source, tag,
MPI_COMM_WORLD, &Stat);
}
Exemplo 2 - continuação
else {
if (rank == 1) {
dest = 0;
source = 0;
rc = MPI_Recv(&inmsg, 1, MPI_CHAR, source,
tag, MPI_COMM_WORLD, &Stat);
rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest,
tag, MPI_COMM_WORLD);
}
}
Exemplo 2 - continuação
rc = MPI_Get_count(&Stat, MPI_CHAR, &count);
printf("Task %d: Received %d char(s) from task %d
with tag %d \n", rank, count, Stat.MPI_SOURCE,
Stat.MPI_TAG);
MPI_Finalize();
}
Comunicação Coletiva
 Envolve várias tarefas da aplicação
 Envia dados de um processo para todas as tarefas
indicadas pelo comunicador
MPI_Bcast (start, count, datatype, proc, comm)
 Sintaxe
int MPI_Bcast (void *buf, type count, MPI_Datatype type, int proc,
MPI_Comm comm)
 Combina dados de todos os processos do comunicador
(usando operation) e retorna resultado num processador
MPI_Reduce (start, result, count, datatype, operation, proc, comm)
 Sintaxe
int MPI_Reduce (void *buf, type count, MPI_Datatype
datatype, operation, int proc, MPI_Comm comm)
Operações em
Comunicação Coletiva
Nome MPI Operação
MPI_MAX Máximo
MPI_MIN Mínimo
MPI_PROD Produto
MPI_SUM Soma
MPI_LAND AND lógico
MPI_LOR OR lógico
MPI_LXOR XOR lógico
MPI_BAND Bitwise AND
MPI_BOR Bitwise OR
MPI_BXOR Bitwise XOR
MPI_MAXLOC Máximo e localização
MPI_MINLOC Mínimo e localização

Você também pode gostar