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!