Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

Subject: Re: [OMPI devel] [EXTERNAL] Re: non-blocking barrier
From: Barrett, Brian W (bwbarre_at_[hidden])
Date: 2012-07-06 11:05:55


Yeah, there was a bug in the code. Fixed now.

Brian

On 7/6/12 10:47 AM, "Richard Graham" <richardg_at_[hidden]> wrote:

>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
>
>_______________________________________________
>devel mailing list
>devel_at_[hidden]
>http://www.open-mpi.org/mailman/listinfo.cgi/devel
>
>