MPI-/ supports three RMA/ communication calls: MPI_PUT
transfers data from the
caller memory (origin) to the target memory;
MPI_GET transfers data from the target memory to the caller
memory;
and MPI_ACCUMULATE updates locations in the target memory,
e.g. by adding to these locations values sent from the caller memory.
These operations are nonblocking: the call initiates
the transfer, but the transfer may continue after the call returns.
The transfer is completed, both at the origin and at the target, when
a subsequent synchronization call is issued by the caller on
the involved window object. These synchronization calls are described in
Section 6.4,
page .
The local communication buffer of an RMA/ call should not be updated, and the local communication buffer of a get call should not be accessed after the RMA/ call, until the subsequent synchronization call completes.
Weakening the rule does not prevent efficient implementation, as far as we know.
It is erroneous to have concurrent conflicting accesses to the same memory location in a window; if a location is updated by a put or accumulate operation, then this location cannot be accessed by a load or another RMA/ operation until the updating operation has completed at the target.
There is one exception to this rule; namely, the same location can be
updated by several concurrent accumulate calls, the outcome being as
if these updates occurred in some order. In addition, a window cannot
concurrently be updated by a put or accumulate operation and by a
local store operation. This, even if these two updates access
different locations in the window. The last restriction enables
more efficient implementations of RMA/ operations on many systems.
These restrictions are described in more detail in
Section 6.7, page .
The calls use general datatype arguments to specify communication buffers at the origin and at the target. Thus, a transfer operation may also gather data at the source and scatter it at the destination. However, all arguments specifying both communication buffers are provided by the caller.
For all three calls, the target process may be identical with the origin process; i.e., a process may use an RMA operation to move data in its memory.