<div dir="ltr">Yep, that's a bug.  Patch looks like the right fix to me.<div><br></div><div> ~Jim.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Feb 25, 2014 at 6:03 PM, Nathan Hjelm <span dir="ltr"><<a href="mailto:hjelmn@lanl.gov" target="_blank">hjelmn@lanl.gov</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello, I am finishing MPI-3 RMA support in Open MPI and I am using the<br>
MPICH test suite to test the new functionality before release. I think<br>
I found a bug in one of your tests. The reqops test does the following<br>
in one of its loops:<br>
<br>
    for (i = 0; i < ITER; i++) {<br>
        MPI_Request req;<br>
        int val = -1, exp = -1;<br>
<br>
        /* Processes form a ring.  Process 0 starts first, then passes a token<br>
         * to the right.  Each process, in turn, performs third-party<br>
         * communication via process 0's window. */<br>
        if (rank > 0) {<br>
            MPI_Recv(NULL, 0, MPI_BYTE, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
        }<br>
<br>
        MPI_Rget(&val, 1, MPI_INT, 0, 0, 1, MPI_INT, window, &req);<br>
        assert(req != MPI_REQUEST_NULL);<br>
        MPI_Wait(&req, MPI_STATUS_IGNORE);<br>
<br>
        MPI_Rput(&rank, 1, MPI_INT, 0, 0, 1, MPI_INT, window, &req);<br>
        assert(req != MPI_REQUEST_NULL);<br>
        MPI_Wait(&req, MPI_STATUS_IGNORE);<br>
<br>
        exp = (rank + nproc-1) % nproc;<br>
<br>
        if (val != exp) {<br>
            printf("%d - Got %d, expected %d\n", rank, val, exp);<br>
            errors++;<br>
        }<br>
<br>
        if (rank < nproc-1) {<br>
            MPI_Send(NULL, 0, MPI_BYTE, rank+1, 0, MPI_COMM_WORLD);<br>
        }<br>
<br>
        MPI_Barrier(MPI_COMM_WORLD);<br>
    }<br>
<br>
<br>
The problem is that no call is being made to ensure the RMA operation is<br>
complete at the target as per MPI-3 p432 13-17:<br>
<br>
"The completion of an MPI_RPUT operation (i.e., after the corresponding<br>
test or wait) indicates that the sender is now free to update the<br>
locations in the origin buffer. It does not indicate that the data is<br>
available at the target window. If remote completion is required,<br>
MPI_WIN_FLUSH, MPI_WIN_FLUSH_ALL, MPI_WIN_UNLOCK, or MPI_WIN_UNLOCK_ALL<br>
can be used."<br>
<br>
<br>
Not ensuring remote completion may cause processes further down the ring<br>
to read a value written by a process other than the previous process in<br>
the ring.<br>
<br>
The fix is to add MPI_Win_flush (0, window) before the MPI_Send. I can<br>
confirm that this fixes the issue with Open MPI. Please see the attached<br>
patch.<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
-Nathan Hjelm<br>
HPC-5, LANL<br>
<br>
</font></span></blockquote></div><br></div>