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