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

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top