@@ -94,15 +94,25 @@ def __init__(self, **kwargs):
9494 self .writefile_scorep_binding_args = []
9595 self .writefile_multicell = False
9696
97+ # Score-P
9798 self .scorep_available_ = shutil .which ("scorep" )
9899 self .scorep_python_available_ = True
99100 try :
100101 importlib .import_module ("scorep" )
101102 except ModuleNotFoundError :
102103 self .scorep_python_available_ = False
103- self .launch_vampir_requested = False
104- logging .config .dictConfig (LOGGING )
104+
105+ # Traces
106+ self .visualize_traces_requested = False
107+ self .trace_viewer = "default"
108+ self .trace_viewers = {
109+ "default" ,
110+ "vampir"
111+ }
112+
113+ # Logging
105114 self .log = logging .getLogger ("kernel" )
115+ logging .config .dictConfig (LOGGING )
106116
107117 def cell_output (self , string , stream = "stdout" ):
108118 """
@@ -637,8 +647,8 @@ async def scorep_execute(
637647 self .pershelper .postprocess ()
638648
639649 # Optional Vampir launch
640- if self .launch_vampir_requested and scorep_folder :
641- self .try_launch_vampir (scorep_folder )
650+ if self .visualize_traces_requested and scorep_folder :
651+ self ._view_scorep_traces (scorep_folder , self . trace_viewer )
642652
643653 return self .standard_reply ()
644654
@@ -790,7 +800,7 @@ def handle_captured_output(self, output: List[str], stream: str):
790800 else :
791801 self .log .error (f"Undefined stream type: { stream } " )
792802
793- def try_launch_vampir (self , scorep_folder : str ):
803+ def _view_scorep_traces (self , scorep_folder : str , viewer = "default" ):
794804 """
795805 Attempts to find traces.otf2 and launch Vampir on it.
796806 Errors are logged using log_error().
@@ -808,6 +818,22 @@ def try_launch_vampir(self, scorep_folder: str):
808818 )
809819 return
810820
821+ if viewer not in self .trace_viewers :
822+ self .log_error (
823+ KernelErrorCode .UNSUPPORTED_VIEWER ,
824+ scorep_folder = scorep_folder ,
825+ viewer = viewer ,
826+ supported_viewers = "default, vampir" ,
827+ )
828+ return
829+
830+ if viewer == "default" :
831+ self ._default_view_traces (trace_path )
832+ elif viewer == "vampir" :
833+ self ._try_launch_vampir (trace_path )
834+
835+
836+ def _try_launch_vampir (self , trace_path : str ):
811837 if shutil .which ("vampir" ) is None :
812838 self .log_error (KernelErrorCode .VAMPIR_NOT_FOUND )
813839 return
@@ -822,6 +848,9 @@ def try_launch_vampir(self, scorep_folder: str):
822848 exception = str (e ),
823849 )
824850
851+ def _default_view_traces (self , trace_path : str ):
852+ print ('Default viewer launched' )
853+
825854 async def do_execute (
826855 self ,
827856 code ,
@@ -898,17 +927,35 @@ async def do_execute(
898927 elif code .startswith ("%%end_writefile" ):
899928 return self .scorep_not_available () or self .end_writefile ()
900929
901- elif code .startswith ("%%enable_vampir_launch_on_scorep_instrumented" ):
902- self .launch_vampir_requested = True
903- if shutil .which ("vampir" ) is None :
904- self .log_error (KernelErrorCode .VAMPIR_NOT_FOUND )
930+ elif code .startswith ("%%enable_scorep_trace_viewer" ):
931+ # Enable Score-P trace viewer, with optional argument: 'vampir'
932+ self .visualize_traces_requested = True
933+ first_line = code .split ("\n " , 1 )[0 ].strip ()
934+ parts = first_line .split ()
935+ requested_viewer = parts [1 ].lower () if len (parts ) > 1 else "default"
936+
937+ if requested_viewer not in self .trace_viewers :
938+ self .log_error (
939+ KernelErrorCode .UNSUPPORTED_VIEWER ,
940+ viewer = requested_viewer ,
941+ supported_viewers = ", " .join (self .trace_viewers ),
942+ )
943+ self .trace_viewer = "default"
905944 else :
906- self .cell_output ("Vampir will be launched after next "
907- "instrumented execution." )
945+ if requested_viewer == "vampir" and shutil .which ("vampir" ) is None :
946+ self .log_error (KernelErrorCode .VAMPIR_NOT_FOUND )
947+ # Fallback to default viewer
948+ self .trace_viewer = "default"
949+ else :
950+ self .trace_viewer = requested_viewer
951+
952+ self .cell_output (
953+ f"Score-P trace viewer set to: { self .trace_viewer } "
954+ )
908955 return self .standard_reply ()
909- elif code .startswith ("%%disable_vampir_launch " ):
910- self .launch_vampir_requested = False
911- self .cell_output ("Vampir launching disabled." )
956+ elif code .startswith ("%%disable_scorep_trace_viewer " ):
957+ self .visualize_traces_requested = False
958+ self .cell_output ("Score-P trace viewer disabled." )
912959 return self .standard_reply ()
913960 elif code .startswith ("%%execute_with_scorep" ):
914961 scorep_missing = self .scorep_not_available ()
0 commit comments