13.3.5. Request-based RMA Communication Operations
Up: Communication Calls
Next: Memory Model
Previous: Compare and Swap
Request-based RMA communication operations allow the user to
associate a request handle with the RMA operations and test or wait
for the completion of these requests using the functions described in
Section Communication Completion. Request-based RMA operations
are only valid within a passive target
epoch (see Section Synchronization Calls).
Upon returning from a completion call in which an RMA operation
completes, all fields of the status object, if any, and the results of status query
functions (e.g., MPI_GET_COUNT) are undefined with the
exception of MPI_ERROR if appropriate (see
Section Return Status). It is
valid to mix different request types (e.g., any combination of RMA
requests, collective requests, I/O requests, generalized requests, or
point-to-point requests) in functions that enable multiple completions
(e.g., MPI_WAITALL). It is erroneous to call
MPI_REQUEST_FREE or MPI_CANCEL for a request
associated with an RMA operation. RMA requests are not persistent.
The closing of the epoch, or explicit bulk synchronization using
MPI_WIN_FLUSH, MPI_WIN_FLUSH_ALL,
MPI_WIN_FLUSH_LOCAL, or
MPI_WIN_FLUSH_LOCAL_ALL, also indicates completion of
request-based RMA operations on the specified window. However, users must still free the request by testing, waiting,
or calling MPI_REQUEST_FREE on the request handle to allow
the MPI implementation to release any resources associated with these requests.
MPI_RPUT(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win, request) |
IN origin_addr | initial address of origin buffer (choice) |
IN origin_count | number of entries in origin buffer (non-negative integer) |
IN origin_datatype | datatype of each entry in origin buffer (handle) |
IN target_rank | rank of target (non-negative integer) |
IN target_disp | displacement from start of window to target buffer (non-negative integer) |
IN target_count | number of entries in target buffer (non-negative integer) |
IN target_datatype | datatype of each entry in target buffer (handle) |
IN win | window used for communication (handle) |
OUT request | RMA request (handle) |
C binding
int MPI_Rput(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win, MPI_Request *request)
int MPI_Rput_c(const void *origin_addr, MPI_Count origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, MPI_Count target_count, MPI_Datatype target_datatype, MPI_Win win, MPI_Request *request)
Fortran 2008 binding
MPI_Rput(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win, request, ierror)
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: origin_addr
INTEGER, INTENT(IN) :: origin_count, target_rank, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, target_datatype
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_Rput(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win, request, ierror) !(_c)
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: origin_addr
INTEGER(KIND=MPI_COUNT_KIND), INTENT(IN) :: origin_count, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, target_datatype
INTEGER, INTENT(IN) :: target_rank
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran binding
MPI_RPUT(ORIGIN_ADDR, ORIGIN_COUNT, ORIGIN_DATATYPE, TARGET_RANK, TARGET_DISP, TARGET_COUNT, TARGET_DATATYPE, WIN, REQUEST, IERROR)
<type> ORIGIN_ADDR(*)
INTEGER ORIGIN_COUNT, ORIGIN_DATATYPE, TARGET_RANK, TARGET_COUNT, TARGET_DATATYPE, WIN, REQUEST, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) TARGET_DISP
MPI_RPUT is similar to MPI_PUT
(Section Put), except that it
allocates a communication request object and associates it with the
request handle (the argument request). The completion of the
operation at the origin (i.e., after the corresponding test or wait) indicates that the sender is now free to
update the locations in the origin buffer. It does not indicate that
the data is available at the target window. If remote completion is
required, MPI_WIN_FLUSH, MPI_WIN_FLUSH_ALL,
MPI_WIN_UNLOCK, or
MPI_WIN_UNLOCK_ALL can be used.
MPI_RGET(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win, request) |
OUT origin_addr | initial address of origin buffer (choice) |
IN origin_count | number of entries in origin buffer (non-negative integer) |
IN origin_datatype | datatype of each entry in origin buffer (handle) |
IN target_rank | rank of target (non-negative integer) |
IN target_disp | displacement from window start to the beginning of the target buffer (non-negative integer) |
IN target_count | number of entries in target buffer (non-negative integer) |
IN target_datatype | datatype of each entry in target buffer (handle) |
IN win | window used for communication (handle) |
OUT request | RMA request (handle) |
C binding
int MPI_Rget(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win, MPI_Request *request)
int MPI_Rget_c(void *origin_addr, MPI_Count origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, MPI_Count target_count, MPI_Datatype target_datatype, MPI_Win win, MPI_Request *request)
Fortran 2008 binding
MPI_Rget(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win, request, ierror)
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: origin_addr
INTEGER, INTENT(IN) :: origin_count, target_rank, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, target_datatype
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_Rget(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win, request, ierror) !(_c)
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: origin_addr
INTEGER(KIND=MPI_COUNT_KIND), INTENT(IN) :: origin_count, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, target_datatype
INTEGER, INTENT(IN) :: target_rank
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran binding
MPI_RGET(ORIGIN_ADDR, ORIGIN_COUNT, ORIGIN_DATATYPE, TARGET_RANK, TARGET_DISP, TARGET_COUNT, TARGET_DATATYPE, WIN, REQUEST, IERROR)
<type> ORIGIN_ADDR(*)
INTEGER ORIGIN_COUNT, ORIGIN_DATATYPE, TARGET_RANK, TARGET_COUNT, TARGET_DATATYPE, WIN, REQUEST, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) TARGET_DISP
MPI_RGET is similar to MPI_GET
(Section Get), except that it
allocates a communication request object and associates it with the
request handle (the argument request) that can be used to wait
or test for completion of the operation at the origin, which indicates that the
data is available in the origin buffer. If
origin_addr points to memory attached to a window, then the
data becomes available in the private copy of this window.
MPI_RACCUMULATE(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op, win, request) |
IN origin_addr | initial address of buffer (choice) |
IN origin_count | number of entries in buffer (non-negative integer) |
IN origin_datatype | datatype of each entry in origin buffer (handle) |
IN target_rank | rank of target (non-negative integer) |
IN target_disp | displacement from start of window to beginning of target buffer (non-negative integer) |
IN target_count | number of entries in target buffer (non-negative integer) |
IN target_datatype | datatype of each entry in target buffer (handle) |
IN op | accumulate operator (handle) |
IN win | window object (handle) |
OUT request | RMA request (handle) |
C binding
int MPI_Raccumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request *request)
int MPI_Raccumulate_c(const void *origin_addr, MPI_Count origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, MPI_Count target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request *request)
Fortran 2008 binding
MPI_Raccumulate(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op, win, request, ierror)
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: origin_addr
INTEGER, INTENT(IN) :: origin_count, target_rank, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, target_datatype
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Op), INTENT(IN) :: op
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_Raccumulate(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op, win, request, ierror) !(_c)
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: origin_addr
INTEGER(KIND=MPI_COUNT_KIND), INTENT(IN) :: origin_count, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, target_datatype
INTEGER, INTENT(IN) :: target_rank
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Op), INTENT(IN) :: op
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran binding
MPI_RACCUMULATE(ORIGIN_ADDR, ORIGIN_COUNT, ORIGIN_DATATYPE, TARGET_RANK, TARGET_DISP, TARGET_COUNT, TARGET_DATATYPE, OP, WIN, REQUEST, IERROR)
<type> ORIGIN_ADDR(*)
INTEGER ORIGIN_COUNT, ORIGIN_DATATYPE, TARGET_RANK, TARGET_COUNT, TARGET_DATATYPE, OP, WIN, REQUEST, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) TARGET_DISP
MPI_RACCUMULATE is similar to MPI_ACCUMULATE
(Section Accumulate Functions),
except that it allocates a communication request object and associates
it with the request handle (the argument request) that can be
used to wait or test for completion. The completion of the
operation at the origin (i.e., after the corresponding test or wait) indicates that the origin buffer
is free to be updated. It does not indicate that the operation has
completed at the target window.
MPI_RGET_ACCUMULATE(origin_addr, origin_count, origin_datatype, result_addr, result_count, result_datatype, target_rank, target_disp, target_count, target_datatype, op, win, request) |
IN origin_addr | initial address of buffer (choice) |
IN origin_count | number of entries in origin buffer (non-negative integer) |
IN origin_datatype | datatype of each entry in origin buffer (handle) |
OUT result_addr | initial address of result buffer (choice) |
IN result_count | number of entries in result buffer (non-negative integer) |
IN result_datatype | datatype of entries in result buffer (handle) |
IN target_rank | rank of target (non-negative integer) |
IN target_disp | displacement from start of window to beginning of target buffer (non-negative integer) |
IN target_count | number of entries in target buffer (non-negative integer) |
IN target_datatype | datatype of each entry in target buffer (handle) |
IN op | accumulate operator (handle) |
IN win | window object (handle) |
OUT request | RMA request (handle) |
C binding
int MPI_Rget_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr, int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request *request)
int MPI_Rget_accumulate_c(const void *origin_addr, MPI_Count origin_count, MPI_Datatype origin_datatype, void *result_addr, MPI_Count result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, MPI_Count target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request *request)
Fortran 2008 binding
MPI_Rget_accumulate(origin_addr, origin_count, origin_datatype, result_addr, result_count, result_datatype, target_rank, target_disp, target_count, target_datatype, op, win, request, ierror)
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: origin_addr
INTEGER, INTENT(IN) :: origin_count, result_count, target_rank, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, result_datatype, target_datatype
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: result_addr
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Op), INTENT(IN) :: op
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_Rget_accumulate(origin_addr, origin_count, origin_datatype, result_addr, result_count, result_datatype, target_rank, target_disp, target_count, target_datatype, op, win, request, ierror) !(_c)
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: origin_addr
INTEGER(KIND=MPI_COUNT_KIND), INTENT(IN) :: origin_count, result_count, target_count
TYPE(MPI_Datatype), INTENT(IN) :: origin_datatype, result_datatype, target_datatype
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: result_addr
INTEGER, INTENT(IN) :: target_rank
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: target_disp
TYPE(MPI_Op), INTENT(IN) :: op
TYPE(MPI_Win), INTENT(IN) :: win
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran binding
MPI_RGET_ACCUMULATE(ORIGIN_ADDR, ORIGIN_COUNT, ORIGIN_DATATYPE, RESULT_ADDR, RESULT_COUNT, RESULT_DATATYPE, TARGET_RANK, TARGET_DISP, TARGET_COUNT, TARGET_DATATYPE, OP, WIN, REQUEST, IERROR)
<type> ORIGIN_ADDR(*), RESULT_ADDR(*)
INTEGER ORIGIN_COUNT, ORIGIN_DATATYPE, RESULT_COUNT, RESULT_DATATYPE, TARGET_RANK, TARGET_COUNT, TARGET_DATATYPE, OP, WIN, REQUEST, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) TARGET_DISP
MPI_RGET_ACCUMULATE is similar to
MPI_GET_ACCUMULATE (Section Get Accumulate), except that it allocates a
communication request object and associates it with the request handle
(the argument request) that can be used to wait or test for
completion. The completion of the
operation at the origin (i.e., after the corresponding test or wait)
indicates that the data is available in the result buffer
and the origin buffer is free to be updated. It does not indicate that
the operation has been completed at the target window.
Up: Communication Calls
Next: Memory Model
Previous: Compare and Swap
Return to MPI-4.1 Standard Index
Return to MPI Forum Home Page
(Unofficial) MPI-4.1 of November 2, 2023
HTML Generated on November 19, 2023