mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
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:
@@ -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>
|
2018-06-12 Minfeng Kang <minfeng.kang@hxt-semitech.com>
|
||||||
Hongbo Zhang <hongbo.zhang@linaro.org>
|
Hongbo Zhang <hongbo.zhang@linaro.org>
|
||||||
|
|
||||||
|
@@ -82,19 +82,41 @@ def draw_graph(f, v, ifuncs, results):
|
|||||||
pylab.savefig('%s-%s.png' % (f, v), bbox_inches='tight')
|
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
|
""" Process results and print them
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
results: JSON dictionary of results
|
results: JSON dictionary of results
|
||||||
attrs: Attributes that form the test criteria
|
attrs: Attributes that form the test criteria
|
||||||
|
funcs: Functions that are selected
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for f in results['functions'].keys():
|
for f in results['functions'].keys():
|
||||||
|
|
||||||
v = results['functions'][f]['bench-variant']
|
v = results['functions'][f]['bench-variant']
|
||||||
|
|
||||||
|
selected = {}
|
||||||
|
index = 0
|
||||||
base_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:
|
if base_func:
|
||||||
try:
|
try:
|
||||||
base_index = results['functions'][f]['ifuncs'].index(base_func)
|
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:
|
if not no_header:
|
||||||
print('Function: %s' % f)
|
print('Function: %s' % f)
|
||||||
print('Variant: %s' % v)
|
print('Variant: %s' % v)
|
||||||
print("%36s%s" % (' ', '\t'.join(results['functions'][f]['ifuncs'])))
|
print("%36s%s" % (' ', '\t'.join(ifuncs)))
|
||||||
print("=" * 120)
|
print("=" * 120)
|
||||||
|
|
||||||
graph_res = {}
|
graph_res = {}
|
||||||
@@ -122,13 +144,14 @@ def process_results(results, attrs, base_func, graph, no_diff, no_header):
|
|||||||
sys.stdout.write('%36s: ' % key)
|
sys.stdout.write('%36s: ' % key)
|
||||||
graph_res[key] = res['timings']
|
graph_res[key] = res['timings']
|
||||||
for t in res['timings']:
|
for t in res['timings']:
|
||||||
sys.stdout.write ('%12.2f' % t)
|
if selected[i]:
|
||||||
if not no_diff:
|
sys.stdout.write ('%12.2f' % t)
|
||||||
if i != base_index:
|
if not no_diff:
|
||||||
base = res['timings'][base_index]
|
if i != base_index:
|
||||||
diff = (base - t) * 100 / base
|
base = res['timings'][base_index]
|
||||||
sys.stdout.write (' (%6.2f%%)' % diff)
|
diff = (base - t) * 100 / base
|
||||||
sys.stdout.write('\t')
|
sys.stdout.write (' (%6.2f%%)' % diff)
|
||||||
|
sys.stdout.write('\t')
|
||||||
i = i + 1
|
i = i + 1
|
||||||
print('')
|
print('')
|
||||||
|
|
||||||
@@ -147,9 +170,16 @@ def main(args):
|
|||||||
schema_filename = args.schema
|
schema_filename = args.schema
|
||||||
base_func = args.base
|
base_func = args.base
|
||||||
attrs = args.attributes.split(',')
|
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)
|
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
|
return os.EX_OK
|
||||||
|
|
||||||
|
|
||||||
@@ -166,6 +196,8 @@ if __name__ == '__main__':
|
|||||||
help='Schema file to validate the result file.')
|
help='Schema file to validate the result file.')
|
||||||
|
|
||||||
# Optional arguments.
|
# Optional arguments.
|
||||||
|
parser.add_argument('-f', '--functions',
|
||||||
|
help='Comma separated list of functions.')
|
||||||
parser.add_argument('-b', '--base',
|
parser.add_argument('-b', '--base',
|
||||||
help='IFUNC variant to set as baseline.')
|
help='IFUNC variant to set as baseline.')
|
||||||
parser.add_argument('-g', '--graph', action='store_true',
|
parser.add_argument('-g', '--graph', action='store_true',
|
||||||
|
Reference in New Issue
Block a user