95 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			2.4 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"
 | ||
|  | 
 | ||
|  | int no_speed_allocation = 0; /* 1 to not allocate array data in speed() */ | ||
|  | 
 | ||
|  | void speed(const char *param, int setup_only) | ||
|  | { | ||
|  |      double *t; | ||
|  |      int iter = 0, k; | ||
|  |      bench_problem *p; | ||
|  |      double tmin, y; | ||
|  | 
 | ||
|  |      t = (double *) bench_malloc(time_repeat * sizeof(double)); | ||
|  | 
 | ||
|  |      for (k = 0; k < time_repeat; ++k)  | ||
|  | 	  t[k] = 0; | ||
|  | 
 | ||
|  |      p = problem_parse(param); | ||
|  |      BENCH_ASSERT(can_do(p)); | ||
|  |      if (!no_speed_allocation) { | ||
|  | 	  problem_alloc(p); | ||
|  | 	  problem_zero(p); | ||
|  |      } | ||
|  | 
 | ||
|  |      timer_start(LIBBENCH_TIMER); | ||
|  |      setup(p); | ||
|  |      p->setup_time = bench_cost_postprocess(timer_stop(LIBBENCH_TIMER)); | ||
|  | 
 | ||
|  |      /* reset the input to zero again, because the planner in paranoid
 | ||
|  | 	mode sets it to random values, thus making the benchmark | ||
|  | 	diverge. */ | ||
|  |      if (!no_speed_allocation)  | ||
|  | 	  problem_zero(p); | ||
|  |       | ||
|  |      if (setup_only) | ||
|  | 	  goto done; | ||
|  | 
 | ||
|  |  start_over: | ||
|  |      for (iter = 1; iter < (1<<30); iter *= 2) { | ||
|  | 	  tmin = 1.0e20; | ||
|  | 	  for (k = 0; k < time_repeat; ++k) { | ||
|  | 	       timer_start(LIBBENCH_TIMER); | ||
|  | 	       doit(iter, p); | ||
|  | 	       y = bench_cost_postprocess(timer_stop(LIBBENCH_TIMER)); | ||
|  | 	       if (y < 0) /* yes, it happens */ | ||
|  | 		    goto start_over; | ||
|  | 	       t[k] = y; | ||
|  | 	       if (y < tmin) | ||
|  | 		    tmin = y; | ||
|  | 	  } | ||
|  | 	   | ||
|  | 	  if (tmin >= time_min) | ||
|  | 	       goto done; | ||
|  |      } | ||
|  | 
 | ||
|  |      goto start_over; /* this also happens */ | ||
|  | 
 | ||
|  |  done: | ||
|  |      done(p); | ||
|  | 
 | ||
|  |      if (iter)  | ||
|  | 	  for (k = 0; k < time_repeat; ++k)  | ||
|  | 	       t[k] /= iter; | ||
|  |      else | ||
|  | 	  for (k = 0; k < time_repeat; ++k)  | ||
|  | 	       t[k] = 0; | ||
|  | 
 | ||
|  |      report(p, t, time_repeat); | ||
|  | 
 | ||
|  |      if (!no_speed_allocation) | ||
|  | 	  problem_destroy(p); | ||
|  |      bench_free(t); | ||
|  |      return; | ||
|  | } |