Apologies to David Ungar - should have had another cup of coffee before
sending this. I went back to the original post that started this thread
(pointing to a talk by David Ungar). The promptly mixed up David Ungar
and David Barbour in my thinking. Ooops. Apologies. Arguement remains
the same, but it's with David Barbour....
Miles Fidelman wrote:
David Barbour wrote:
Your approach to parallelism strikes me as simplistic. Like saying
Earth is in center of Solar system. Sun goes around Earth. It sounds
simple. It's "easy to conceptualize". Oh, and it requires epicyclic
orbits to account for every other planet. Doesn't sound so simple
anymore. Like this, simplistic becomes a complexity multiplier in
disguise.
You propose actor per object. It sounds simple to you, and "easy to
conceptualize". But now programmers have challenges to control
latency, support replay, testing, maintenance, verification,
consistency. This is in addition to problems hand-waved through like
line-of-sight and collision detection. It doesn't sound so simple
anymore.
The whole point of architecture is to generate the overall outline of
a system, to address a particular problem space within the constraints
at hand. The KISS principle applies (along with "seek simplicity and
distrust it"). If there isn't a degree of simplicity and elegance in
an architecture, the architect hasn't done particularly good job.
In the past, limitations of hardware, languages, and run-time
environments have dictated against taking parallel (or more
accurately, concurrent) approaches to problems, even when massive
concurrency is the best mapping onto the problem domain - resulting in
very ugly code.
Yes, there are additional problems introduced by modeling a problem as
massively concurrent - and those are areas that I think are areas for
fruitful research. In particular, re. the ones you cite:
- control latency, support replay, testing, maintenance, verification:
these are nothing new at the systems level (think about either all the
different things that run on a common server, or about all the things
that go on in a distributed system such as the federated collection of
SMTP servers that we're relying on right now)
- consistency: is not your message "Avoid the Concurrency Trap by
Embracing Non-Determinism?" -- is not a key question: what does it
mean to "embrace non-determinism" and how to design systems in an
inherently indeterminate environment? (more below)
- now line-of-sight and collision detection, which are more specific
to the simulation domain, are interesting in two regards:
-- collision detection (and weapons effects) are easy if you allow
actors to calculate to determine "I'm hit," not so easy if you want
independent verification by a referee or a physical environment model
- the latter pretty much requires some kind of serialization, and the
question becomes how
-- line-of-sight calculations are the bane of simulators - right now,
the practice is for each entity to do it's own line of sight
calculations (doesn't matter if it's an object that is invoked by a
control thread, or an asynchronous actor) - each entity takes a look
around (scans a database) to determine who it can see (and be seen
by), who it can't, what's blocking it's view of other objects, etc. --
very compute intensive, and where coders spend a LOT of time
optimizing (a CGF has to do this 20 times a second or more, GIS
systems tend to take 30 seconds to several minutes to do the same
thing -- when I was in the simulation business, I sat in several
rather amusing meetings, watching coders from a well-known GIS firm,
as their jaws dropped when told how fast our stuff did line-of-sight
calucations). I expect that there are some serious efficiencies that
can be gained by performing LOS calculations from a global
perspective, and that these can benefit from massive parallelism - I
expect there's work on ray tracing and rendering that applies - but
that gets pretty far afield from my own experience.)
The old sequential model, or even the pipeline technique I suggest,
do not contradict the known, working structure for consistency.
But is consistency the issue at hand?
This line of conversation goes back to a comment that the limits to
exploiting parallelism come down to people thinking sequentially, and
inherent complexity of designing parallel algorithms. I argue that
quite a few problems are more easily viewed through the lens of
concurrency - using network protocols and military simulation as
examples that I'm personally familiar with.
You seem to be making the case for sequential techniques that maintain
consistency. But is that really the question? This entire thread
started with a posting about a paper you were giving on Project
Renaissance - that contained two points that stood out to me:
"If we cannot skirt Amdahl’s Law, the last 900 cores will do us no
good whatsoever. What does this mean? We cannot afford even tiny
amounts of serialization."
"Avoid the Concurrency Trap by Embracing Non-Determinism?" (actually
not from the post, but from the Project Renaissance home page)
In this, I think we're in violet agreement - the key to taking
advantage of parallelism is to "embrace non-determinism."
In this context, I've been enjoying Carl Hewitt's recent writings
about indeterminacy in computing. If I might paraphrase a bit, isn't
the point that 'complex computing systems are inherently and always
indeterminate, let's just accept this, not try to force consistency
where it can't be forced, and get on with finding ways to solve
problems in ways that work in an indeterminate environment.'
Which comes back to my original comment that there are broad classes
of problems that are more readily addressed through the lens of
massive concurrency (as a first-order architectural view). And that
new hardware advances (multi-core architectures, graphic processors),
and language/run-time models (actors, Erlang-like massive
concurrency), now allow us to architect systems around massive
concurrency (when the model fits the problem).
And, returning to this context:
"... For huge classes of problems - anything that's remotely
transactional or event driven, simulation, gaming come to mind
immediately - it's far easier to conceptualize as spawning a
process than trying to serialize things. The stumbling block has
always been context switching overhead. That problem goes away as
your hardware becomes massively parallel. "
Are you arguing that:
a) such problems are NOT easier to conceptualize as parallel and
asynchronous, or,
b) parallelism is NOT removing obstacles to taking actor-like
approaches to these classes of problems, or
c) something else?
I would argue all three.
Ahh... then I would counter that:
a) you selectively conceptualize only part of the system - an
idealized happy path. It is much more difficult to conceptualize your
whole system - i.e. all those sad paths you created but ignored. Many
simulators have collision detection, soft real-time latency
constraints, and consistency requirements. It is not easy to
conceptualize how your system achieves these.
In this one, I write primarily from personal experience and
observation. There are a huge class of systems that are inherently
concurrent, and inherently not serializeable. Pretty much any
distributed system comes to mind - email and transaction processing
come to mind. I happen to think that simulators fall into this class -
and in this regard there's an existence proof:
- Today's simulators are built both ways:
-- CGFs and SAFs (multiple entities simulated on a single box) -
generally written with an object-oriented paradigm in C++ or Java,
highly optimized for performance, with code that is incredibly hard to
follow, and turns out to be rather brittle
-- networked simulations (e.g. F16 man-in-the-loop simulators linked
by network) are inherently independent processes, linked by networks
that have all kinds of indeterminancies vis-a-vis packet delays,
packet delivery order, packet loss (you pretty much have to use
multi-cast UDP, and packet loss, or you can't keep up with real-time
simulation - and the pilots tend to throw up all over the simulators
if the timing is off - sensitive thing the human vestibular system)
---- a much simpler architecture, systems that are much easier to follow
Very different run-time environments, very different system
architectures. Both work.
Personally, I find networked simulators to be a lot easier to
conceptualize than today's CGFs -- in one case, adding a new entity
(say a plane) to a simulation = adding a new box that has a clean
interface. In the other, it involves adding a new object, and having
to understand that there's all kinds of behind-the-scenes magic going
on, as multiple control threads wind their way through all the objects
in the system. One is a clean mapping between the problem space, the
other is just ugly.
Yes, as noted above, serious problems remain - but the question is
about serial vs. parallel approaches are more tractable at the
architectural level.
b) parallelism is not concurrency; it does not suggest actor-like
approaches. Pipeline and data parallelism are well proven
alternatives used in real practice. There are many others, which I
have mentioned before.
Fair point. If we limit ourselves to a discussion of pipelines and
data parallelism, I'll concede that they do not necessarily lead to
cleaner conceptual mappings between problems and systems
architectures. In fact, for the examples I've been talking about, my
sense is that a pipelined approach to simulation is not particularly
easier to comprehend than current approaches - though it might take
better advantage of large numbers of processing cores. In the case of
email, I can't even begin to think about applying synchronous
parallelism to messages flowing a federation of mail servers.
On the other hand, if we look at the larger question of "skirting
Amdah's law" in an environment with lots of processing cores -
certainly within some definitions of "parallelism" - then actor-like
massive concurrency approaches are certainly in bounds, and the
availability of more cores certainly allows for running more actors
without running into resource conflicts.
c) performance - context-switching overhead - isn't the most
important stumbling block. consistency, correctness, complexity are
each more important.
Ahh... here's I'll through it back to the question of architectures
and design patterns that assume inconsistency as the norm (biological
metaphors if you will). And maybe add a touch of protocol layering
techniques (IP packets are inherently unreliable and probabilistic in
behavior, we layer TCP on top of it to provide reliable connections.
In other cases - like VoIP and video streaming - we can't go back and
retransmit, so we either forget about lost packets, or use
forward-error-correcting codes).
Like you, I believe we can achieve parallel designs while improving
simplicity. But I think I will eschew turning tanks into actors.
Agreed on the first, not, obviously on the second.
--
In theory, there is no difference between theory and practice.
In practice, there is. .... Yogi Berra
_______________________________________________
fonc mailing list
fonc@vpri.org
http://vpri.org/mailman/listinfo/fonc