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