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....@oracle.com> 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 > de...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/devel