furnace/extern/fftw/libbench2/bench-main.c
2022-05-31 03:24:29 -05:00

195 lines
4.6 KiB
C

/*
* Copyright (c) 2001 Matteo Frigo
* Copyright (c) 2001 Massachusetts Institute of Technology
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "libbench2/bench.h"
#include "my-getopt.h"
#include <stdio.h>
#include <stdlib.h>
int verbose;
static const struct my_option options[] =
{
{"accuracy", REQARG, 'a'},
{"accuracy-rounds", REQARG, 405},
{"impulse-accuracy-rounds", REQARG, 406},
{"can-do", REQARG, 'd'},
{"help", NOARG, 'h'},
{"info", REQARG, 'i'},
{"info-all", NOARG, 'I'},
{"print-precision", NOARG, 402},
{"print-time-min", NOARG, 400},
{"random-seed", REQARG, 404},
{"report-benchmark", NOARG, 320},
{"report-mflops", NOARG, 300},
{"report-time", NOARG, 310},
{"report-verbose", NOARG, 330},
{"speed", REQARG, 's'},
{"setup-speed", REQARG, 'S'},
{"time-min", REQARG, 't'},
{"time-repeat", REQARG, 'r'},
{"user-option", REQARG, 'o'},
{"verbose", OPTARG, 'v'},
{"verify", REQARG, 'y'},
{"verify-rounds", REQARG, 401},
{"verify-tolerance", REQARG, 403},
{0, NOARG, 0}
};
int bench_main(int argc, char *argv[])
{
double tmin = 0.0;
double tol;
int repeat = 0;
int rounds = 10;
int iarounds = 0;
int arounds = 1; /* this is too low for precise results */
int c;
report = report_verbose; /* default */
verbose = 0;
tol = SINGLE_PRECISION ? 1.0e-3 : (QUAD_PRECISION ? 1e-29 : 1.0e-10);
main_init(&argc, &argv);
bench_srand(1);
while ((c = my_getopt (argc, argv, options)) != -1) {
switch (c) {
case 't' :
tmin = strtod(my_optarg, 0);
break;
case 'r':
repeat = atoi(my_optarg);
break;
case 's':
timer_init(tmin, repeat);
speed(my_optarg, 0);
break;
case 'S':
timer_init(tmin, repeat);
speed(my_optarg, 1);
break;
case 'd':
report_can_do(my_optarg);
break;
case 'o':
useropt(my_optarg);
break;
case 'v':
if (verbose >= 0) { /* verbose < 0 disables output */
if (my_optarg)
verbose = atoi(my_optarg);
else
++verbose;
}
break;
case 'y':
verify(my_optarg, rounds, tol);
break;
case 'a':
accuracy(my_optarg, arounds, iarounds);
break;
case 'i':
report_info(my_optarg);
break;
case 'I':
report_info_all();
break;
case 'h':
if (verbose >= 0) my_usage(argv[0], options);
break;
case 300: /* --report-mflops */
report = report_mflops;
break;
case 310: /* --report-time */
report = report_time;
break;
case 320: /* --report-benchmark */
report = report_benchmark;
break;
case 330: /* --report-verbose */
report = report_verbose;
break;
case 400: /* --print-time-min */
timer_init(tmin, repeat);
ovtpvt("%g\n", time_min);
break;
case 401: /* --verify-rounds */
rounds = atoi(my_optarg);
break;
case 402: /* --print-precision */
if (SINGLE_PRECISION)
ovtpvt("single\n");
else if (QUAD_PRECISION)
ovtpvt("quad\n");
else if (LDOUBLE_PRECISION)
ovtpvt("long-double\n");
else if (DOUBLE_PRECISION)
ovtpvt("double\n");
else
ovtpvt("unknown %d\n", sizeof(bench_real));
break;
case 403: /* --verify-tolerance */
tol = strtod(my_optarg, 0);
break;
case 404: /* --random-seed */
bench_srand(atoi(my_optarg));
break;
case 405: /* --accuracy-rounds */
arounds = atoi(my_optarg);
break;
case 406: /* --impulse-accuracy-rounds */
iarounds = atoi(my_optarg);
break;
case '?':
/* my_getopt() already printed an error message. */
cleanup();
return 1;
default:
abort ();
}
}
/* assume that any remaining arguments are problems to be
benchmarked */
while (my_optind < argc) {
timer_init(tmin, repeat);
speed(argv[my_optind++], 0);
}
cleanup();
return 0;
}