From 9539ba2a781f2a97ae328f62bd0e9d4d0df89336 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk <21087696+oleksandr-pavlyk@users.noreply.github.com> Date: Tue, 2 Jun 2026 16:21:39 -0500 Subject: [PATCH] Add "nv/cold/sm_clock_rate/mean" to GPU time summary data Its intent is to be cheaply retrievable metric of average SM clock frequence over entire sample --- python/scripts/nvbench_compare.py | 3 +++ python/test/test_nvbench_compare.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/python/scripts/nvbench_compare.py b/python/scripts/nvbench_compare.py index 276643d..3a80d24 100644 --- a/python/scripts/nvbench_compare.py +++ b/python/scripts/nvbench_compare.py @@ -40,6 +40,7 @@ GPU_TIME_STDEV_RELATIVE_TAG = "nv/cold/time/gpu/stdev/relative" GPU_TIME_MEDIAN_TAG = "nv/cold/time/gpu/median" GPU_TIME_IR_TAG = "nv/cold/time/gpu/ir/absolute" GPU_TIME_IR_RELATIVE_TAG = "nv/cold/time/gpu/ir/relative" +GPU_SM_CLOCK_RATE_MEAN_TAG = "nv/cold/sm_clock_rate/mean" SAMPLE_TIMES_TAG = "nv/json/bin:nv/cold/sample_times" SAMPLE_FREQUENCIES_TAG = "nv/json/freqs-bin:nv/cold/sample_freqs" @@ -81,6 +82,7 @@ class GpuTimingData: median: float | None interquartile_range: float | None interquartile_range_relative: float | None + sm_clock_rate_mean: float | None = None sample_source: Float32BinarySource | None = None frequency_source: Float32BinarySource | None = None @@ -466,6 +468,7 @@ def extract_gpu_timing_data(summaries, json_dir=None, float32_reader=read_float3 interquartile_range_relative=extract_summary_float( summaries, GPU_TIME_IR_RELATIVE_TAG, null_value=math.inf ), + sm_clock_rate_mean=extract_summary_float(summaries, GPU_SM_CLOCK_RATE_MEAN_TAG), sample_source=sample_source, frequency_source=frequency_source, ) diff --git a/python/test/test_nvbench_compare.py b/python/test/test_nvbench_compare.py index b9cb478..be20141 100644 --- a/python/test/test_nvbench_compare.py +++ b/python/test/test_nvbench_compare.py @@ -119,6 +119,7 @@ def make_gpu_timing_data( median=None, interquartile_range=None, interquartile_range_relative=None, + sm_clock_rate_mean=None, ): return nvbench_compare.GpuTimingData( minimum=None, @@ -129,6 +130,7 @@ def make_gpu_timing_data( median=median, interquartile_range=interquartile_range, interquartile_range_relative=interquartile_range_relative, + sm_clock_rate_mean=sm_clock_rate_mean, ) @@ -385,6 +387,18 @@ def test_gpu_timing_data_loads_samples_and_frequencies_lazily( assert reader_calls == [str(samples_file), str(freqs_file)] +def test_gpu_timing_data_parses_sm_clock_rate_mean(nvbench_compare): + timing = nvbench_compare.extract_gpu_timing_data( + [ + make_summary(nvbench_compare, "GPU_TIME_MEAN_TAG", "2.0"), + make_summary(nvbench_compare, "GPU_SM_CLOCK_RATE_MEAN_TAG", "1.5e9"), + ], + ) + + assert timing.sm_clock_rate_mean == pytest.approx(1.5e9) + assert timing.frequencies is None + + def test_gpu_timing_data_treats_mismatched_sample_and_frequency_counts_as_unavailable( tmp_path, nvbench_compare ):