Skip to content

Commit 4b7d11a

Browse files
authored
[CI][Benchmarks] compute benchmarks charts naming (#18558)
Improve readability of Historical Results chart titles, tooltips, and all charts' legends by introducing new Result object field: `display_name` for Compute Benchmarks
1 parent d63672b commit 4b7d11a

File tree

5 files changed

+158
-26
lines changed

5 files changed

+158
-26
lines changed

devops/scripts/benchmarks/benches/base.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ def __init__(self, directory, suite):
4545
def name(self) -> str:
4646
pass
4747

48+
def display_name(self) -> str:
49+
"""Returns a user-friendly name for display in charts.
50+
By default returns the same as name(), but can be overridden.
51+
"""
52+
return self.name()
53+
4854
@abstractmethod
4955
def setup(self):
5056
pass
@@ -145,18 +151,21 @@ def get_tags(self) -> list[str]:
145151
def range(self) -> tuple[float, float]:
146152
return None
147153

148-
def get_metadata(self) -> BenchmarkMetadata:
154+
def get_metadata(self) -> dict[str, BenchmarkMetadata]:
149155
range = self.range()
150156

151-
return BenchmarkMetadata(
152-
type="benchmark",
153-
description=self.description(),
154-
notes=self.notes(),
155-
unstable=self.unstable(),
156-
tags=self.get_tags(),
157-
range_min=range[0] if range else None,
158-
range_max=range[1] if range else None,
159-
)
157+
return {
158+
self.name(): BenchmarkMetadata(
159+
type="benchmark",
160+
description=self.description(),
161+
notes=self.notes(),
162+
unstable=self.unstable(),
163+
tags=self.get_tags(),
164+
range_min=range[0] if range else None,
165+
range_max=range[1] if range else None,
166+
display_name=self.display_name(),
167+
)
168+
}
160169

161170

162171
class Suite(ABC):

devops/scripts/benchmarks/benches/compute.py

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import os
77
import csv
88
import io
9+
import copy
910
from utils.utils import run, git_clone, create_build_path
1011
from .base import Benchmark, Suite
1112
from utils.result import BenchmarkMetadata, Result
@@ -336,6 +337,7 @@ def __init__(self, bench, runtime: RUNTIMES, ioq, MeasureCompletion=0, UseEvents
336337
self.runtime = runtime
337338
self.MeasureCompletion = MeasureCompletion
338339
self.UseEvents = UseEvents
340+
self.NumKernels = 10
339341
super().__init__(
340342
bench, f"api_overhead_benchmark_{runtime.value}", "SubmitKernel"
341343
)
@@ -353,6 +355,16 @@ def name(self):
353355

354356
return f"api_overhead_benchmark_{self.runtime.value} SubmitKernel {order}{completion_str}{events_str}"
355357

358+
def display_name(self) -> str:
359+
order = "in order" if self.ioq else "out of order"
360+
info = []
361+
if self.MeasureCompletion:
362+
info.append("with measure completion")
363+
if self.UseEvents:
364+
info.append("using events")
365+
additional_info = f" {' '.join(info)}" if info else ""
366+
return f"{self.runtime.value.upper()} SubmitKernel {order}{additional_info}, NumKernels {self.NumKernels}"
367+
356368
def explicit_group(self):
357369
order = "In Order" if self.ioq else "Out Of Order"
358370
completion_str = " With Completion" if self.MeasureCompletion else ""
@@ -373,7 +385,7 @@ def description(self) -> str:
373385

374386
return (
375387
f"Measures CPU time overhead of submitting {order} kernels through {runtime_name} API{completion_desc}. "
376-
f"Runs 10 simple kernels with minimal execution time to isolate API overhead from kernel execution time."
388+
f"Runs {self.NumKernels} simple kernels with minimal execution time to isolate API overhead from kernel execution time."
377389
)
378390

379391
def range(self) -> tuple[float, float]:
@@ -385,11 +397,23 @@ def bin_args(self) -> list[str]:
385397
f"--MeasureCompletion={self.MeasureCompletion}",
386398
"--iterations=100000",
387399
"--Profiling=0",
388-
"--NumKernels=10",
400+
f"--NumKernels={self.NumKernels}",
389401
"--KernelExecTime=1",
390402
f"--UseEvents={self.UseEvents}",
391403
]
392404

405+
def get_metadata(self) -> dict[str, BenchmarkMetadata]:
406+
metadata_dict = super().get_metadata()
407+
408+
# Create CPU count variant with modified display name
409+
cpu_count_name = self.name() + " CPU count"
410+
cpu_count_metadata = copy.deepcopy(metadata_dict[self.name()])
411+
cpu_count_display_name = self.display_name() + ", CPU count"
412+
cpu_count_metadata.display_name = cpu_count_display_name
413+
metadata_dict[cpu_count_name] = cpu_count_metadata
414+
415+
return metadata_dict
416+
393417

394418
class ExecImmediateCopyQueue(ComputeBenchmark):
395419
def __init__(self, bench, ioq, isCopyOnly, source, destination, size):
@@ -404,6 +428,10 @@ def name(self):
404428
order = "in order" if self.ioq else "out of order"
405429
return f"api_overhead_benchmark_sycl ExecImmediateCopyQueue {order} from {self.source} to {self.destination}, size {self.size}"
406430

431+
def display_name(self) -> str:
432+
order = "in order" if self.ioq else "out of order"
433+
return f"SYCL ExecImmediateCopyQueue {order} from {self.source} to {self.destination}, size {self.size}"
434+
407435
def description(self) -> str:
408436
order = "in-order" if self.ioq else "out-of-order"
409437
operation = "copy-only" if self.isCopyOnly else "copy and command submission"
@@ -438,6 +466,9 @@ def __init__(self, bench, isCopyOnly, source, destination, size):
438466
def name(self):
439467
return f"memory_benchmark_sycl QueueInOrderMemcpy from {self.source} to {self.destination}, size {self.size}"
440468

469+
def display_name(self) -> str:
470+
return f"SYCL QueueInOrderMemcpy from {self.source} to {self.destination}, size {self.size}"
471+
441472
def description(self) -> str:
442473
operation = "copy-only" if self.isCopyOnly else "copy and command submission"
443474
return (
@@ -469,6 +500,9 @@ def __init__(self, bench, source, destination, size):
469500
def name(self):
470501
return f"memory_benchmark_sycl QueueMemcpy from {self.source} to {self.destination}, size {self.size}"
471502

503+
def display_name(self) -> str:
504+
return f"SYCL QueueMemcpy from {self.source} to {self.destination}, size {self.size}"
505+
472506
def description(self) -> str:
473507
return (
474508
f"Measures general SYCL queue memory copy performance from {self.source} to "
@@ -497,6 +531,9 @@ def __init__(self, bench, type, size, placement):
497531
def name(self):
498532
return f"memory_benchmark_sycl StreamMemory, placement {self.placement}, type {self.type}, size {self.size}"
499533

534+
def display_name(self) -> str:
535+
return f"SYCL StreamMemory, placement {self.placement}, type {self.type}, size {self.size}"
536+
500537
def description(self) -> str:
501538
return (
502539
f"Measures {self.placement} memory bandwidth using {self.type} pattern with "
@@ -530,6 +567,9 @@ def __init__(self, bench):
530567
def name(self):
531568
return f"miscellaneous_benchmark_sycl VectorSum"
532569

570+
def display_name(self) -> str:
571+
return f"SYCL VectorSum"
572+
533573
def description(self) -> str:
534574
return (
535575
"Measures performance of vector addition across 3D grid (512x256x256 elements) "
@@ -591,6 +631,19 @@ def name(self):
591631
+ (" with barrier" if self.useBarrier else "")
592632
)
593633

634+
def display_name(self) -> str:
635+
info = []
636+
if not self.useEvents:
637+
info.append("without events")
638+
if not self.useCopyOffload:
639+
info.append("without copy offload")
640+
additional_info = f", {' '.join(info)}" if info else ""
641+
return (
642+
f"UR MemcpyExecute, opsPerThread {self.numOpsPerThread}, "
643+
f"numThreads {self.numThreads}, allocSize {self.allocSize}, srcUSM {self.srcUSM}, "
644+
f"dstUSM {self.dstUSM}{additional_info}"
645+
)
646+
594647
def explicit_group(self):
595648
return (
596649
"MemcpyExecute opsPerThread: "
@@ -655,6 +708,9 @@ def description(self) -> str:
655708
def name(self):
656709
return f"graph_api_benchmark_{self.runtime.value} SinKernelGraph graphs:{self.withGraphs}, numKernels:{self.numKernels}"
657710

711+
def display_name(self) -> str:
712+
return f"{self.runtime.value.upper()} SinKernelGraph, graphs {self.withGraphs}, numKernels {self.numKernels}"
713+
658714
def unstable(self) -> str:
659715
return "This benchmark combines both eager and graph execution, and may not be representative of real use cases."
660716

@@ -703,6 +759,9 @@ def description(self) -> str:
703759
def name(self):
704760
return f"graph_api_benchmark_{self.runtime.value} SubmitGraph numKernels:{self.numKernels} ioq {self.inOrderQueue} measureCompletion {self.measureCompletionTime}"
705761

762+
def display_name(self) -> str:
763+
return f"{self.runtime.value.upper()} SubmitGraph, numKernels {self.numKernels}, ioq {self.inOrderQueue}, measureCompletion {self.measureCompletionTime}"
764+
706765
def get_tags(self):
707766
return [
708767
"graph",
@@ -741,6 +800,11 @@ def description(self) -> str:
741800
def name(self):
742801
return f"ulls_benchmark_{self.runtime.value} EmptyKernel wgc:{self.wgc}, wgs:{self.wgs}"
743802

803+
def display_name(self) -> str:
804+
return (
805+
f"{self.runtime.value.upper()} EmptyKernel, wgc {self.wgc}, wgs {self.wgs}"
806+
)
807+
744808
def get_tags(self):
745809
return [runtime_to_tag_name(self.runtime), "micro", "latency", "submit"]
746810

@@ -782,6 +846,9 @@ def description(self) -> str:
782846
def name(self):
783847
return f"ulls_benchmark_{self.runtime.value} KernelSwitch count {self.count} kernelTime {self.kernelTime}"
784848

849+
def display_name(self) -> str:
850+
return f"{self.runtime.value.upper()} KernelSwitch, count {self.count}, kernelTime {self.kernelTime}"
851+
785852
def get_tags(self):
786853
return [runtime_to_tag_name(self.runtime), "micro", "latency", "submit"]
787854

@@ -818,6 +885,12 @@ def name(self):
818885
f"usmMemoryPlacement:{self.usm_memory_placement} size:{self.size} measureMode:{self.measure_mode}"
819886
)
820887

888+
def display_name(self) -> str:
889+
return (
890+
f"{self.runtime.value.upper()} UsmMemoryAllocation, "
891+
f"usmMemoryPlacement {self.usm_memory_placement}, size {self.size}, measureMode {self.measure_mode}"
892+
)
893+
821894
def explicit_group(self):
822895
return f"UsmMemoryAllocation"
823896

@@ -870,6 +943,12 @@ def name(self):
870943
f"usmMemoryPlacement:{self.usm_memory_placement} allocationCount:{self.allocation_count} size:{self.size} measureMode:{self.measure_mode}"
871944
)
872945

946+
def display_name(self) -> str:
947+
return (
948+
f"{self.runtime.value.upper()} UsmBatchMemoryAllocation, "
949+
f"usmMemoryPlacement {self.usm_memory_placement}, allocationCount {self.allocation_count}, size {self.size}, measureMode {self.measure_mode}"
950+
)
951+
873952
def explicit_group(self):
874953
return f"UsmBatchMemoryAllocation"
875954

0 commit comments

Comments
 (0)