[petsc-dev] MPI Keyvalue usage in PETSc

Jed Brown jedbrown at mcs.anl.gov
Thu Jun 6 15:47:33 CDT 2013


"Teranishi, Keita" <knteran at sandia.gov> writes:

> Jed,
>
> I am curious how you use MPI Keyvalue.  Do you have any document or
> source files related to this?

It is used to manage inner/outer communicators.  The first time a PETSc
object is created on a communicator, we dup it, creating a
reference-counted inner communicator that we attach via keyval to the
outer and vice-versa.  So any time we need to create an object, we
check:

* it is an inner comm -- use it
* it is an outer comm that has an attached inner -- get out the inner and use it
* it has not been seen before -- create the inner and attach

The inner comm has a tag dispenser and a reference count.  When the
reference count goes to zero, it is detached from the outer and cleaned
up.

This is way better for library interfaces than having a wrapper class
that goes around the outside of an MPI_Comm, because with our system,
communicators can be passed back and forth between libraries easily,
without needing to re-dup or find the appropriate container.

A story: BG/Q V1R2M0 made MPI_Comm_dup use O(P) memory per rank each
time it is called.  This was a catastrophe for applications that used
MPI_Comm_dup for each object that used a communicator.  Nek had this
problem, and V1R2M0 was pushed onto Mira shortly before SIAM CSE, in
order to hit some milestone that IBM needed for business reasons.

A later efix resolved the problem, but it was still disruptive for Paul
who had a plenary to give.

You'll find the bulk of the implementation it tagm.c:

https://bitbucket.org/petsc/petsc/src/a0a914e661bf6402b8edabe0f5a2dad46323f69f/src/sys/objects/tagm.c?at=master



More information about the petsc-dev mailing list