1717from devito .parameters import configuration
1818from devito .symbolics import subs_op_args
1919from devito .tools import DefaultOrderedDict , flatten
20+ from devito .petsc .logging import PetscSummary
2021
2122__all__ = ['create_profile' ]
2223
@@ -42,7 +43,7 @@ class Profiler:
4243
4344 _attempted_init = False
4445
45- def __init__ (self , name ):
46+ def __init__ (self , name , language ):
4647 self .name = name
4748
4849 # Operation reductions observed in sections
@@ -55,6 +56,9 @@ def __init__(self, name):
5556 # Python-level timers
5657 self .py_timers = OrderedDict ()
5758
59+ # For language specific summaries
60+ self .language = language
61+
5862 self ._attempted_init = True
5963
6064 def analyze (self , iet ):
@@ -179,7 +183,7 @@ def record_ops_variation(self, initial, final):
179183 def all_sections (self ):
180184 return list (self ._sections ) + flatten (self ._subsections .values ())
181185
182- def summary (self , args , dtype , reduce_over = None ):
186+ def summary (self , args , dtype , params , reduce_over = None ):
183187 """
184188 Return a PerformanceSummary of the profiled sections.
185189
@@ -277,7 +281,7 @@ def _allgather_from_comm(self, comm, time, ops, points, traffic, sops, itershape
277281 return list (zip (times , opss , pointss , traffics , sops , itershapess ))
278282
279283 # Override basic summary so that arguments other than runtime are computed.
280- def summary (self , args , dtype , reduce_over = None ):
284+ def summary (self , args , dtype , params , reduce_over = None ):
281285 grid = args .grid
282286 comm = args .comm
283287
@@ -338,6 +342,11 @@ def summary(self, args, dtype, reduce_over=None):
338342 # data transfers)
339343 summary .add_glb_fdlike ('fdlike-nosetup' , points , reduce_over_nosetup )
340344
345+ # Add the language specific summary if necessary
346+ mapper_func = language_summary_mapper .get (self .language )
347+ if mapper_func :
348+ summary .add_language_summary (self .language , mapper_func (params ))
349+
341350 return summary
342351
343352
@@ -366,11 +375,11 @@ class AdvisorProfiler(AdvancedProfiler):
366375 _default_libs = ['ittnotify' ]
367376 _ext_calls = [_api_resume , _api_pause ]
368377
369- def __init__ (self , name ):
378+ def __init__ (self , name , language ):
370379 if self ._attempted_init :
371380 return
372381
373- super ().__init__ (name )
382+ super ().__init__ (name , language )
374383
375384 path = get_advisor_path ()
376385 if path :
@@ -478,6 +487,16 @@ def add_glb_fdlike(self, key, points, time):
478487
479488 self .globals [key ] = PerfEntry (time , None , gpointss , None , None , None )
480489
490+ def add_language_summary (self , lang , summary ):
491+ """
492+ Register a language specific summary (e.g., PetscSummary)
493+ and dynamically add a property to access it via perf_summary.<language_name>.
494+ """
495+ # TODO: Consider renaming `PerformanceSummary` to something more generic
496+ # (e.g., `Summary`), or separating `PetscSummary` entirely from
497+ # `PerformanceSummary`.
498+ setattr (self , lang , summary )
499+
481500 @property
482501 def globals_all (self ):
483502 v0 = self .globals ['vanilla' ]
@@ -503,21 +522,21 @@ def timings(self):
503522 return OrderedDict ([(k , v .time ) for k , v in self .items ()])
504523
505524
506- def create_profile (name ):
525+ def create_profile (name , language ):
507526 """Create a new Profiler."""
508527 if configuration ['log-level' ] in ['DEBUG' , 'PERF' ] and \
509528 configuration ['profiling' ] == 'basic' :
510529 # Enforce performance profiling in DEBUG mode
511530 level = 'advanced'
512531 else :
513532 level = configuration ['profiling' ]
514- profiler = profiler_registry [level ](name )
533+ profiler = profiler_registry [level ](name , language )
515534
516535 if profiler ._attempted_init :
517536 return profiler
518537 else :
519538 warning (f"Couldn't set up `{ level } ` profiler; reverting to 'advanced'" )
520- profiler = profiler_registry ['advanced' ](name )
539+ profiler = profiler_registry ['advanced' ](name , language )
521540 # We expect the `advanced` profiler to always initialize successfully
522541 assert profiler ._attempted_init
523542 return profiler
@@ -533,3 +552,8 @@ def create_profile(name):
533552 'advisor' : AdvisorProfiler
534553}
535554"""Profiling levels."""
555+
556+
557+ language_summary_mapper = {
558+ 'petsc' : PetscSummary
559+ }
0 commit comments