| Index: bench/bench_util.py
|
| diff --git a/bench/bench_util.py b/bench/bench_util.py
|
| index 9b7d296fa95142b101df6f0d3acd70df37871b81..29ef1c473b22a59735bd4e1587918ec59d59f280 100644
|
| --- a/bench/bench_util.py
|
| +++ b/bench/bench_util.py
|
| @@ -38,19 +38,25 @@ TILE_LAYOUT_RE_COMPILED = re.compile(TILE_LAYOUT_RE)
|
|
|
| class BenchDataPoint:
|
| """A single data point produced by bench.
|
| -
|
| - (str, str, str, float, {str:str}, str, [floats])"""
|
| + """
|
| def __init__(self, bench, config, time_type, time, settings,
|
| - tile_layout='', per_tile_values=[]):
|
| + tile_layout='', per_tile_values=[], per_iter_time=[]):
|
| + # string name of the benchmark to measure
|
| self.bench = bench
|
| + # string name of the configurations to run
|
| self.config = config
|
| + # type of the timer in string: '' (walltime), 'c' (cpu) or 'g' (gpu)
|
| self.time_type = time_type
|
| + # float number of the bench time value
|
| self.time = time
|
| + # dictionary of the run settings
|
| self.settings = settings
|
| - # how tiles cover the whole picture. '5x3' means 5 columns and 3 rows.
|
| + # how tiles cover the whole picture: '5x3' means 5 columns and 3 rows
|
| self.tile_layout = tile_layout
|
| - # list of per_tile bench values, if applicable
|
| + # list of float for per_tile bench values, if applicable
|
| self.per_tile_values = per_tile_values
|
| + # list of float for per-iteration bench time, if applicable
|
| + self.per_iter_time = per_iter_time
|
|
|
| def __repr__(self):
|
| return "BenchDataPoint(%s, %s, %s, %s, %s)" % (
|
| @@ -109,7 +115,7 @@ class _ListAlgorithm(object):
|
| return self._rep
|
|
|
| def _ParseAndStoreTimes(config_re_compiled, is_per_tile, line, bench,
|
| - value_dic, layout_dic, representation=None):
|
| + value_dic, layout_dic):
|
| """Parses given bench time line with regex and adds data to value_dic.
|
|
|
| config_re_compiled: precompiled regular expression for parsing the config
|
| @@ -120,7 +126,7 @@ def _ParseAndStoreTimes(config_re_compiled, is_per_tile, line, bench,
|
| bench: name of bench for the time values.
|
| value_dic: dictionary to store bench values. See bench_dic in parse() below.
|
| layout_dic: dictionary to store tile layouts. See parse() for descriptions.
|
| - representation: should match one of the ALGORITHM_XXX types."""
|
| + """
|
|
|
| for config in config_re_compiled.finditer(line):
|
| current_config = config.group(1)
|
| @@ -137,7 +143,7 @@ def _ParseAndStoreTimes(config_re_compiled, is_per_tile, line, bench,
|
| new_time.group(2).strip().split(',')]
|
| value_dic.setdefault(bench, {}).setdefault(
|
| current_config, {}).setdefault(current_time_type, []).append(
|
| - _ListAlgorithm(iters, representation).compute())
|
| + iters)
|
| layout_dic.setdefault(bench, {}).setdefault(
|
| current_config, {}).setdefault(current_time_type, tile_layout)
|
|
|
| @@ -151,7 +157,11 @@ def parse(settings, lines, representation=None):
|
|
|
| benches = []
|
| current_bench = None
|
| - bench_dic = {} # [bench][config][time_type] -> [list of bench values]
|
| + # [bench][config][time_type] -> [[per-iter values]] where per-tile config
|
| + # has per-iter value list for each tile [[<tile1_iter1>,<tile1_iter2>,...],
|
| + # [<tile2_iter1>,<tile2_iter2>,...],...], while non-per-tile config only
|
| + # contains one list of iterations [[iter1, iter2, ...]].
|
| + bench_dic = {}
|
| # [bench][config][time_type] -> tile_layout
|
| layout_dic = {}
|
|
|
| @@ -176,30 +186,42 @@ def parse(settings, lines, representation=None):
|
| if current_bench:
|
| if line.startswith(' tile_') :
|
| _ParseAndStoreTimes(TILE_RE_COMPILED, True, line, current_bench,
|
| - bench_dic, layout_dic, representation)
|
| + bench_dic, layout_dic)
|
| else:
|
| _ParseAndStoreTimes(CONFIG_RE_COMPILED, False, line,
|
| - current_bench,
|
| - bench_dic, layout_dic, representation)
|
| + current_bench, bench_dic, layout_dic)
|
|
|
| - # append benches to list, use the total time as final bench value.
|
| + # append benches to list
|
| for bench in bench_dic:
|
| for config in bench_dic[bench]:
|
| for time_type in bench_dic[bench][config]:
|
| tile_layout = ''
|
| - per_tile_values = []
|
| + per_tile_values = [] # empty for non-per-tile configs
|
| + per_iter_time = [] # empty for per-tile configs
|
| + bench_summary = None # a single final bench value
|
| if len(bench_dic[bench][config][time_type]) > 1:
|
| - # per-tile values, extract tile_layout
|
| - per_tile_values = bench_dic[bench][config][time_type]
|
| + # per-tile config; compute representation for each tile
|
| + per_tile_values = [
|
| + _ListAlgorithm(iters, representation).compute()
|
| + for iters in bench_dic[bench][config][time_type]]
|
| + # use sum of each tile representation for total bench value
|
| + bench_summary = sum(per_tile_values)
|
| + # extract tile layout
|
| tile_layout = layout_dic[bench][config][time_type]
|
| + else:
|
| + # get the list of per-iteration values
|
| + per_iter_time = bench_dic[bench][config][time_type][0]
|
| + bench_summary = _ListAlgorithm(
|
| + per_iter_time, representation).compute()
|
| benches.append(BenchDataPoint(
|
| bench,
|
| config,
|
| time_type,
|
| - sum(bench_dic[bench][config][time_type]),
|
| + bench_summary,
|
| settings,
|
| tile_layout,
|
| - per_tile_values))
|
| + per_tile_values,
|
| + per_iter_time))
|
|
|
| return benches
|
|
|
|
|