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