benchtests: Add -f/--functions argument

On x86-64, there may be multiple IFUNC implementations for a given
function.  But we may be only interested in a subset of them.  This
patch adds -f/--functions argument to compare a subset of IFUNC
implementations.

	* benchtests/scripts/compare_strings.py (process_results): Add
	funcs argument.  Compare only functions which are selected.
	(main): Check if base function is among selected functions.
	Pass selected functions to process_results.
	(__main__): Add -f/--functions argument.
This commit is contained in:
H.J. Lu 2018-06-12 09:10:28 -07:00
parent fc2ba8037d
commit cb8f6affed
2 changed files with 50 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2018-06-12 H.J. Lu <hongjiu.lu@intel.com>
* benchtests/scripts/compare_strings.py (process_results): Add
funcs argument. Compare only functions which are selected.
(main): Check if base function is among selected functions.
Pass selected functions to process_results.
(__main__): Add -f/--functions argument.
2018-06-12 Minfeng Kang <minfeng.kang@hxt-semitech.com>
Hongbo Zhang <hongbo.zhang@linaro.org>

View File

@ -82,19 +82,41 @@ def draw_graph(f, v, ifuncs, results):
pylab.savefig('%s-%s.png' % (f, v), bbox_inches='tight')
def process_results(results, attrs, base_func, graph, no_diff, no_header):
def process_results(results, attrs, funcs, base_func, graph, no_diff, no_header):
""" Process results and print them
Args:
results: JSON dictionary of results
attrs: Attributes that form the test criteria
funcs: Functions that are selected
"""
for f in results['functions'].keys():
v = results['functions'][f]['bench-variant']
selected = {}
index = 0
base_index = 0
if funcs:
ifuncs = []
first_func = True
for i in results['functions'][f]['ifuncs']:
if i in funcs:
if first_func:
base_index = index
first_func = False
selected[index] = 1
ifuncs.append(i)
else:
selected[index] = 0
index += 1
else:
ifuncs = results['functions'][f]['ifuncs']
for i in ifuncs:
selected[index] = 1
index += 1
if base_func:
try:
base_index = results['functions'][f]['ifuncs'].index(base_func)
@ -106,7 +128,7 @@ def process_results(results, attrs, base_func, graph, no_diff, no_header):
if not no_header:
print('Function: %s' % f)
print('Variant: %s' % v)
print("%36s%s" % (' ', '\t'.join(results['functions'][f]['ifuncs'])))
print("%36s%s" % (' ', '\t'.join(ifuncs)))
print("=" * 120)
graph_res = {}
@ -122,13 +144,14 @@ def process_results(results, attrs, base_func, graph, no_diff, no_header):
sys.stdout.write('%36s: ' % key)
graph_res[key] = res['timings']
for t in res['timings']:
sys.stdout.write ('%12.2f' % t)
if not no_diff:
if i != base_index:
base = res['timings'][base_index]
diff = (base - t) * 100 / base
sys.stdout.write (' (%6.2f%%)' % diff)
sys.stdout.write('\t')
if selected[i]:
sys.stdout.write ('%12.2f' % t)
if not no_diff:
if i != base_index:
base = res['timings'][base_index]
diff = (base - t) * 100 / base
sys.stdout.write (' (%6.2f%%)' % diff)
sys.stdout.write('\t')
i = i + 1
print('')
@ -147,9 +170,16 @@ def main(args):
schema_filename = args.schema
base_func = args.base
attrs = args.attributes.split(',')
if args.functions:
funcs = args.functions.split(',')
if base_func and not base_func in funcs:
print('Baseline function (%s) not found.' % base_func)
sys.exit(os.EX_DATAERR)
else:
funcs = None
results = parse_file(args.input, args.schema)
process_results(results, attrs, base_func, args.graph, args.no_diff, args.no_header)
process_results(results, attrs, funcs, base_func, args.graph, args.no_diff, args.no_header)
return os.EX_OK
@ -166,6 +196,8 @@ if __name__ == '__main__':
help='Schema file to validate the result file.')
# Optional arguments.
parser.add_argument('-f', '--functions',
help='Comma separated list of functions.')
parser.add_argument('-b', '--base',
help='IFUNC variant to set as baseline.')
parser.add_argument('-g', '--graph', action='store_true',