1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

Add math benchmark latency test

This patch further improves math function benchmarking by adding a latency
test in addition to throughput.  This enables more accurate comparisons of the
math functions. The latency test works by creating a dependency on the previous
iteration: func_res = F (func_res * zero + input[i]). The multiply by zero
avoids changing the input.

It reports reciprocal throughput and latency in nanoseconds (depending on the
timing header used) and max/min throughput in iterations per second:

   "workload-spec2006.wrf": {
    "reciprocal-throughput": 100,
    "latency": 200,
    "max-throughput": 1.0e+07,
    "min-throughput": 5.0e+06
   }

	* benchtests/bench-skeleton.c (main): Add support for
	latency benchmarking.
	* benchtests/scripts/bench.py: Add support for latency benchmarking.
This commit is contained in:
Wilco Dijkstra
2017-08-17 16:27:20 +01:00
parent 34d6a3cbf2
commit d4505b895f
3 changed files with 43 additions and 10 deletions

View File

@ -45,7 +45,7 @@ DEFINES_TEMPLATE = '''
# variant is represented by the _VARIANT structure. The ARGS structure
# represents a single set of arguments.
STRUCT_TEMPLATE = '''
#define CALL_BENCH_FUNC(v, i) %(func)s (%(func_args)s)
#define CALL_BENCH_FUNC(v, i, x) %(func)s (x %(func_args)s)
struct args
{
@ -84,7 +84,9 @@ EPILOGUE = '''
#define RESULT(__v, __i) (variants[(__v)].in[(__i)].timing)
#define RESULT_ACCUM(r, v, i, old, new) \\
((RESULT ((v), (i))) = (RESULT ((v), (i)) * (old) + (r)) / ((new) + 1))
#define BENCH_FUNC(i, j) ({%(getret)s CALL_BENCH_FUNC (i, j);})
#define BENCH_FUNC(i, j) ({%(getret)s CALL_BENCH_FUNC (i, j, );})
#define BENCH_FUNC_LAT(i, j) ({%(getret)s CALL_BENCH_FUNC (i, j, %(latarg)s);})
#define BENCH_VARS %(defvar)s
#define FUNCNAME "%(func)s"
#include "bench-skeleton.c"'''
@ -122,17 +124,23 @@ def gen_source(func, directives, all_vals):
# If we have a return value from the function, make sure it is
# assigned to prevent the compiler from optimizing out the
# call.
getret = ''
latarg = ''
defvar = ''
if directives['ret']:
print('static %s volatile ret;' % directives['ret'])
getret = 'ret = '
else:
getret = ''
print('static %s zero __attribute__((used)) = 0;' % directives['ret'])
getret = 'ret = func_res = '
# Note this may not work if argument and result type are incompatible.
latarg = 'func_res * zero +'
defvar = '%s func_res = 0;' % directives['ret']
# Test initialization.
if directives['init']:
print('#define BENCH_INIT %s' % directives['init'])
print(EPILOGUE % {'getret': getret, 'func': func})
print(EPILOGUE % {'getret': getret, 'func': func, 'latarg': latarg, 'defvar': defvar })
def _print_arg_data(func, directives, all_vals):