[petsc-dev] DMPLEX with VecGhost

Matthew Knepley knepley at gmail.com
Thu Oct 28 11:36:20 CDT 2021


I agree it is.

  Matt

On Thu, Oct 28, 2021 at 11:53 AM Barry Smith <bsmith at petsc.dev> wrote:

>
>   Thanks, sounds like something DMPLEX should be automatically optionally
> doing directly.
>
> > On Oct 28, 2021, at 10:58 AM, Lawrence Mitchell <wence at gmx.li> wrote:
> >
> > Hi Barry et al.,
> >
> >> On 28 Oct 2021, at 15:37, Barry Smith <bsmith at petsc.dev> wrote:
> >>
> >>
> >>
> >>> On Oct 28, 2021, at 10:31 AM, Matthew Knepley <knepley at gmail.com>
> wrote:
> >>>
> >>> On Thu, Oct 28, 2021 at 9:37 AM Barry Smith <bsmith at petsc.dev> wrote:
> >>>
> >>>  Matt,
> >>>
> >>>    How difficult would it be to rework DMPLEX to allow the use of
> VecGhost? We have performance problems with GPUs with simple DMNETWORK
> models because the code spends more time uselessly copying the local part
> of the vector to another vector in global to local and local to global;
> more than 1/2 the time of the total simulation.
> >>>
> >>> Firedrake already does this because they "vec ghost" their vectors by
> default. Here is what you need:
> >>>
> >>>  When you create the PetscSection, by default it orders the unknowns
> according to the default point numbering. This
> >>>  is what causes the ghost unknowns to be mixed in with the local
> unknowns. However, PetscSection allows you to set
> >>>  a point permutation
> >>>
> >>>
> https://petsc.org/main/docs/manualpages/PetscSection/PetscSectionSetPermutation.html
> >>>
> >>>  This determines the order of dogs by iterating through points in this
> permutation, and you can put all shared points at the end.
> >>
> >>  How do I know what are shared points to put at the end? Couldn't
> DMPLEX do this automatically with an option? Where is the Firedrake code
> that does this with DMPLEX so I can see it?
> >
> > The DM's "point sf" indicates shared points. To label them, do something
> like:
> >
> > DMCreateLabel(dm, "ghost_points");
> > DMGetPointSF(dm, &pointsf);
> > PetscSFGetGraph(pointsf, NULL, &nleaves, &ilocal, NULL);
> > for (PetscInt p = 0; p < nleaves; p++) {
> >   DMSetLabelValue(dm, "ghost_points", p, 1);
> > }
> >
> > Then you do something like (this is more pseudo-codey):
> >
> > PetscInt *permutation;
> > DMPlexGetChart(dm, &pStart, &pEnd);
> > PetscMalloc1(pEnd - pStart, &permutation);
> > PetscInt offsets[2] = {0, pEnd - pStart - nleaves};
> > DMGetLabel(dm, &ghosts);
> > DMLabelCreateIndex(ghosts, pStart, pEnd);
> > for (PetscInt p = pStart, p < pEnd; p++) {
> >   DMLabelHasPoint(ghosts, p, &has);
> >   if (has) {
> >      // this point is ghost point
> >      permutation[offsets[1]++] = p;
> >   } else {
> >      permutation[offsets[0]++] = p;
> >   }
> > }
> > DMLabelDestroyIndex(ghosts, pStart, pEnd);
> > ISCreateGeneral(..., permutation, &isperm);
> >
> > // Now whenever your do PetscSectionCreate, do
> > PetscSectionSetPermutation(..., isperm);
> >
> > And now ghost point dofs will appear after local ones.
> >
> > Note that this is probably more complicated for multi-field setups,
> depending whether you are point major or field major.
> >
> > You can see what we actually do (if you like reading Cython) here:
> https://github.com/firedrakeproject/firedrake/blob/master/firedrake/cython/dmcommon.pyx#L1734
> >
> > It's more complicated because here we are doing some additional things:
> >
> > 1. We compute an RCM-order traversal for cells with DMPlexGetOrdering;
> > 2. Rather than ordering all plex points in the permutation, we walk the
> cells in the RCM order and then greedily number points in the transitive
> closure (so that in a section cell and vertex dofs from the same cell will
> be "close" to each other in the final Vec).
> >
> > Thanks,
> >
> > Lawrence
>
>

-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener

https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20211028/00a627a5/attachment.html>


More information about the petsc-dev mailing list