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