Skip to content

Commit f3350b6

Browse files
committed
Provide a human-readable output format
1 parent b5392cb commit f3350b6

File tree

5 files changed

+103
-14
lines changed

5 files changed

+103
-14
lines changed

util/analyze/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from ._types import Logs, Benchmark, Block
22
from ._main import parse_args
33
from .imports import import_cpu2006, import_plaidml, import_shoc, import_utils
4-
from . import utils
4+
from . import utils, ioutils
55
from .utils import foreach_bench

util/analyze/_main.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,14 @@ def parse_args(parser: argparse.ArgumentParser, *names, args=None):
7575
'plaidml': import_plaidml.parse,
7676
'shoc': import_shoc.parse,
7777
}
78-
parser = FILE_PARSERS[args.benchsuite]
78+
fileparser = FILE_PARSERS[args.benchsuite]
7979
blk_filter = block_filter(args.keep_blocks_if) if args.keep_blocks_if is not True else True
8080

8181
args_dict = vars(args)
8282

8383
def parse_input(x):
8484
if isinstance(x, str):
85-
result = parser(x)
85+
result = fileparser(x)
8686
if blk_filter is not True:
8787
result = result.keep_blocks_if(blk_filter)
8888
return result
@@ -94,4 +94,8 @@ def parse_input(x):
9494
for name in names:
9595
args_dict[name] = parse_input(args_dict[name])
9696

97+
if hasattr(parser, '__analyze_post_process_parse_args__'):
98+
for argname, postprocess in getattr(parser, '__analyze_post_process_parse_args__').items():
99+
args_dict[argname] = postprocess(args_dict[argname])
100+
97101
return args

util/analyze/ioutils.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import argparse
2+
import csv
3+
4+
5+
class _Writer:
6+
def __init__(self, add_bench):
7+
self.__add_bench = add_bench
8+
9+
def __addinfo(self, bench, data):
10+
if self.__add_bench:
11+
return {'Benchmark': bench, **data}
12+
return data
13+
14+
def benchdata(self, bench, data):
15+
self._benchdata(self.__addinfo(bench, data))
16+
17+
def finish(self):
18+
self._finish()
19+
20+
21+
class _CSVWriter(_Writer):
22+
def __init__(self, f, data: dict, fieldnames=None):
23+
add_bench = fieldnames is None or 'Benchmark' in fieldnames and 'Benchmark' not in data
24+
super().__init__(add_bench)
25+
26+
if fieldnames is None:
27+
fieldnames = ['Benchmark', *data['Total'].keys()]
28+
29+
self.__csv_writer = csv.DictWriter(f, fieldnames=fieldnames)
30+
self.__csv_writer.writeheader()
31+
32+
def _benchdata(self, data):
33+
self.__csv_writer.writerow(data)
34+
35+
def _finish(self):
36+
pass
37+
38+
39+
class _HumanWriter(_Writer):
40+
def __init__(self, f, data: dict, fieldnames=None):
41+
add_bench = fieldnames is None or 'Benchmark' in fieldnames and 'Benchmark' not in data
42+
super().__init__(add_bench)
43+
44+
if fieldnames is None:
45+
fieldnames = ['Benchmark', *data['Total'].keys()]
46+
47+
self.__f = f
48+
self.__fieldnames = fieldnames
49+
self.__data = {name: [f'{name}:'] for name in fieldnames}
50+
self.__num_entries = 1
51+
52+
def _benchdata(self, data):
53+
self.__num_entries += 1
54+
for k, v in data.items():
55+
self.__data[k].append(str(v))
56+
57+
def _finish(self):
58+
col_max = [max(len(self.__data[field][index]) for field in self.__fieldnames)
59+
for index in range(self.__num_entries)]
60+
for field in self.__fieldnames:
61+
for index, val in enumerate(self.__data[field]):
62+
self.__f.write(f'{val:{col_max[index]+1}}')
63+
self.__f.write('\n')
64+
65+
66+
def _write_data(writer: _Writer, data: dict):
67+
for bench, bench_data in data.items():
68+
writer.benchdata(bench, bench_data)
69+
writer.finish()
70+
71+
72+
def write_csv(f, data: dict, *, fieldnames=None):
73+
_write_data(_CSVWriter(f, data, fieldnames), data)
74+
75+
76+
def write_human(f, data: dict, *, fieldnames=None):
77+
_write_data(_HumanWriter(f, data, fieldnames), data)
78+
79+
80+
def add_output_format_arg(parser: argparse.ArgumentParser, default='csv'):
81+
parser.add_argument('--format', default=default, choices=('csv', 'human'),
82+
help=f'Which format style to use (default: {default})')
83+
FORMAT_OPTIONS = {
84+
'csv': write_csv,
85+
'human': write_human,
86+
}
87+
88+
if not hasattr(parser, '__analyze_post_process_parse_args__'):
89+
setattr(parser, '__analyze_post_process_parse_args__', {})
90+
getattr(parser, '__analyze_post_process_parse_args__')['format'] = FORMAT_OPTIONS.__getitem__

util/analyze/lib/block_stats.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from typing import *
44
import argparse
5+
from analyze import ioutils
56
import analyze
67
from analyze import Block, Logs, utils
78

@@ -82,12 +83,9 @@ def compute_block_stats(logs: Logs):
8283
parser = argparse.ArgumentParser(
8384
description='Computes the block stats for the logs')
8485
parser.add_argument('logs', help='The logs to analyze')
86+
ioutils.add_output_format_arg(parser)
8587
args = analyze.parse_args(parser, 'logs')
8688

8789
results = utils.foreach_bench(compute_block_stats, args.logs)
8890

89-
writer = csv.DictWriter(sys.stdout,
90-
fieldnames=['Benchmark'] + list(results['Total'].keys()))
91-
writer.writeheader()
92-
for bench, bench_res in results.items():
93-
writer.writerow({'Benchmark': bench, **bench_res})
91+
args.format(result)

util/gt_analysis/gt_cmp.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Tuple
55

66
import analyze
7-
from analyze import Block, Logs, utils
7+
from analyze import Block, Logs, utils, ioutils
88
from analyze.lib import block_stats, compile_times
99

1010
sched_time = compile_times.sched_time
@@ -153,6 +153,7 @@ def compute_stats(nogt: Logs, gt: Logs, *, pass_num: int, total_compile_time_sec
153153
parser.add_argument('nogt')
154154
parser.add_argument('gt')
155155
parser.add_argument('--pass-num', type=int, default=None, help='Which pass to analyze (default: all passes)')
156+
ioutils.add_output_format_arg(parser)
156157
args = analyze.parse_args(parser, 'nogt', 'gt')
157158

158159
results = utils.foreach_bench(
@@ -161,8 +162,4 @@ def compute_stats(nogt: Logs, gt: Logs, *, pass_num: int, total_compile_time_sec
161162
total_compile_time_seconds=compile_times.total_compile_time_seconds_f(args.benchsuite),
162163
)
163164

164-
writer = csv.DictWriter(sys.stdout,
165-
fieldnames=['Benchmark'] + list(results['Total'].keys()))
166-
writer.writeheader()
167-
for bench, bench_res in results.items():
168-
writer.writerow({'Benchmark': bench, **bench_res})
165+
args.format(sys.stdout, results)

0 commit comments

Comments
 (0)