To be safe I would call MPI_Get then MPI_Win_flush. That lock will always be 
acquired before the MPI_Win_flush call returns. As long as it is more than 0 
bytes. We always short-circuit 0-byte operations in both osc/rdma and osc/pt2pt.

-Nathan

> On Nov 21, 2016, at 8:54 PM, Gilles Gouaillardet <gil...@rist.or.jp> wrote:
> 
> Thanks Nathan,
> 
> 
> any thoughts about my modified version of the test ?
> 
> do i need to MPI_Win_flush() after the first MPI_Get() in order to ensure the 
> lock was acquired ?
> 
> (and hence the program will either success or hang, but never fail)
> 
> 
> Cheers,
> 
> 
> Gilles
> 
> 
> On 11/22/2016 12:29 PM, Nathan Hjelm wrote:
>> MPI_Win_lock does not have to be blocking. In osc/rdma it is blocking in 
>> most cases but not others (lock all with on-demand is non-blocking) but in 
>> osc/pt2pt is is almost always non-blocking (it has to be blocking for proc 
>> self). If you really want to ensure the lock is acquired you can call 
>> MPI_Win_flush. I think this should work even if you have not started any RMA 
>> operations inside the epoch.
>> 
>> -Nathan
>> 
>>> On Nov 21, 2016, at 7:53 PM, Gilles Gouaillardet <gil...@rist.or.jp> wrote:
>>> 
>>> Nathan,
>>> 
>>> 
>>> we briefly discussed the test_lock1 test from the onesided test suite using 
>>> osc/pt2pt
>>> 
>>> https://github.com/open-mpi/ompi-tests/blob/master/onesided/test_lock1.c#L57-L70
>>> 
>>> 
>>> task 0 does
>>> 
>>> MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank=1,...);
>>> 
>>> MPI_Send(...,dest=2,...)
>>> 
>>> 
>>> and task 2 does
>>> 
>>> MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank=1,...);
>>> 
>>> MPI_Recv(...,source=0,...)
>>> 
>>> 
>>> hoping to guarantee task 0 will acquire the lock first.
>>> 
>>> 
>>> once in a while, the test fails when task 2 acquires the lock first
>>> 
>>> /* MPI_Win_lock() only sends a lock request, and return without owning the 
>>> lock */
>>> 
>>> so if task 1 is running on a loaded server, and even if task 2 requests the 
>>> lock *after* task 0,
>>> 
>>> lock request from task 2 can be processed first, and hence task 2 is not 
>>> guaranteed to acquire the lock *before* task 0.
>>> 
>>> 
>>> can you please confirm MPI_Win_lock() behaves as it is supposed to ?
>>> 
>>> if yes, is there a way for task 0 to block until it acquires the lock ?
>>> 
>>> 
>>> i modified the test, and inserted in task 0 a MPI_Get of 1 MPI_Double 
>>> *before* MPI_Send.
>>> 
>>> see my patch below (note i increased the message length)
>>> 
>>> 
>>> my expectation is that the test would either success (e.g. task 0 gets the 
>>> lock first) or hang
>>> 
>>> (if task 1 gets the lock first)
>>> 
>>> 
>>> 
>>> surprisingly, the test never hangs (so far ...) but once in a while, it 
>>> fails (!), which makes me very confused
>>> 
>>> 
>>> Any thoughts ?
>>> 
>>> 
>>> Cheers,
>>> 
>>> 
>>> Gilles
>>> 
>>> 
>>> 
>>> diff --git a/onesided/test_lock1.c b/onesided/test_lock1.c
>>> index c549093..9fa3f8d 100644
>>> --- a/onesided/test_lock1.c
>>> +++ b/onesided/test_lock1.c
>>> @@ -20,7 +20,7 @@ int
>>> test_lock1(void)
>>> {
>>>     double *a = NULL;
>>> -    size_t     len = 10;
>>> +    size_t     len = 1000000;
>>>     MPI_Win    win;
>>>     int        i;
>>> 
>>> @@ -56,6 +56,7 @@ test_lock1(void)
>>>      */
>>>     if (me == 0) {
>>>        MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 1, 0, win);
>>> +       MPI_Get(a,1,MPI_DOUBLE,1,0,1,MPI_DOUBLE,win);
>>>         MPI_Send(NULL, 0, MPI_BYTE, 2, 1001, MPI_COMM_WORLD);
>>>        MPI_Get(a,len,MPI_DOUBLE,1,0,len,MPI_DOUBLE,win);
>>>         MPI_Win_unlock(1, win);
>>> @@ -76,6 +77,7 @@ test_lock1(void)
>>>         /* make sure 0 got the data from 1 */
>>>        for (i = 0; i < len; i++) {
>>>            if (a[i] != (double)(10*1+i)) {
>>> +                if (0 == nfail) fprintf(stderr, "at index %d, expected %lf 
>>> but got %lf\n", i, (double)10*1+i, a[i]);
>>>                nfail++;
>>>            }
>>>        }
>>> 
>>> _______________________________________________
>>> devel mailing list
>>> devel@lists.open-mpi.org
>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/devel
>> _______________________________________________
>> devel mailing list
>> devel@lists.open-mpi.org
>> https://rfd.newmexicoconsortium.org/mailman/listinfo/devel
>> 
> 
> _______________________________________________
> devel mailing list
> devel@lists.open-mpi.org
> https://rfd.newmexicoconsortium.org/mailman/listinfo/devel

_______________________________________________
devel mailing list
devel@lists.open-mpi.org
https://rfd.newmexicoconsortium.org/mailman/listinfo/devel

Reply via email to