[petsc-dev] Expensive VecDuplicate_MPI_DA
Smith, Barry F.
bsmith at mcs.anl.gov
Tue Jun 19 22:58:18 CDT 2018
Ahh yes. Since the layout can get large we wanted to avoid each vector having its own copy.
But it seems sloppy since DMCreateGlobalVector_DA() does keep a new copy for each vector.
We could revisit the entire VecDuplicate/DMCreateGlobalVector() infrastructure for all the vector types including the DM ones to
1) prevent collective calls
2) reference the layout instead of making new ones.
Barry
It looks like VecDuplicate_MPI() does the right thing.
> On Jun 19, 2018, at 10:35 PM, Jed Brown <jed at jedbrown.org> wrote:
>
> "Smith, Barry F." <bsmith at mcs.anl.gov> writes:
>
>> Jed,
>>
>> You added these two lines. Any idea why they are needed?
>
> That was just replacing the old interface
>
> https://bitbucket.org/petsc/petsc/commits/077aedaf8cb5b060ad5dab7a12035daf9d64dd75#Lsrc/dm/impls/da/dadist.cF19
>
> that you added here
>
> https://bitbucket.org/petsc/petsc/commits/5ead1ec26b293130cbc6f8fa84f0a9ffce38a0bf
>
>> Thanks
>>
>> Barry
>>
>> 3e08d2bebf99 src/dm/impls/da/dadist.c (Barry Smith 2012-09-18 14) PetscFunctionBegin;
>> c688c0463f6c src/dm/impls/da/dadist.c (Matthew Knepley 2012-11-11 15) ierr = VecGetDM(g, &da);CHKERRQ(ierr);
>> 2dcb2ebcaafe src/dm/impls/da/dadist.c (Barry Smith 2010-10-31 16) ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr);
>> 077aedaf8cb5 src/dm/impls/da/dadist.c (Jed Brown 2013-02-11 17) ierr = VecGetLayout(g,&map);CHKERRQ(ierr);
>> 077aedaf8cb5 src/dm/impls/da/dadist.c (Jed Brown 2013-02-11 18) ierr = VecSetLayout(*gg,map);CHKERRQ(ierr);
>> 2dcb2ebcaafe src/dm/impls/da/dadist.c (Barry Smith 2010-10-31 19) PetscFunctionReturn(0)
>>
>>
>> If we were a bit more clever we could probably avoid all communication in VecDuplicate() but is it worth bothering unless we know it is problematic
>>
>>> On Jun 19, 2018, at 4:30 PM, Junchao Zhang <jczhang at mcs.anl.gov> wrote:
>>>
>>> I met an expensive VecDuplicate. See the attached call stack. VecDuplicate_MPI_DA indirectly calls MPI_Allreduce/Allgather to build the vector's layout, but it then immediately destroys it with VecGetLayout & VecSetLayout. Is it wrong?
>>> src/dm/impls/da/dadist.c
>>> PetscErrorCode VecDuplicate_MPI_DA(Vec g,Vec *gg)
>>> {
>>> PetscErrorCode ierr;
>>> DM da;
>>> PetscLayout map;
>>>
>>> PetscFunctionBegin;
>>> ierr = VecGetDM(g, &da);CHKERRQ(ierr);
>>> ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr);
>>> ierr = VecGetLayout(g,&map);CHKERRQ(ierr);
>>> ierr = VecSetLayout(*gg,map);CHKERRQ(ierr);
>>> PetscFunctionReturn(0);
>>> }
>>>
>>> --Junchao Zhang
>>> <VecDup.png>
More information about the petsc-dev
mailing list