> 2. 7. 2018 v 15:05, Matthew Knepley <knep...@gmail.com>: > > On Mon, Jul 2, 2018 at 7:54 AM Vaclav Hapla <vaclav.ha...@erdw.ethz.ch > <mailto:vaclav.ha...@erdw.ethz.ch>> wrote: > > >> 2. 7. 2018 v 14:48, Matthew Knepley <knep...@gmail.com >> <mailto:knep...@gmail.com>>: >> >> On Mon, Jul 2, 2018 at 3:48 AM Vaclav Hapla <vaclav.ha...@erdw.ethz.ch >> <mailto:vaclav.ha...@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.
I'm not sure I understand. Do you mean registering and pushing/popping these stages in the user's code? You can surely call PetscStageLogRegister somewhere after PetscInitialize, but where do you place your PetscStageLogPush/Pop calls? Thanks Vaclav > > 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. <bsm...@mcs.anl.gov >>> <mailto:bsm...@mcs.anl.gov>>: >>> >>> >>> >>>> On Jun 29, 2018, at 9:33 AM, Vaclav Hapla <vaclav.ha...@erdw.ethz.ch >>>> <mailto:vaclav.ha...@erdw.ethz.ch>> wrote: >>>> >>>> >>>> >>>>> 22. 6. 2018 v 17:47, Smith, Barry F. <bsm...@mcs.anl.gov >>>>> <mailto:bsm...@mcs.anl.gov>>: >>>>> >>>>> >>>>> >>>>>> On Jun 22, 2018, at 5:43 AM, Pierre Jolivet <pierre.joli...@enseeiht.fr >>>>>> <mailto:pierre.joli...@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/>