I have a problem with my MPI C program. This is the code:
void wantEat(int p, int rank, char *state, char* stateLeft, char* stateRight){ char *s; MPI_Status status ; if(compare(stateLeft, "eat") || compare (stateRight, "eat")){ state = "want_Eat"; printf("%s : I wait for eating\n", nomPhilosophe(rank)); MPI_Send(state, strlen(state)+1, MPI_CHAR, (rank - 1 + p) % p, 0, MPI_COMM_WORLD); MPI_Send(state, strlen(state)+1, MPI_CHAR, (rank + 1) % p, 0, MPI_COMM_WORLD); if(compare(stateLeft,"eat") && !compare(stateRight,"eat")){ MPI_Recv(stateLeft, 6, MPI_CHAR, (rank - 1 + p) % p, 0, MPI_COMM_WORLD, &status); state = "eat"; } if(compare(stateRight,"eat") && !compare(stateLeft,"eat")){ MPI_Recv(stateRight, 6, MPI_CHAR, (rank + 1) % p, 0, MPI_COMM_WORLD, &status); state = "eat"; } if(compare(stateRight,"eat") && compare(stateLeft,"eat")){ MPI_Recv(stateLeft, strlen("think")+1, MPI_CHAR, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status); MPI_Recv(stateRight, strlen("think")+1, MPI_CHAR, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status); state = "eat"; } } else{ state= "eat"; } MPI_Send(state, strlen(state)+1, MPI_CHAR, (rank - 1 + p) % p, 0, MPI_COMM_WORLD); MPI_Send(state, strlen(state)+1, MPI_CHAR, (rank + 1) % p, 0, MPI_COMM_WORLD); } int main(int argc, char* argv[]){ int my_rank; int p; char* state = "think"; char* stateLeft = "think"; char* etatD = "think"; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); think(my_rank); wantEat(p, my_rank, state, stateLeft, stateRight); eat(my_rank); MPI_Finalize(); return 0; }
The problem is that all processes feed at the same time, without waiting for neighbors. I think that the MPI messages of new states are not accepted by neighbors. Do you have an idea to fix this problem?