Olá pessoal, sou o Filipe Névola, este blog foi muito ativo durante 2009 enquanto eu fazia universidade,
hoje em dia estou ativo no Twitter @FilipeNevola e voltando a escrever posts agora no meu perfil do Medium (29/05/2016).

[ 25/05/2009 ] 0

Usando MPI_Bcast (Envia mensagem para todos processos)

MPI_Bcast é o comando em MPI para enviar uma determinada variável para todos os processo apartir de um processo.
Enquanto cada recebedor não tem o valor recebido continua esperando nessa instrução de broadcast.

Quais são os parâmetros que devem ser passados ?

Cabeçalho:
int MPI_Bcast ( void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )

Parâmetros:
buffer: início do endereço do dado a ser passado
count: número de elementos passados (tamanho do vetor ou 1 quando não se tem um vetor)
datatype: tipo de dados (MPI_INT, MPI_CHAR ...)
root: número inteiro do processo que irá ser o enviador (a raiz)
comm: grupo de comunicação

Vamos ao código:
//Autor: Filipe Areias Névola
//Ano: 2009
//Programa: MPI usando Bcast
//Licensa: Você pode usar e alterar, mas deve manter o Autor
#include <mpi.h> //Biblioteca do mpi
#include <stdio.h> //Biblioteca padrão de entrada e saída
#include <string.h> //Biblioteca para manipulação de char*

//defines usados para facilitar a escrita do código
#define GROUP MPI_COMM_WORLD //define para representar o GRUPO de comunicação
#define Init(x,y) MPI_Init(x,y)
#define Finalize() MPI_Finalize()
#define Size(x) MPI_Comm_size(GROUP,x)
#define Rank(x) MPI_Comm_rank(GROUP,x)
#define Send(x, tam, tipo, destino, flag) MPI_Send(x, tam, tipo, destino, flag, GROUP)
#define Recv(onde, tam, tipo, origem, flag) MPI_Recv(onde, tam, tipo, origem, flag, GROUP, &status)

//Broadcast envia uma informação para todos e todos recebem essa informação na variável enviada
//este define serve apenas para char* pois já pega o tamanho da mensagem
#define Bcast(m, tipo, emissor) MPI_Bcast(&m, strlen(m)+1, tipo, emissor, GROUP)
#define BcastComum(m, tamanho, tipo, emissor) MPI_Bcast(&m, tamanho, tipo, emissor, GROUP)

//Parte principal do programa
int main(int argc, char *argv[]){
//mensagem a ser enviada e recebida
char msg[20];
//número do proc e quantidade de proc
int rank,size;

//inicializa o paralelismo
Init(&argc,&argv);

//pega o número de proc
Size(&size);

//pega o número do proc atual
Rank(&rank);

//o proc 0 copia "BOM DIA" para sua msg
if(rank==0)
strcpy(msg,"BOM DIA");

//o proc 0 envia a mensagem para todos
//e todos menos o proc 0 recebe a mensagem
Bcast(msg,MPI_CHAR,0);

//se não é o proc 0 então imprime o que recebeu
if(rank!=0)
printf("Processador %d recebeu a mensagem %s\n", rank, msg);

//finaliza o paralelismo
Finalize();

return 0;
}

Alguma dúvida ? Mande por comentário que responderei assim que possível!

Novo Comentário