Skip to content

Commit b5dafcf

Browse files
committed
kernel multiple trace viewers logic, calls and description
1 parent 8a2bcde commit b5dafcf

4 files changed

Lines changed: 67 additions & 16 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,14 @@ Executes a cell with Score-P, i.e. it calls `python -m scorep <cell code>`
137137
To automatically launch **Vampir** after a cell with Score-P instrumentation, use:
138138

139139
```
140-
%%enable_vampir_launch_on_scorep_instrumented
140+
%%enable_scorep_trace_viewer
141141
```
142142

143143
This will cause the kernel to open `traces.otf2` in Vampir (if found) after the next instrumented cell.
144144
To disable this behavior again:
145145

146146
```
147-
%%disable_vampir_launch
147+
%%disable_scorep_trace_viewer
148148
```
149149

150150
By default, Vampir launching is disabled. You must enable it explicitly when needed.

src/scorep_jupyter/kernel.py

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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()

src/scorep_jupyter/kernel_messages.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class KernelErrorCode(Enum):
1313
SCOREP_PYTHON_NOT_AVAILABLE = auto()
1414
VAMPIR_NOT_FOUND = auto()
1515
VAMPIR_LAUNCH_FAILED = auto()
16+
UNSUPPORTED_VIEWER = auto()
1617

1718

1819
KERNEL_ERROR_MESSAGES = {
@@ -43,6 +44,9 @@ class KernelErrorCode(Enum):
4344
"Instrumentation output directory not found or missing traces.otf2 "
4445
"(looked in: {scorep_folder})"
4546
),
47+
KernelErrorCode.UNSUPPORTED_VIEWER: (
48+
"Unsupported viewer '{viewer}'. Supported viewers: {supported_viewers}."
49+
),
4650
KernelErrorCode.VAMPIR_NOT_FOUND: (
4751
'Vampir binary not found in PATH. Add it to PATH to enable '
4852
'automatic launch'

src/scorep_jupyter/trace_viewer.py

Whitespace-only changes.

0 commit comments

Comments
 (0)