Pergunta
Quero usar o MPI (MPICH2) no Windows. Eu escrevo este comando:
MPI_Barrier(MPI_COMM_WORLD);
E espero que ele bloqueie todos os processadores até que todos os membros do grupo tenham chamado. Mas isso não acontece. Eu adiciono um esquema do meu código:
int a;
if(myrank == RootProc)
a = 4;
MPI_Barrier(MPI_COMM_WORLD);
cout << "My Rank = " << myrank << "\ta = " << a << endl;
(Com 2 processador :) Processador raiz (0
) age corretamente, mas o processador com a classificação 1 não sabe o a
variável, então exibe -858993460
ao invés de 4
.
Alguém pode me ajudar?
Cumprimentos
Solução
Você está apenas atribuindo a
no processo 0. O MPI não compartilha memória, portanto, se você deseja o a
No processo 1 para obter o valor de 4, você precisa ligar MPI_Send
do processo 0 e MPI_Recv
do processo 1.
Outras dicas
Variável a
não é inicializado - é possível e é por isso que exibe esse número. Em MPI, variável a
é duplicado entre os processos - então existem dois valores para a
, um dos quais não é inicializado. Você quer escrever:
int a = 4;
if (myrank == RootProc)
...
Ou, alternativamente, faça um MPI_send
na raiz (id 0) e um MPI_recv
No escravo (ID 1), o valor na raiz também é definido no escravo.
Nota: Esse código aciona um pequeno alarme na minha cabeça, então preciso verificar algo e editarei isso com mais informações. Até então, porém, o valor não inicializado é certamente um problema para você.Ok, verifiquei os fatos - seu código não estava corretamente recuado e perdi o faltando {}
. A barreira parece boa agora, embora o trecho que você postou não faça muito e não é um exemplo muito bom de barreira porque o escravo entra diretamente, enquanto a raiz definirá o valor da variável para 4
e depois digite. Para testar que ele realmente funciona, você provavelmente deseja algum tipo de mecanismo de sono em um dos processos - que produzirão (espero que seja o termo correto) o outro processo também, impedindo -o de imprimir o cout
Até o sono acabar.
Bloquear não é suficiente, você deve enviar dados para outros processos (Memória em não compartilhado entre processos).
Para compartilhar dados em todos os processos usar:
int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )
Então, no seu caso:
MPI_Bcast(&a, 1, MPI_INT, 0, MPI_COMM_WORLD);
Aqui você envia um número inteiro apontado pelo processo de formulário 0 para todos os outros. //Mpi_bcast é remetente para processo raiz e receptor Para processos não-maiúsculos
Você também pode enviar alguns dados para o processo especyfic por:
int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest,
int tag, MPI_Comm comm )
e depois receba por:
int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)