[petsc-dev] GAMG and custom MatMults in smoothers

Matthew Knepley knepley at gmail.com
Mon Jul 2 08:05:49 CDT 2018


On Mon, Jul 2, 2018 at 7:54 AM Vaclav Hapla <vaclav.hapla at erdw.ethz.ch>
wrote:

>
>
> 2. 7. 2018 v 14:48, Matthew Knepley <knepley at gmail.com>:
>
> On Mon, Jul 2, 2018 at 3:48 AM Vaclav Hapla <vaclav.hapla at erdw.ethz.ch>
> wrote:
>
>> Barry wrote:
>>
>>   This could get ugly real fast, for example, for vector operations,
>> there may be dozens of named vectors and each one gets its own logging?
>> You'd have to make sure that only the objects you care about get named, is
>> that possible?
>>
>>    I don't know if there is a good solution within the PETSc logging
>> infrastructure to get what you want but maybe what you propose is the best
>> possible.
>>
>>
>> As I suggest, this behavior would be only triggered by a specific option.
>>
>> I think there are actually 4 strings which could be used as an event name
>> suffix in log view:
>> 1) name
>> 2) prefix
>> 3) type
>> 4) custom string (set by something like PetscObjectSetLogViewSuffix)
>> I think the best would be to let user choose by offering
>> -log_view_by_{name,prefix,type,suffix}.
>>
>> For example, with -log_view_by_prefix, you could readily distinguish
>> PCTelescope outer and inner apply, because you would see a separate
>> "PCApply (telescope_)" event.
>> With -log_view_by_type, you would see PCApply (telescope).
>>
>> I think this would be useful because the current class-wide events like
>> MatMult or PCApply aggregate very different operations from which some are
>> for free and some form hotspots.
>>
>>
>> Stefano wrote:
>>
>> The issue with this sort of “dynamic” logging is that now PETSc requires
>> PetscLogEvent created during the registration of the class, so that all the
>> ranks in PETSC_COMM_WORLD have the same events registered.
>> What you propose is not generally supported for this specific reason.
>>
>> Your “log_name” may work if users register their own classes (with their
>> own LogEvents created properly), and currently we don’t have support (maybe
>> I’m wrong) to add an “InitializePackage” method for the users’ registered
>> classes.
>>
>>
>> I don't agree. What I suggest is basically an ability to allow
>> automatically created object-wise events, so it _can't_ be managed during
>> the class registration. In presence of respective option, the event would
>> be created during PetscLogEventBegin by taking the class-wide event's name,
>> concatenating the suffix and registering a new event. The event id would be
>> stored in the PetscObject structure.
>>
>>
>> Matt wrote:
>>
>> As people have pointed out, this would not work well for Events. However,
>> this is exactly what stages are for.
>> Use separate stages for the different types of MatMult. I did this, for
>> example, when looking at performance
>> on different MG levels.
>>
>>
>> Yes, performance on different MG levels is a nice use case. I don't
>> understand how you inject stages into MatMults. To me it's exactly the same
>> problem as with events - you have to define MatMult_custom where you take
>> the original mult and wrap into PetscStageLogPush/Pop and then use
>> MatSetOperation to redefine MatMult. Or do you mean something more elegant?
>>
>
> You could do that, but usually I think of stages as being structural. I
> think for your example I would push/pop the stage
> inside your Mat operation wrapper (I don't see why you need another one),
> and this behavior could be controlled with
> another option so you could turn it off.
>
>
> I meant hierarchies of typically Mats or PCs, where you don't define any
> custom operations but compose together existing types (which should be
> promoted I believe). So no "my" wrapper. As I wrote below:
>
>  Think e.g. of having additive MATCOMPOSITE wrapping multiplicative
>> MATCOMPOSITE wrapping MATTRANSPOSE wrapping MATAIJ. You want to measure
>> this MATAIJ instance's MatMult separately but you surely don't want to
>> rewrite implementation of MatMult_Transpose or force yourself to use
>> MATSHELL just to hang the events on MatMult*.
>>
>>
Its not enough to make separate stages for additive MC, multiplicative MC,
and MT? If you want stages for every single
combination created dynamically, you can push another stage when each of
these combinations is created using GetTag()
or something like that. You could switch between these behaviors with an
option.

The reason I think this is preferable is that we do not mess with any
logging infrastructure, we just use stages inside of other objects.

  Thanks,

     Matt


> Thanks
>
> Vaclav
>
>
>
>   Matt
>
>
>> Thanks
>>
>> Vaclav
>>
>>
>>
>> 29. 6. 2018 v 22:42, Smith, Barry F. <bsmith at mcs.anl.gov>:
>>
>>
>>
>> On Jun 29, 2018, at 9:33 AM, Vaclav Hapla <vaclav.hapla at erdw.ethz.ch>
>> wrote:
>>
>>
>>
>> 22. 6. 2018 v 17:47, Smith, Barry F. <bsmith at mcs.anl.gov>:
>>
>>
>>
>> On Jun 22, 2018, at 5:43 AM, Pierre Jolivet <pierre.jolivet at enseeiht.fr>
>> wrote:
>>
>> Hello,
>> I’m solving a system using a MATSHELL and PCGAMG.
>> The MPIAIJ Mat I’m giving to GAMG has a specific structure (inherited
>> from the MATSHELL) I’d like to exploit during the solution phase when the
>> smoother on the finest level is doing MatMults.
>>
>> Is there some way to:
>> 1) decouple in -log_view the time spent in the MATSHELL MatMult and in
>> the smoothers MatMult
>>
>>
>> You can register a new event and then inside your MATSHELL MatMult() call
>> PetscLogEventBegin/End on your new event.
>>
>>  Note that the MatMult() like will still contain the time for your
>> MatShell mult so you will need to subtract it off to get the time for your
>> non-shell matmults.
>>
>>
>> In PERMON, we sometimes have quite complicated hierarchy of wrapped
>> matrices and want to measure MatMult{,Transpose,Add,TransposeAdd}
>> separately for particular ones. Think e.g. of having additive MATCOMPOSITE
>> wrapping multiplicative MATCOMPOSITE wrapping MATTRANSPOSE wrapping MATAIJ.
>> You want to measure this MATAIJ instance's MatMult separately but you
>> surely don't want to rewrite implementation of MatMult_Transpose or force
>> yourself to use MATSHELL just to hang the events on MatMult*.
>>
>> We had a special wrapper type just adding some prefix to the events for
>> the given object but this is not nice. What about adding a functionality to
>> PetscLogEventBegin/End that would distinguish based on the first
>> PetscObject's name or option prefix? Of course optionally not to break guys
>> relying on current behavior - e.g. under something like -log_view_by_name.
>> To me it's quite an elegant solution working for any PetscObject and any
>> event.
>>
>>
>>   This could get ugly real fast, for example, for vector operations,
>> there may be dozens of named vectors and each one gets its own logging?
>> You'd have to make sure that only the objects you care about get named, is
>> that possible?
>>
>>    I don't know if there is a good solution within the PETSc logging
>> infrastructure to get what you want but maybe what you propose is the best
>> possible.
>>
>>   Barry
>>
>>
>> I can do that if I get some upvotes.
>>
>> Vaclav
>>
>>
>> 2) hardwire a specific MatMult implementation for the smoother on the
>> finest level
>>
>>
>> In the latest release you do MatSetOperation() to override the normal
>> matrix vector product with anything else you want.
>>
>>
>> Thanks in advance,
>> Pierre
>>
>> PS : here is what I have right now,
>> MatMult              118 1.0 1.0740e+02 1.6 1.04e+13 1.6 1.7e+06 6.1e+05
>> 0.0e+00 47100 90 98  0 47100 90 98  0 81953703
>> […]
>> PCSetUp                2 1.0 8.6513e+00 1.0 1.01e+09 1.7 2.6e+05 4.0e+05
>> 1.8e+02  5  0 14 10 66   5  0 14 10 68 94598
>> PCApply               14 1.0 8.0373e+01 1.1 9.06e+12 1.6 1.3e+06 6.0e+05
>> 2.1e+01 45 87 72 78  8 45 87 72 78  8 95365211 // I’m guessing a lot of
>> time here is being wasted in doing inefficient MatMults on the finest level
>> but this is only speculation
>>
>> Same code with -pc_type none -ksp_max_it 13,
>> MatMult               14 1.0 1.2936e+01 1.7 1.35e+12 1.6 2.0e+05 6.1e+05
>> 0.0e+00 15100 78 93  0 15100 78 93  0 88202079
>>
>> The grid itself is rather simple (two levels, extremely aggressive
>> coarsening),
>> type is MULTIPLICATIVE, levels=2 cycles=v
>> KSP Object: (mg_coarse_) 1024 MPI processes
>> linear system matrix = precond matrix:
>>   Mat Object: 1024 MPI processes
>>     type: mpiaij
>>     rows=775, cols=775
>>     total: nonzeros=1793, allocated nonzeros=1793
>>
>> linear system matrix followed by preconditioner matrix:
>> Mat Object: 1024 MPI processes
>> type: shell
>> rows=1369307136, cols=1369307136
>> Mat Object: 1024 MPI processes
>> type: mpiaij
>> rows=1369307136, cols=1369307136
>> total: nonzeros=19896719360, allocated nonzeros=19896719360
>>
>>
>>
>
> --
> 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.caam.rice.edu/~mk51/>
>
>
>

-- 
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.caam.rice.edu/~mk51/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20180702/93010516/attachment-0001.html>


More information about the petsc-dev mailing list