I'm trying to get some code working using request-based RMA (MPI_Rput,
MPI_Rget, MPI_Raccumulate). My understanding of the MPI 3.0 standard is that
after calling MPI_Wait on the request handle, the local buffers should be safe
to use. On calling MPI_Win_flush_all on the window used for RMA operations, all
operations should be completed on the remote processor. Based on this, I would
expect that the following program should work:
#include <mpi.h>
int main(int argc, char *argv[])
{
int bytes = 4096;
MPI_Win win;
void *buf;
MPI_Init(&argc, &argv);
MPI_Alloc_mem(bytes,MPI_INFO_NULL, &win);
MPI_Win_create(buf,bytes,1,MPI_INFO_NULL,MPI_COMM_WORLD,&win);
MPI_Win_flush_all(win);
MPI_Win_free(&win);
MPI_Finalize();
return(0);
}
However, with openmpi-1.8.3 I'm seeing a crash
[node302:3689] *** An error occurred in MPI_Win_flush_all
[node302:3689] *** reported by process [2431516673,0]
[node302:3689] *** on win rdma window 3
[node302:3689] *** MPI_ERR_RMA_SYNC: error executing rma sync
[node302:3689] *** MPI_ERRORS_ARE_FATAL (processes in this win will now abort,
[node302:3689] *** and potentially your MPI job)
I'm seeing similar failures for mvapich2-2.1 and mpich-3.2. Does anyone know if
this stuff is suppose to work? I've had pretty good luck using the original RMA
calls (MPI_Put, MPI_Get and MPI_Accumulate) with MPI_Lock/MPI_Unlock but the
request-based calls are mostly a complete failure.
Bruce Palmer