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