[petsc-dev] DMPLEX with VecGhost
Matthew Knepley
knepley at gmail.com
Thu Oct 28 09:45:16 CDT 2021
On Thu, Oct 28, 2021 at 10:37 AM 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?
>
Yes, it could. I was thinking this as I wrote you, and also thinking how
tired I am :)
Here is how to do it. Suppose you only care about ghost points (Firedrake
wants three layers: totalling internal, roots, and ghosts), then there is a
simple test
DMGetLocalSection(dm, &s)
PetscSectionGetChart(s, &pStart, &pEnd);
DMGetPointSF(dm, &sf);
PetscSFGetGraph(sf, NULL, &nleaves, &leaves, NULL)
for (p = pStart; p < pEnd; ++p) {
PetscFindInt(p, nleaves, leaves, &loc);
if (loc >= 0) {I am a ghost point}
}
If you also care about roots (shared points that you own), you also need
PetscSFComputeDegreeBegin(sf, &rootdegree);
PetscSFComputeDegreeEnd(sf, &rootdegree);
and then also check
rootdegree[p] > 0
If you get it working, I will put it inside Plex and make an option to turn
it on.
Thanks,
Matt
> Does this make sense?
>
> Thanks,
>
> Matt
>
>
>> Barry
>>
> --
> 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/>
>
>
>
--
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/6a2d3abb/attachment.html>
More information about the petsc-dev
mailing list