12.6.2. Clarifications

PreviousUpNext
Up: MPI and Threads Next: The Dynamic Process Model Previous: General

Initialization and Completion. When using the World Model, the call to MPI_FINALIZE should occur on the same thread that initialized MPI. We call this thread the main thread. The call should occur only after all process threads have completed their MPI calls, and have no pending communication or I/O operations.
Rationale.

This constraint simplifies implementation. ( End of rationale.)
Threads and the Sessions Model. The Sessions Model provides a finer-grain approach to controlling the interaction between MPI calls and threads. When using this model, the desired level of thread support is specified at Session initialization time. See Section The Sessions Model. Thus it is possible for communicators and other MPI objects derived from one Session to provide a different level of thread support than those created from another Session for which a different level of thread support was requested. Depending on the level of thread support requested at Session initialization time, different threads in a MPI process can make concurrent calls to MPI when using MPI objects derived from different session handles. Note that the requested and provided level of thread support when creating a Session may influence the granted level of thread support in a subsequent invocation of MPI_SESSION_INIT. Likewise, if the application at some point calls MPI_INIT_THREAD, the requested and granted level of thread support may influence the granted level of thread support for subsequent calls to MPI_SESSION_INIT. Similarly, if the application calls MPI_INIT_THREAD after a call to MPI_SESSION_INIT, the level of thread support returned from MPI_INIT_THREAD may be similarly influenced by the requested level of thread support in the prior call to MPI_SESSION_INIT.

In addition, if an MPI application is only using the Sessions Model, the provided thread support level returned by MPI_QUERY_THREAD is the same as that returned prior to invocation of MPI_INIT_THREAD or MPI_INIT. If the application also used the World Model in some component of the application, MPI_QUERY_THREAD will return the level of thread support returned by the original call to MPI_INIT_THREAD.

Multiple threads completing the same request. A program in which two threads block, waiting on the same request, is erroneous. Similarly, the same request cannot appear in the array of requests of two concurrent MPI_{WAIT|TEST}{ANY|SOME|ALL} calls. In MPI, a request can only be completed once. Any combination of wait or test that violates this rule is erroneous.


Rationale.

This restriction is consistent with the view that a multithreaded execution corresponds to an interleaving of the MPI calls. In a single threaded implementation, once a wait is posted on a request the request handle will be nullified before it is possible to post a second wait on the same handle. With threads, an MPI_WAIT{ANY|SOME|ALL} may be blocked without having nullified its request(s) so it becomes the user's responsibility to avoid using the same request in an MPI_WAIT on another thread. This constraint also simplifies implementation, as only one thread will be blocked on any communication or I/O event. ( End of rationale.)
Probe. A receive call that uses source and tag values returned by a preceding call to MPI_PROBE or MPI_IPROBE will receive the message matched by the probe call only if there was no other matching receive after the probe and before that receive. In a multithreaded environment, it is up to the user to enforce this condition using suitable mutual exclusion logic. This can be enforced by making sure that each communicator is used by only one thread on each process. Alternatively, MPI_MPROBE or MPI_IMPROBE can be used.

Collective calls. Matching of collective calls on a communicator, window, or file handle is done according to the order in which the calls are issued at each process. If concurrent threads issue such calls on the same communicator, window or file handle, it is up to the user to make sure the calls are correctly ordered, using interthread synchronization.
Advice to users.

With three concurrent threads in each MPI process of a communicator comm, it is allowed that thread A in each MPI process calls a collective operation on comm, thread B calls a file operation on an existing file handle that was formerly opened on comm, and thread C invokes one-sided operations on an existing window handle that was also formerly created on comm. ( End of advice to users.)

Rationale.

As specified in MPI_FILE_OPEN and MPI_WIN_CREATE, a file handle and a window handle inherit only the group of processes of the underlying communicator, but not the communicator itself. Accesses to communicators, window handles and file handles cannot affect one another. ( End of rationale.)

Advice to implementors.

If the implementation of file or window operations internally uses MPI communication then a duplicated communicator may be cached on the file or window object. ( End of advice to implementors.)
Error handlers. An error handler does not necessarily execute in the context of the thread that made the error-raising MPI call; the error handler may be executed by a thread that is distinct from the thread that will return the error code.


Rationale.

The MPI implementation may be multithreaded, so that part of the communication protocol may execute on a thread that is distinct from the thread that made the MPI call. The design allows the error handler to be executed on the thread where the error is raised. ( End of rationale.)
Interaction with signals and cancellations. The outcome is undefined if a thread that executes an MPI call is cancelled (by another thread), or if a thread catches a signal while executing an MPI call. However, a thread of an MPI process may terminate, and may catch signals or be cancelled by another thread when not executing MPI calls.


Rationale.

Few C library functions are signal safe, and many have cancellation points---points at which the thread executing them may be cancelled. The above restriction simplifies implementation (no need for the MPI library to be ``async-cancel-safe'' or ``async-signal-safe''). ( End of rationale.)

Advice to users.

Users can catch signals in separate, non- MPI threads (e.g., by masking signals on MPI calling threads, and unmasking them in one or more non- MPI threads). A good programming practice is to have a distinct thread blocked in a call to sigwait for each user expected signal that may occur. Users must not catch signals used by the MPI implementation; as each MPI implementation is required to document the signals used internally, users can avoid these signals. ( End of advice to users.)

Advice to implementors.

The MPI library should not invoke library calls that are not thread safe, if multiple threads execute. ( End of advice to implementors.)


PreviousUpNext
Up: MPI and Threads Next: The Dynamic Process Model Previous: General


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