diff --git a/src/sol_execbench/core/bench/cupti_utils.py b/src/sol_execbench/core/bench/cupti_utils.py index a8852452..169ecd27 100644 --- a/src/sol_execbench/core/bench/cupti_utils.py +++ b/src/sol_execbench/core/bench/cupti_utils.py @@ -129,6 +129,8 @@ def _relative_order_score(candidate_names: list[str], expected_names: list[str]) def _kernel_activity_span(kernels: list[CuptiKernelInfo]) -> float: + if not kernels: + raise ValueError("kernels must contain at least one CUPTI activity") return max(kernel.end for kernel in kernels) - min( kernel.start for kernel in kernels ) diff --git a/tests/core/bench/test_cupti_utils.py b/tests/core/bench/test_cupti_utils.py new file mode 100644 index 00000000..592e79a5 --- /dev/null +++ b/tests/core/bench/test_cupti_utils.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for CUPTI utility helpers.""" + +import unittest + +from cupti import cupti +from sol_execbench.core.bench.cupti_utils import CuptiKernelInfo, _kernel_activity_span + + +class KernelActivitySpanTests(unittest.TestCase): + def _make_kernel(self, name, start, end): + return CuptiKernelInfo( + name=name, + start=start, + end=end, + correlation_id=0, + copy_kind=0, + bytes=0, + value=0, + kind=cupti.ActivityKind.CONCURRENT_KERNEL, + _activity=None, + ) + + def test_empty_list_raises(self): + with self.assertRaisesRegex( + ValueError, "kernels must contain at least one CUPTI activity" + ): + _kernel_activity_span([]) + + def test_span_from_window(self): + kernels = [ + self._make_kernel("a", start=1.0, end=3.0), + self._make_kernel("b", start=2.0, end=5.0), + ] + self.assertAlmostEqual(_kernel_activity_span(kernels), 4.0) + + +if __name__ == "__main__": + unittest.main()