itaps-parallel Notes from today's meeting
Mark Beall
mbeall at simmetrix.com
Mon Apr 12 20:09:31 CDT 2010
On Apr 12, 2010, at 2:46 PM, Devine, Karen D wrote:
> The first big question: Can an entity exist in an iMesh_instance
> that has a
> partition without being owned by any part?
First, a disclaimer: somewhere in this I'm going to write partition
instead of part (since what you call "parts" we call "partitions",
what you call a "partition" we call a "partitioning"). I will try to
avoid that.
It seems to me that a, not unreasonable, implementation of a
partitioned mesh is one where each part is equivalent to a mesh (when
I say "mesh" in here I mean "mesh instance" in the iMesh sense). This
is the way that our partitioned mesh works and, I believe, pretty much
how RPI's works. So we have 2 out of (how many?) iMeshP
implementations that are designed this way. From here on I'm going to
assume that this is a reasonable implementation, so my conclusions are
only valid if you agree with that.
The pros of this implementation:
- Since there is already a way of knowing what entities are in a mesh,
there is zero overhead, for the single partition case, of knowing what
entities are in a part. I think this is an important consideration
since the vast majority of applications won't use multiple partitions.
- There is no need for functions to loop over the contents of a part,
as there are already those for a mesh - I would think that Tim would
like this approach for this reason - smaller API :)
- Code that works in serial on a mesh can be used for anything that
can be done on just the interior of a part (or on the entire part if
it doesn't modify the part boundary)
- Since operations to create mesh entities are done on a mesh, there
isn't ever any question on what part an entity belongs to.
The cons of this implementation:
- It's not obvious how to deal with multiple partitions (answer to
this in second question below)
- entities on the part boundary must be duplicated even if they are on
the same process
- (please feel free to add to this list since I can't think of any
others)
Some conceptual differences of this implementation:
- rather than taking entities out of a part and putting them in
another, you change their part ownership by telling them (or something
doing the repartitioning), "I'm going to want you to be in this other
part later". Then after you've done that for all the entities (in a
consistent way), you repartition the mesh. The nice thing about this
is that there is never a point in time (from the user perspective)
that the mesh and the parts are inconsistent in any way.
For this kind of implementation, allowing a situation where a mesh
entity is not in a part is equivalent to it not being in a mesh. While
one could certainly have implementations where that is allowed, in our
implementation - which I think is consistent with the intents of iMesh
- the mesh owns the mesh entities (in the OO sense - if the mesh is
deleted it takes all of the mesh entities with it).
As was mentioned in the paragraph I deleted below, when we have
multiple parts per process, we have multiple meshes per process one
per part. We can certainly make those look like a single
iMesh_instance through the interface. In reality we could also have an
additional hidden mesh that was the home for any mesh entities that
aren't on a partition. The downsides to that are a) it's relatively
expensive to move entities from one mesh to another for us (you have
to copy it and delete the old one - which really gets messy when
something off-process might be referring to it), b) there are rules
that don't allow an entity to attach to lower order entities in a
different mesh (for very good reasons).
This isn't an answer to "the first big question" but is a explanation
of why it's a problem for some implementations.
>
> The second big question: How should we enable multiple partitions
> of a
> single mesh in iMeshP?
My understanding from what's been discussed on this mailing list is
that it's expected that different partitions don't have any
correlation to each other (in other words, it's the rare exception
that two different partitions will result in entities being on the
same process in both). If you don't agree with that, then, again, my
conclusions based on that are invalid.
If partitions are not correlated then any entity in more than one
partition must effectively be copied for each additional partition
they are in. The only way for an entity to exist on more than one
process is for there to be more than one copy of it (if someone has
cases where there are multiple partitions but they don't actually need
to know any information about the entities in one - other than that
they are in it - that would be a counter example to this).
Given this then a second (or nth) partition is really just a partition
of a copy of a mesh (or a subset of entities in the mesh). So why try
really hard to hide that fact?
I've heard Mark S. say that there is a need for another mechanism for
dividing up a mesh (I'm purposely avoiding the word partitioning here)
on these currently mythical computers that will exist in 10 years.
It's going to be scary if there are meshes, partitions and parts, and,
umm, divisions and divs ...
> The third question: Should iMeshP_destroyPart should return an
> error if the
> part to be destroyed is not empty?
> The answer to this question depends, to some extent, on our answer
> to the
> first big question above.
> Cons: Requires users to explicitly remove entities from parts before
> deleting the parts. This operation requires three function
> calls: iMeshP_getEntities, iMesh_rmvEntFromSet (overloaded with
> part handle), iMeshP_destroyPart.
> Pros: Prevents users from shooting themselves in the foot.
> Users would possibly call iMeshP_getEntities and
> iMesh_rmvEntFromSet anyway to do migration to new part.
This becomes a moot point in my world...
mark
More information about the itaps-parallel
mailing list