Shabtay’s take 04/28 - High level
clarification exchange. Issue resolved and no action needed.
Committee agrees
SCE-MI 2.0 Pipes - need to flesh out the recommended (required?)
use-model and test architecture in which pipes work
a) Is pipe depth left up
to vendors, or is this user-controlled?
b) What is a full pipe?
c) Threading requirements,
flush mechanism, blocking semantics of pipes, control flow in general
d) Development of a full
example/tutorial
** See consolidated
proposal from JohnS in IM208 dealing with IM's
208-211
Pipes
can be layered over an alternating mechanism to obtain data on a continuous
basis. Flushing is a synchronization point at which reactive things can happen.
Shabtay > I was under the impression that pipes are intended to
be used for streaming channels. Is this the not the case? Can someone clarify
if pipes are used for any type of channel (streaming or reactive) of just
streaming and on which basis the user will choose using pipes vs. using DPI
directly?
Per> It is my understanding
that pipes are intended for streaming, batching, variable length messages, and
potentially can be used even for more exotic purposes if the modeling subset
allows it. Given that pipes can be
implemented at the application layer, the choice between using pipes and DPI is
one of convenience in many cases.
However, since an implementation can choose to provide an optimized
version of the pipes, this would be a factor as well in the choice to use them.
Shabtay> We had some discussion about
setting buffer depth for pipes. It was my understanding that Mentor proposes
setting the buffer depth by the infrastructure and not by the user. Is this
correct?
Per > This
is my understanding as well. If the
system is deterministic and observes alternating semantics, then I do not see
any need for a user setting of buffer depth.
This is because the buffer depth setting would have no observable impact
on the behavior of the system. There are
other problems with a user settable buffer depth: it is unlikely that a given
buffer depth setting would achieve optimum performance in all
implementations. Note, I am saying that
I do not think a user setting for buffer depth should be in the SCE-MI 2.0
standard. However, any implementation is
free to provide its own performance optimization knobs outside of the standard
which could include buffer depth setting. I do not see such features as leading
to a non-compliant implementation(necessarily).
Shabtay>> User should
not care about any buffering that it set by the implementation as long as
message arrival ordering on various channels is not impacted by the setting of
implementation buffer depth.
Per> Pipes are set to
enable delayed arrival. Correct? Who sets this delay? The
transactor model or the end user (who may be the recipient of a block box
transactor)? Have we touched on this question yet?
johnS >
I think the main point here
is that it does not matter who sets the delay or what the delay is so long as
there is a mechanism to re-synchronize the times of the pipe producer and pipe
consumer if it becomes necessary to enter back into a mode of reactive
(alternating) interactions. This is the
purpose of the flush call - to provide this re-synchronization.
For example, a pipe producer
thread can be sitting there jamming transactions into a pipe to its heart's
content. The consumer meanwhile is only consuming transactions which the
producer had written well into the past.
So in this scenario at any
given point the consumer's time, the producer is well into the future - how far
into it, we don't care.
Or, put differently, at any
given point in the producer's time, the consumer is well into the past. How far
into it, we don't care.
But suppose producer and
consumer now want to interact reactively, say with plain DPI function call
interactions. They must synchronize. i.e. the
producer's present must become one and the same as the consumer's present. To
do this, producer issues a flush. This guarantees that the producer thread
blocks until all the future transactions have dissipated to the consumer and
now the two are synchronized in time. At this point in time, the two have a
common present and are free to communicate reactively. And all this can be done
deterministically where interactions take place on the same clocks on timed
side regardless of how much buffering an implementation provided or how much
concurrency it chose to use.
<<End JohnS
Shabtay> How would user
obtain matching results if each implementation sets its own buffer depth?
Per> By
the simple fact that the pipes are deterministic.