Escolar Documentos
Profissional Documentos
Cultura Documentos
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>
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
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
clean: rm -f $(OBJS)
make –f make_seq
make –f make_par
Execução
Exemplo
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
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