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