Hello,
I am trying to better understand the semantics of passive synchronization in
one-sided communication calls. Doesn't MPI_Win_unlock()
block to ensure that all the preceeding RMA calls in that epoch have been
synced?
In that case, why is an undefined value returned when trying to load from a
local window? (see below)
MPI_Alloc_mem(128, MPI_INFO_NULL, &ptr);
MPI_Win_create(ptr, 128, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
// write to the target window of the head node
if (rank == (size - 1)) {
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
in = 10;
MPI_Put(&in, 1, MPI_INT, 0, 0, 1, MPI_INT, win);
MPI_Win_unlock(0, win);
} else {
// busy wait
start = MPI_Wtime();
end = MPI_Wtime();
while ((end - start) < 1)
end = MPI_Wtime();
}
// read from the head node's window
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
MPI_Get(&out, 1, MPI_INT, 0, 0, 1, MPI_INT, win);
MPI_Win_unlock(0, win);
MPI_Barrier(MPI_COMM_WORLD);
printf("R%d: %d\n", rank, out);
The output of the above program with 1.5.3rc1 (and also with MPICH2 1.4rc2)
is:
R2: 10
R1: 10
R0: 0
whereas I expect to see:
R2: 10
R1: 10
R0: 10
Thanks,
Abhishek
|