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