MPI_WIN_CREATE(base, size, disp_unit, info, comm, win) | |
IN base | initial address of window (choice) |
IN size | size of window in bytes (non-negative integer) |
IN disp_unit | local unit size for displacements, in bytes (positive integer) |
IN info | info argument (handle) |
IN comm | intra-communicator (handle) |
OUT win | window object returned by the call (handle) |
int MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win)
MPI_Win_create(base, size, disp_unit, info, comm, win, ierror)
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: base
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: size
INTEGER, INTENT(IN) :: disp_unit
TYPE(MPI_Info), INTENT(IN) :: info
TYPE(MPI_Comm), INTENT(IN) :: comm
TYPE(MPI_Win), INTENT(OUT) :: win
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_WIN_CREATE(BASE, SIZE, DISP_UNIT, INFO, COMM, WIN, IERROR)
<type> BASE(*)
INTEGER(KIND=MPI_ADDRESS_KIND) SIZE
INTEGER DISP_UNIT, INFO, COMM, WIN, IERROR
This is a collective call executed by all processes in the group of comm. It returns a window object that can be used by these processes to perform RMA operations. Each process specifies a window of existing memory that it exposes to RMA accesses by the processes in the group of comm. The window consists of size bytes, starting at address base. In C, base is the starting address of a memory region. In Fortran, one can pass the first element of a memory region or a whole array, which must be `simply contiguous' (for `simply contiguous,' see also Section Problems Due to Data Copying and Sequence Association with Subscript Triplets ). A process may elect to expose no memory by specifying size = 0.
The displacement unit argument is provided to facilitate address arithmetic in RMA operations: the target displacement argument of an RMA operation is scaled by the factor disp_unit specified by the target process, at window creation.
Rationale.
The window size is specified using an address-sized integer,
rather than a basic integer type, to allow windows that span more memory than
can be described with a basic integer type.
( End of rationale.)
Advice to users.
Common choices for disp_unit
are 1 (no scaling), and (in C syntax) sizeof(type), for a
window that consists of an array of elements of type type. The
latter
choice will allow one to use array indices in RMA calls,
and have those scaled correctly to byte displacements, even in a
heterogeneous environment.
( End of advice to users.)
The info argument provides
optimization hints to the runtime about the expected
usage pattern of the window.
The following info keys are predefined:
The info query mechanism described in Section Window Info
can be used to query the specified info arguments
for
windows that have been
passed to a library. It is recommended that libraries check attached
info keys for each passed window.
( End of advice to users.)
The various processes in the group of
comm may specify completely different
target windows, in location, size, displacement
units, and info arguments.
As long as all the get, put and accumulate accesses
to a particular process fit their
specific target window this should pose no problem.
The same area in memory may appear in multiple windows, each
associated with a different window object. However, concurrent
communications to distinct, overlapping windows may lead to
undefined
results.
Rationale.
The reason for specifying the memory that may be accessed from another
process in an RMA operation is to permit the programmer to specify
what memory can be a target of RMA operations and for the
implementation to enforce that specification. For example, with this
definition, a server process can safely allow a client process to use
RMA operations, knowing that (under the assumption that the MPI
implementation does enforce the specified limits on the exposed
memory) an error in the client cannot affect any memory other than
what was explicitly exposed.
( End of rationale.)
Advice to users.
A window can be created in any part of the process memory. However,
on some systems, the performance of windows in
memory allocated by MPI_ALLOC_MEM
(Section Memory Allocation
) will be better.
Also, on some systems, performance is improved when window boundaries
are aligned at ``natural'' boundaries (word, double-word, cache line,
page frame, etc.).
( End of advice to users.)
Advice
to implementors.
In cases where RMA operations use different mechanisms in different memory areas (e.g., load/store in a shared memory segment, and an asynchronous handler in private memory), the MPI_WIN_CREATE call needs to figure out which type of memory is used for the window. To do so, MPI maintains, internally, the list of memory segments allocated by MPI_ALLOC_MEM, or by other, implementation-specific, mechanisms, together with information on the type of memory segment allocated. When a call to MPI_WIN_CREATE occurs, then MPI checks which segment contains each window, and decides, accordingly, which mechanism to use for RMA operations.
Vendors may provide additional, implementation-specific mechanisms to allocate or to specify memory regions that are preferable for use in one-sided communication. In particular, such mechanisms can be used to place static variables into such preferred regions.
Implementors should document any performance impact of window alignment.
( End of advice to implementors.)