Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

Subject: Re: [OMPI devel] non-blocking barrier
From: Richard Graham (richardg_at_[hidden])
Date: 2012-07-06 10:47:11


Forget what I just posted - I looked at George's words, and not the code - wait() is the synchronization point, so George's response is correct.

Rich

-----Original Message-----
From: devel-bounces_at_[hidden] [mailto:devel-bounces_at_[hidden]] On Behalf Of George Bosilca
Sent: Friday, July 06, 2012 2:48 AM
To: eugene.loh_at_[hidden]; Open MPI Developers
Cc: Open MPI Developers
Subject: Re: [OMPI devel] non-blocking barrier

No, it is not right. With the ibarrier usage you're making below, the output should be similar to the first case (all should leave at earlist at 6.0). The ibarrier is still a synchronizing point, all processes MUST reach it before anyone is allowed to leave.

However, if you move the ibarrier on proc < 2 before the sleep, the output you got become possible.

  George

On Jul 6, 2012, at 7:53, Eugene Loh <eugene.loh_at_[hidden]> wrote:

> Either there is a problem with MPI_Ibarrier or I don't understand the semantics.
>
> The following example is with openmpi-1.9a1r26747. (Thanks for the fix in 26757. I tried with that as well with same results.) I get similar results for different OSes, compilers, bitness, etc.
>
> % cat ibarrier.c
> #include <stdio.h>
> #include <unistd.h>
> #include <stdlib.h>
> #include <mpi.h>
>
> int main(int argc, char** argv) {
> int i, me;
> double t0, t1, t2;
> MPI_Request req;
>
> MPI_Init(&argc,&argv);
> MPI_Comm_rank(MPI_COMM_WORLD,&me);
>
> MPI_Barrier(MPI_COMM_WORLD);
> MPI_Barrier(MPI_COMM_WORLD);
> MPI_Barrier(MPI_COMM_WORLD);
> t0 = MPI_Wtime(); /* set "time zero" */
>
> if ( me < 2 ) sleep(3); /* two processes delay before hitting barrier */
> t1 = MPI_Wtime() - t0;
> MPI_Barrier(MPI_COMM_WORLD);
> t2 = MPI_Wtime() - t0;
> printf("%d entered at %3.1lf and exited at %3.1lf\n", me, t1, t2);
>
> if ( me < 2 ) sleep(3); /* two processes delay before hitting barrier */
> t1 = MPI_Wtime() - t0;
> MPI_Ibarrier(MPI_COMM_WORLD, &req);
> MPI_Wait(&req, MPI_STATUS_IGNORE);
> t2 = MPI_Wtime() - t0;
> printf("%d entered at %3.1lf and exited at %3.1lf\n", me, t1, t2);
>
> MPI_Finalize();
> return 0;
> }
> % mpirun -n 4 ./a.out
> 0 entered at 3.0 and exited at 3.0
> 1 entered at 3.0 and exited at 3.0
> 2 entered at 0.0 and exited at 3.0
> 3 entered at 0.0 and exited at 3.0
> 0 entered at 6.0 and exited at 6.0
> 1 entered at 6.0 and exited at 6.0
> 2 entered at 3.0 and exited at 3.0
> 3 entered at 3.0 and exited at 3.0
>
> With the first barrier, no one leaves until the last process has entered. With the non-blocking barrier, two processes enter and leave before the two laggards arrive at the barrier. Is that right?
> _______________________________________________
> devel mailing list
> devel_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/devel

_______________________________________________
devel mailing list
devel_at_[hidden]
http://www.open-mpi.org/mailman/listinfo.cgi/devel