> 2. 7. 2018 v 15:20, Stefano Zampini <stefano.zamp...@gmail.com>: > > > > 2018-07-02 11:48 GMT+03:00 Vaclav Hapla <vaclav.ha...@erdw.ethz.ch > <mailto:vaclav.ha...@erdw.ethz.ch>>: > 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. > > > As I said before, now PETSc event model assumes the events are created at > class registration.
I don't think there's such assumption. You can register an event where you want. There's nothing special about the class-wise events other that they are registered during *InitializePackage (which can be however called much later than PetscInitialize). They are otherwise by no means tied to that class. There are even examples which do that: http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/Profiling/PetscLogEventRegister.html <http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/Profiling/PetscLogEventRegister.html> > I'm not saying your dynamic thing cannot be done; I'm saying it will likely > deadlock I don't see why this should lead to deadlock? With current class-wise events you can already have many simultaneous instances of the same event at once. Thanks Vaclav > > > 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? > > 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 > > > > > -- > Stefano