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

Brian

On 7/6/12 10:47 AM, "Richard Graham" <richa...@mellanox.com> 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-boun...@open-mpi.org [mailto:devel-boun...@open-mpi.org] On
>Behalf Of George Bosilca
>Sent: Friday, July 06, 2012 2:48 AM
>To: eugene....@oracle.com; 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....@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
>
>_______________________________________________
>devel mailing list
>de...@open-mpi.org
>http://www.open-mpi.org/mailman/listinfo.cgi/devel
>
>_______________________________________________
>devel mailing list
>de...@open-mpi.org
>http://www.open-mpi.org/mailman/listinfo.cgi/devel
>
>




Reply via email to