MPI_SEND pára de funcionar após MPI_BARRIER
Eu estou construindo um servidor web distribuído em C / MPI e parece que a comunicação ponto-a-ponto completamente pára de funcionar após o primeiro MPI_BARRIER no meu código. O código C padrão funciona depois da barreira, por isso sei que cada um dos fios passa pela barreira. A comunicação ponto-a-ponto também funciona bem antes da barreira. No entanto, quando copio e colo o mesmo código que funcionou na linha antes da barreira na linha após a barreira, ela para de funcionar completamente. O envio vai apenas esperar para sempre. Quando eu tento usar um ISEND, ele passa pela linha, mas a mensagem nunca é recebida. Eu estive pesquisando muito sobre esse problema e todo mundo que tem problemas com o MPI_BARRIER é informado de que a barreira funciona corretamente e seu código está errado, mas não posso, na minha vida, descobrir por que meu código está errado. O que poderia estar causando esse comportamento?
Aqui está um exemplo de programa que demonstra isso:
<code>#include <mpi.h> #include <stdio.h> int main(int argc, char *argv[]) { int procID; int val; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &procID); MPI_Barrier(MPI_COMM_WORLD); if (procID == 0) { val = 4; printf("Before send\n"); MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD); printf("after send\n"); } if (procID == 1) { val = 1; printf("before: val = %d\n", val); MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); printf("after: val = %d\n", val); } MPI_Finalize(); return 0; } </code>
Mover os doisif
declarações antes da barreira faz com que este programa seja executado corretamente.
EDITAR - Parece que a primeira comunicação, independentemente do tipo, funciona e todas as comunicações futuras falham. Isso é muito mais geral do que eu pensava no começo. Não importa se a primeira comunicação é uma barreira ou alguma outra mensagem, nenhuma comunicação futura funciona corretamente.