A quizzle of questions about 1-sided.
(1) A straw vote was taken at the last mtg in Chicago to support 3rd-party
communication. Specifically, I believe that this was defined in terms of
the following example, which should work without C taking any action:
Process A Process C Process B
Put X in C ---------------> X
Send B ............................................> Receive A
X ---------------------> Get X in C
However, did that vote also imply that C should be able to directly load
the data being passed through it without issuing any special commands?
Specifically, is it necessary that B and C get the same value for X in
these examples?
Process A Process C Process B
Put X in C ---------------> X
Send B ............................................> Receive A
X ---------------------> Get X in C
Receive B <............... Send C
load X
..or..
Process A Process C Process B
Put X in C ---------------> X
Send C ...................> Receive A
load X
Send B ..................> Receive A
X ----------------------> Get X in C
*******
If we follow the design currently outlined in the alternative proposal, then
Process C needs to execute a synchronization involving its window before it can
load X. Neither of your two examples are guaranteed to work.
********
(2) Regarding semantics which mandate an agent on some architectures: in
looking through MPI-1, I find the following progress semantics in 3.7.4
"Semantics of Nonblocking Communications":
A call to MPI_WAIT that completes a receive will eventually terminate
and return if a matching send has been started, unless the send is
satisfied by another receive. In particular, if the matching send
is nonblocking, then the receive should complete even if no call is
executed by the sender to complete the send. Similarly, a call to
MPI_WAIT that completes a send will eventually return if a matching
receive has been started, unless the receive is satisfied by another
send, and even if no call is executed to complete the receive.
To me, this sounds very close to the situation that we are considering
for 1-sided. Specifically, it sounds as though an agent is required
in point-to-point if, for example, a non-blocking send is initiated
with a message which cannot be sent in its entirety (due to size), and
the sender then enters an infinite compute loop. The receiver is
guaranteed to get the message, so on some architectures, an agent
is mandated. Can someone dispute this?
******
This has been discussed at length. Burns argues that we do not care about
infinite loops, and in any terminating program there must be an MPI call
executed by each process eventually, namely MPI_FINALIZE. I would argue that
the semantics need be defined so that infinit programs work OK and, therefore,
an agent is needed to enforce progress in send-receive. The IBM implementation
supports a polling mode where incoming messages are dealt with only when the
receiver executes some MPI call, but even in polling mode, an MPI agent is
periodically invoked by a timer to ensure progress.
******
(3) I suggest that people consider the case of exchanging data between two
(or more) processes when proposing new constructs -- e.g. insert proper
synchronization into the following processes:
Process A Process B
Put to B Put to A
local load local load
Or maybe someone can argue that this isn't an important case?
Thanks. More later,
-Dave
===============================================================================
David C. DiNucci | MRJ, Inc., Rsrch Scntst |USMail: NASA Ames Rsrch Ctr
dinucci@nas.nasa.gov| NAS (Num. Aerospace Sim.)| M/S T27A-2
(415)604-4430 | Parallel Tools Group | Moffett Field, CA 94035