ambiguity of communications
modularitylibraries, safety
MPI employs the communicator abstraction
to promote software modularity by allowing the
construction of independent communication streams between processes,
thereby ensuring that messages sent in one phase of an application
are not incorrectly intercepted by another phase. Communicators
are particularly important in allowing libraries that make message passing
calls to be used safely within an application.
The point here is that
the application developer has no way of knowing if the tag, group, and rank
completely disambiguate the message traffic of different libraries and
the rest of the application. Communicators, in effect, provide an
additional criterion for message selection, and hence permits the construction
of independent tag spaces.

We discussed in
Section possible hazards when a library uses
the same communicator as the calling code. The incorrect matching of
sends executed by the caller code with receives executed by the
library occurred because the library code used wildcarded receives.
Conversely, incorrect matches may occur when the caller code uses
wildcarded receives, even if the library code by itself is deterministic.

Consider the
example in Figure .
If the program behaves correctly
processes 0 and 1 each
receive a message from process 2,
using a wildcarded selection criterion to
indicate that they are prepared to receive a message from any process. The
three processes then pass data around in a ring within the library routine.
If separate communicators are not used for the communication inside and
outside of the library routine
this program may intermittently fail. Suppose we delay the sending
of the second message sent by process 2, for example, by inserting some
computation, as shown in Figure .
In this case the wildcarded
receive in process 0 is satisfied by a message sent from process 1, rather
than from process 2, and deadlock results.

Figure: Use of communicators. Numbers
in parentheses indicate the process to which data are being sent or received.
The gray shaded area represents the library routine call. In this case
the program behaves as intended. Note that the second message sent by process
2 is received by process 0, and that the message sent by process 0 is
received by process 2.

Figure: Unintended behavior of program. In this case the message from process 2
to process 0 is never received, and deadlock results.

Even if neither caller nor callee use wildcarded receives, incorrect
matches may still occur if a send initiated before the collective
library invocation is to be matched by a receive posted after the
invocation (Ex. ,
page ).
By using a different
communicator in the library routine we can ensure that the program
is executed correctly, regardless of when the processes enter the library
routine.