3232from fleetbench .parallel import worker
3333
3434
35- def _GetBenchmarks (
35+ def _CreateBenchmarks (
36+ bm_target : str , names : list [str ]
37+ ) -> dict [str , bm .Benchmark ]:
38+ """Creates benchmark dictionary with the benchmark name as the key."""
39+ benchmarks = {}
40+ for name in names :
41+ benchmark = bm .Benchmark (bm_target , name )
42+ benchmarks [benchmark .Name ()] = benchmark
43+ return benchmarks
44+
45+
46+ def _CreateMatchingBenchmarks (
47+ bm_target : str , bm_filter : str , bm_candidates : list [str ]
48+ ) -> dict [str , bm .Benchmark ]:
49+ """Creates benchmarks that match the given filter."""
50+ matching_bm_names = [name for name in bm_candidates if bm_filter in name ]
51+ if not matching_bm_names :
52+ raise ValueError (f"Can't find benchmarks matching { bm_filter } ." )
53+ return _CreateBenchmarks (bm_target , matching_bm_names )
54+
55+
56+ def _GetDefaultBenchmarks (
3657 benchmark_target : str , benchmark_filters : list [str ]
3758) -> dict [str , bm .Benchmark ]:
38- """Get a list of benchmarks from the given target."""
59+ """Get a list of benchmarks from the default target.
60+
61+ Filtering options:
62+ - Empty list: Returns all default benchmarks.
63+ - Keyword list: Returns benchmarks from the default list matching the provided
64+ keyword (e.g., "Cold Hot").
65+ """
3966 benchmarks = {}
4067 sub_benchmarks = bm .GetSubBenchmarks (benchmark_target )
4168
69+ # Gets default benchmark sets
4270 if not benchmark_filters :
43- for name in sub_benchmarks :
44- benchmark = bm .Benchmark (benchmark_target , name )
45- benchmarks [benchmark .Name ()] = benchmark
46- else :
47- for bm_filter in benchmark_filters :
48- matching_bm_names = [name for name in sub_benchmarks if bm_filter in name ]
49- if matching_bm_names :
50- for name in matching_bm_names :
51- benchmark = bm .Benchmark (benchmark_target , name )
52- benchmarks [benchmark .Name ()] = benchmark
53- else :
54- raise ValueError (
55- f"Benchmark { bm_filter } not found in { benchmark_target } ."
71+ return _CreateBenchmarks (benchmark_target , sub_benchmarks )
72+
73+ # Gets benchmark sets from filters
74+ for bm_filter in benchmark_filters :
75+ benchmarks .update (
76+ _CreateMatchingBenchmarks (benchmark_target , bm_filter , sub_benchmarks )
77+ )
78+ return benchmarks
79+
80+
81+ def _GetWorkloadBenchmarks (
82+ benchmark_target : str , workload_filters : list [str ]
83+ ) -> dict [str , bm .Benchmark ]:
84+ """Get a list of benchmarks from the given workload that match the filters.
85+
86+ Filtering options:
87+ - Workload name + keyword(s): Returns benchmarks associated with the
88+ specified workload, further filtered by keywords (e.g.,
89+ "libc,Memcpy,Memcmp").
90+ - Workload name + "all": Returns all benchmarks associated with the
91+ specified workload (e.g., "proto,all").
92+ """
93+ benchmarks = {}
94+
95+ # Get all unique workloads
96+ workloads = bm .GetWorkloads (benchmark_target )
97+
98+ def _GetWorkloadAndFilter (bm_filter : str ) -> tuple [str , list [str ]]:
99+ parts = bm_filter .split ("," )
100+ if parts [0 ].upper () not in workloads :
101+ raise ValueError (f"Workload { parts [0 ]} not supported in Fleetbench." )
102+ return parts [0 ], parts [1 :]
103+
104+ for workload_filter in workload_filters :
105+ workload , bm_filters = _GetWorkloadAndFilter (workload_filter )
106+ workload_bms = bm .GetSubBenchmarks (benchmark_target , workload )
107+ if bm_filters == ["all" ]:
108+ benchmarks .update (
109+ _CreateMatchingBenchmarks (
110+ benchmark_target , workload .upper (), workload_bms
111+ )
112+ )
113+ else :
114+ for bm_filter in bm_filters :
115+ benchmarks .update (
116+ _CreateMatchingBenchmarks (benchmark_target , bm_filter , workload_bms )
56117 )
57118
58119 return benchmarks
@@ -131,6 +192,7 @@ def _PreRun(
131192 self ,
132193 benchmark_target : str ,
133194 benchmark_filters : list [str ],
195+ workload_filters : list [str ],
134196 benchmark_perf_counters : str ,
135197 benchmark_repetitions : int ,
136198 benchmark_min_time : str ,
@@ -139,7 +201,14 @@ def _PreRun(
139201
140202 logging .info ("Initializing benchmarks and worker threads..." )
141203
142- self .benchmarks = _GetBenchmarks (benchmark_target , benchmark_filters )
204+ if workload_filters :
205+ self .benchmarks = _GetWorkloadBenchmarks (
206+ benchmark_target , workload_filters
207+ )
208+ else :
209+ self .benchmarks = _GetDefaultBenchmarks (
210+ benchmark_target , benchmark_filters
211+ )
143212
144213 benchmark_flags = _SetExtraBenchmarkFlags (
145214 benchmark_perf_counters , benchmark_repetitions , benchmark_min_time
@@ -331,14 +400,25 @@ def Run(
331400 self ,
332401 benchmark_target : str ,
333402 benchmark_filter : list [str ] = [],
403+ workload_filter : list [str ] = [],
334404 benchmark_perf_counters : str = "" ,
335405 benchmark_repetitions : int = 0 ,
336406 benchmark_min_time : str = "" ,
337407 ) -> list [result .Result ]:
338408 """Run benchmarks in parallel."""
409+ logging .info ("Running with benchmark_filter: %s" , benchmark_filter )
410+ logging .info ("Running with workload_filter: %s" , workload_filter )
411+
412+ if benchmark_filter and workload_filter :
413+ logging .warning (
414+ "Both benchmark_filter and workload_filter specified. "
415+ "benchmark_filter will be ignored."
416+ )
417+
339418 self ._PreRun (
340419 benchmark_target ,
341420 benchmark_filter ,
421+ workload_filter ,
342422 benchmark_perf_counters ,
343423 benchmark_repetitions ,
344424 benchmark_min_time ,
0 commit comments