itaps-parallel Proposal for handling queries with parts, sets, and partitions

Vitus Leung vjleung at sandia.gov
Tue Dec 18 13:13:05 CST 2007


On Tue, 2007-12-18 at 10:39 -0600, Tim Tautges wrote:
> As usual, I picked the wrong telecon to miss.  There should be some rule 
> about not allowing major interface change proposals coming out on 
> Thursday after COB (in the midwest) and essentially ratifying those 
> changes Monday morning.  But anyway...
> 
> Carl Ollivier-Gooch wrote:
> > Hello, all.
> > 
> > During our last telecon, I had what I thought was an idea that would 
> > unify the parallel query for sets stuff.  At the time, the idea was 
> > vaguely formed, and I hadn't thought through all of the consequences.  I 
> > may still not have, but I've at least got it to the point of being ready 
> > to drag it out into the light of day.
> > 
> > Essentially, the issue is that we want to have much the same set of 
> > queries for mesh instances, parts, and partitions, but we haven't worked 
> > out how to handle this without exploding the number of functions.
> > 
> > In the serial interface, we have lots of queries that take both a mesh 
> > instance and an entity set argument.  In the now more-or-less deprecated 
> > SIDL paradigm, the mesh instance in an object (in the C++ sense), and we
> > unified global and entity set calls by creating a root set that is,
> > essentially, shorthand for "everything in the mesh instance".
> 
> I think the above is a very useful thing to keep in mind.  The two 
> things that change when you go from there to parallel is that a) mesh 
> instances together form a collection that in some way describes a global 
> mesh, and b) some sets can be thought of as spanning processors, but 
> only implicitly (that is, we don't assume the handles are the same).
> 
> > 
> > In parallel, the mesh instance resides at the process level in a
> > partition / process / part heirarchy (black / red, green in the attached
> > picture; yes, it's a very obvious illustration, but perhaps useful for
> > reference) .  We also want to be able to query partitions and parts
> > (although for partitions we only want to query for numbers of things,
> > not lists of things).  Also, we'd like to able to query sets other than
> > the root set (like that lovely blue set that spans a bunch of parts...).
> > 
> 
> I think it's the other way around: the part/partition resides in the 
> mesh instance.  In parallel, there's an implicit relation between a 
> partition on one processor and on another processor, such that both/all 
> processors understand that their local partition information is a piece 
> of a collection over all processors.  This model reduces to the trivial 
> case for a single processor, both for partition(s) in mesh instances and 
> parts in partitions.
>

I thought that the mesh instance for a processor is what resides on that
processor alone.  This would make it impossible for a mesh instance to
contain a partition.

> > I propose that we think about both parts and mesh instances as coverings 
> > of the global mesh (they are), and that we also think about parts, mesh
> > instances, and the partition as containing -all- data about some 
> > (topologically and/or geometrically compact subset) or all of the global 
> > mesh (as opposed to entity sets, which are deliberately more selective). 
> >  Yes, I know they're all collections of entities, but stick with me 
> > while I justify why I think this semantic distinction is worthwhile. 
> > Also yes, we haven't decided yet (have we?) whether a part will 
> > officially contain everything or just the entities that were 
> > partitioned; I don't -think- that any of what I'm about to propose is 
> > adversely affected, either way.
> > 
> 
> I don't think the partition can be a covering of the whole mesh on a 
> given processor.  Given a collection of 2d and 3d elements, you need to 
> distinguish between the 2d elements that are just adjacent to objects in 
> the partition and the 2d elements which are in fact objects in the 
> partition.
> 
> I did not see anything following which justifies the semantic 
> distinction you're talking about.
> 
> > Finally, it's worth noting that, while a partition contains many parts
> > distributed over many processes, each process is associated with a
> > unique partition (MPI communicator or equivalent) and each part is
> > associated both with a unique process and a unique partition.  So
> > specifying both part handle and partition handle is actually redundant.
> > 
> 
> Each part is associated with a unique partition and process, but each 
> process is not associated with a unique partition.  There may be 
> multiple partitions in use at any given time, and a given process may be 
> responsible for one or more parts in each partition.  Take parallel 
> contact detection for instance.  One partition is over volume elements, 
> the other is over faces on the skin of those elements.  Processors 
> participate in calculations for both partitions at different times.
> 
> Specifying both a part and partition handle may not be strictly 
> redundant, and in terms of implementation I don't think it's useful to 
> to require that the partition be derivable from the part handle.  I do 
> think that in most cases, an application will know the partition that's 
> being dealt with.  For the few cases where a part is a member of 
> multiple partitions (if we want to allow that, and I don't see a major 
> reason why not to), there should be a function to get the partition(s) 
> that a part is a member of.
> 
> > Given that backgroun, I propose that we overload our current query
> > functions so that any place where a mesh instance is currently usable, a
> > part handle or partition handle is also usable, and continue to use
> > either a bona fide entity set or the (global placeholder) root set as
> > the second argument.  In this scenario, we would have, for instance:
> > 
> >             / partition handle
> > getNumOfType| mesh instance    , root set handle   , type, result, err )
> >             \ part handle        entity set handle
> > 
> > The other iMesh function that is obviously of this type is getNumOfTopo.
> > 
> > A somewhat larger collection of functions would be able to take both
> > mesh instances and part handles as the first argument, but not partition
> > handles: getAllVtxCoords, getVtxCoordIndex, getEntities.
> > 
> > My guess is that iterator functions will fall into the second category.
> > 
> > Many of the set queries (number of sets, number of children, identities 
> > of sets and children) are a bit more ambiguous here, to my surprise: 
> > essentially, if you ask for the number of sets contained in a given set 
> > for a particular part, you presumably mean the number of contained sets 
> > that intersect that part.  While I don't have a problem with that 
> > definition, I'm not sure it's an entirely straightforward one, either 
> > conceptually or in implementation.  But I haven't thought about it in a 
> > great deal of detail, either...  One way to finesse this would be to 
> > create sets at the part level rather than the mesh instance level; then 
> > all is easy again.
> > 
> 
> So again, I go back to asking: what are the core needs that prevent us 
> from using sets as both parts and partitions?  The entity set mechanism 
> was designed with this specific usage in mind.
> 
> I know some haven't fully implemented sets, but is that going to be more 
> difficult than the degree of interface changes being discussed here?
> 
> The things that are missing in sets for use as partitions and parts are 
> exactly the extensions we'll already need in sets for going to parallel, 
> no matter what we choose for partition and part representation. 
> Specifically, we'll need some notion of a correspondence between sets on 
> different processors, to handle boundary conditions on mesh spanning 
> processors.
> 
> I'll make a diagram equivalent to Carl's today, maybe that will make 
> things a bit clearer.
> 
> - tim
> 
> > Now, there are a couple of beneath-the-hood requirements for
> > implementations here:
> > 
> > 1.  All part handles must be unique, even in the presence of multiple
> >     partitions.  Pointer-type handles will easily satisfy this;
> >     integer-type handles may need to reserve some bits for partition ID
> >     and some for part ID.
> > 
> > 2.  In most (all?) implementations, finding the result for calls with
> >     (part handle, entity set handle...) will require an implementation
> >     to do some sort of intersection internally.  This will prove
> >     especially challenging for iterator in the presence of mesh
> >     modification and/or migration.
> > 
> > I recognize also that this paradigm shift potentially ambiguates the use
> > of calls like addEntToSet for adding entities to a part; we can either
> > overload those functions (probably renamed to addEntToCollection) or
> > create new addEntToPart functions (I think there are only going to be
> > four of these: add/rmv single/array).
> > 
> > Okay, so there's my proposal.  I'll now stand back and let people poke
> > holes in the idea; that may not prove to be too difficult.
> > 
> > Carl
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> 





More information about the itaps-parallel mailing list