MPI_Wait will do miracles in your example.

  george.

On Nov 16, 2012, at 20:34 , Lim Jiew Meng <jiewm...@gmail.com> wrote:

> What I am trying to acheive in this simplified code is:
> 
> 2 types of processes (root, and children, ids/rank = 10 and 0-9 respectively)
> init:
> root will listen to children "completed"
> children will listen to root notification when all has completed
> while there is no winner (not all done yet):
> children will have 20% chance they will be done (and notify root they are 
> done)
> root will check that all are done
> if all done: send notification to children of "winner"
> I have code like:
> 
> int numprocs, id, arr[10], winner = -1;
> bool stop = false;
> MPI_Request reqs[10], winnerNotification;
> 
> MPI_Init(NULL, NULL);
> MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
> MPI_Comm_rank(MPI_COMM_WORLD, &id);
> 
> for (int half = 0; half < 1; half++) {
>     for (int round = 0; round < 1; round++) {
>         if (id == 10) { // root
>             // keeps track of who has "completed"
>             fill_n(arr, 10, -1);
>             for (int i = 0; i < 10; i++) {
>                 MPI_Irecv(&arr[i], 1, MPI_INT, i, 0, MPI_COMM_WORLD, 
> &reqs[i]);
>             }
>         } else if (id < 10) { // children
>             // listen to root of winner notification/indication to stop
>             MPI_Irecv(&winner, 1, MPI_INT, 10, 1, MPI_COMM_WORLD, 
> &winnerNotification);
>         }
> 
>         while (winner == -1) {
>             //cout << id << " is in loop" << endl;
> 
>             if (id < 10 && !stop && ((rand() % 10) + 1) < 3) { 
>                 // children has 20% chance to stop (finish work)
>                 MPI_Send(&id, 1, MPI_INT, 10, 0, MPI_COMM_WORLD);
>                 cout << id << " sending to root" << endl;
>                 stop = true;
>             } else if (id == 10) {
>                 // root checks number of children completed
>                 int numDone = 0;
>                 for (int i = 0; i < 10; i++) {
>                     if (arr[i] >= 0) {
>                         //cout << "root knows that " << i << " has completed" 
> << endl;
>                         numDone++;
>                     }
>                 }
>                 cout << "numDone = " << numDone << endl;
> 
>                 // if all done, send notification to players to stop
>                 if (numDone == 10) {
>                     winner = 1;
>                     for (int i = 0; i < 10; i++) {
>                         MPI_Send(&winner, 1, MPI_INT, i, 1, MPI_COMM_WORLD);
>                     }
>                     cout << "root sent notification of winner" << endl;
>                 }
>             }
>         }
>     }
> }
> 
> MPI_Finalize();
> Output from debugging couts look like: problem seems to be root is not 
> receiving all childrens notification that they are completed?
> 
> 2 sending to root
> 3 sending to root
> 0 sending to root
> 4 sending to root
> 1 sending to root
> 8 sending to root
> 9 sending to root
> numDone = 1
> numDone = 1
> ... // many numDone = 1, but why 1 only?
> 7 sending to root
> ...
> I thought perhaps I can't receive into an array: but I tried
> 
> if (id == 1) {
>     int x = 60;
>     MPI_Send(&x, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
> } else if (id == 0) {
>     MPI_Recv(&arr[1], 1, MPI_INT, 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
>     cout << id << " recieved " << arr[1] << endl;
> }
> Which works.
> 
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users

Reply via email to