annotate src/fftw-3.3.8/kernel/timer.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents d0c2a83c1364
children
rev   line source
Chris@82 1 /*
Chris@82 2 * Copyright (c) 2003, 2007-14 Matteo Frigo
Chris@82 3 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
Chris@82 4 *
Chris@82 5 * This program is free software; you can redistribute it and/or modify
Chris@82 6 * it under the terms of the GNU General Public License as published by
Chris@82 7 * the Free Software Foundation; either version 2 of the License, or
Chris@82 8 * (at your option) any later version.
Chris@82 9 *
Chris@82 10 * This program is distributed in the hope that it will be useful,
Chris@82 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@82 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@82 13 * GNU General Public License for more details.
Chris@82 14 *
Chris@82 15 * You should have received a copy of the GNU General Public License
Chris@82 16 * along with this program; if not, write to the Free Software
Chris@82 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@82 18 *
Chris@82 19 */
Chris@82 20
Chris@82 21
Chris@82 22 #include "kernel/ifftw.h"
Chris@82 23
Chris@82 24 #ifdef HAVE_UNISTD_H
Chris@82 25 # include <unistd.h>
Chris@82 26 #endif
Chris@82 27
Chris@82 28 #ifndef WITH_SLOW_TIMER
Chris@82 29 # include "cycle.h"
Chris@82 30 #endif
Chris@82 31
Chris@82 32 #ifndef FFTW_TIME_LIMIT
Chris@82 33 #define FFTW_TIME_LIMIT 2.0 /* don't run for more than two seconds */
Chris@82 34 #endif
Chris@82 35
Chris@82 36 /* the following code is disabled for now, because it seems to
Chris@82 37 require that we #include <windows.h> in ifftw.h to
Chris@82 38 typedef LARGE_INTEGER crude_time, and this pulls in the whole
Chris@82 39 Windows universe and leads to namespace conflicts (unless
Chris@82 40 we did some hack like assuming sizeof(LARGE_INTEGER) == sizeof(long long).
Chris@82 41 gettimeofday is provided by MinGW, which we use to cross-compile
Chris@82 42 FFTW for Windows, and this seems to work well enough */
Chris@82 43 #if 0 && (defined(__WIN32__) || defined(_WIN32) || defined(_WIN64))
Chris@82 44 crude_time X(get_crude_time)(void)
Chris@82 45 {
Chris@82 46 crude_time tv;
Chris@82 47 QueryPerformanceCounter(&tv);
Chris@82 48 return tv;
Chris@82 49 }
Chris@82 50
Chris@82 51 static double elapsed_since(crude_time t0)
Chris@82 52 {
Chris@82 53 crude_time t1, freq;
Chris@82 54 QueryPerformanceCounter(&t1);
Chris@82 55 QueryPerformanceFrequency(&freq);
Chris@82 56 return (((double) (t1.QuadPart - t0.QuadPart))) /
Chris@82 57 ((double) freq.QuadPart);
Chris@82 58 }
Chris@82 59
Chris@82 60 # define TIME_MIN_SEC 1.0e-2
Chris@82 61
Chris@82 62 #elif defined(HAVE_GETTIMEOFDAY)
Chris@82 63 crude_time X(get_crude_time)(void)
Chris@82 64 {
Chris@82 65 crude_time tv;
Chris@82 66 gettimeofday(&tv, 0);
Chris@82 67 return tv;
Chris@82 68 }
Chris@82 69
Chris@82 70 #define elapsed_sec(t1,t0) ((double)(t1.tv_sec - t0.tv_sec) + \
Chris@82 71 (double)(t1.tv_usec - t0.tv_usec) * 1.0E-6)
Chris@82 72
Chris@82 73 static double elapsed_since(crude_time t0)
Chris@82 74 {
Chris@82 75 crude_time t1;
Chris@82 76 gettimeofday(&t1, 0);
Chris@82 77 return elapsed_sec(t1, t0);
Chris@82 78 }
Chris@82 79
Chris@82 80 # define TIME_MIN_SEC 1.0e-3
Chris@82 81
Chris@82 82 #else /* !HAVE_GETTIMEOFDAY */
Chris@82 83
Chris@82 84 /* Note that the only system where we are likely to need to fall back
Chris@82 85 on the clock() function is Windows, for which CLOCKS_PER_SEC is 1000
Chris@82 86 and thus the clock wraps once every 50 days. This should hopefully
Chris@82 87 be longer than the time required to create any single plan! */
Chris@82 88 crude_time X(get_crude_time)(void) { return clock(); }
Chris@82 89
Chris@82 90 #define elapsed_sec(t1,t0) ((double) ((t1) - (t0)) / CLOCKS_PER_SEC)
Chris@82 91
Chris@82 92 static double elapsed_since(crude_time t0)
Chris@82 93 {
Chris@82 94 return elapsed_sec(clock(), t0);
Chris@82 95 }
Chris@82 96
Chris@82 97 # define TIME_MIN_SEC 2.0e-1 /* from fftw2 */
Chris@82 98
Chris@82 99 #endif /* !HAVE_GETTIMEOFDAY */
Chris@82 100
Chris@82 101 double X(elapsed_since)(const planner *plnr, const problem *p, crude_time t0)
Chris@82 102 {
Chris@82 103 double t = elapsed_since(t0);
Chris@82 104 if (plnr->cost_hook)
Chris@82 105 t = plnr->cost_hook(p, t, COST_MAX);
Chris@82 106 return t;
Chris@82 107 }
Chris@82 108
Chris@82 109 #ifdef WITH_SLOW_TIMER
Chris@82 110 /* excruciatingly slow; only use this if there is no choice! */
Chris@82 111 typedef crude_time ticks;
Chris@82 112 # define getticks X(get_crude_time)
Chris@82 113 # define elapsed(t1,t0) elapsed_sec(t1,t0)
Chris@82 114 # define TIME_MIN TIME_MIN_SEC
Chris@82 115 # define TIME_REPEAT 4 /* from fftw2 */
Chris@82 116 # define HAVE_TICK_COUNTER
Chris@82 117 #endif
Chris@82 118
Chris@82 119 #ifdef HAVE_TICK_COUNTER
Chris@82 120
Chris@82 121 # ifndef TIME_MIN
Chris@82 122 # define TIME_MIN 100.0
Chris@82 123 # endif
Chris@82 124
Chris@82 125 # ifndef TIME_REPEAT
Chris@82 126 # define TIME_REPEAT 8
Chris@82 127 # endif
Chris@82 128
Chris@82 129 static double measure(plan *pln, const problem *p, int iter)
Chris@82 130 {
Chris@82 131 ticks t0, t1;
Chris@82 132 int i;
Chris@82 133
Chris@82 134 t0 = getticks();
Chris@82 135 for (i = 0; i < iter; ++i)
Chris@82 136 pln->adt->solve(pln, p);
Chris@82 137 t1 = getticks();
Chris@82 138 return elapsed(t1, t0);
Chris@82 139 }
Chris@82 140
Chris@82 141
Chris@82 142 double X(measure_execution_time)(const planner *plnr,
Chris@82 143 plan *pln, const problem *p)
Chris@82 144 {
Chris@82 145 int iter;
Chris@82 146 int repeat;
Chris@82 147
Chris@82 148 X(plan_awake)(pln, AWAKE_ZERO);
Chris@82 149 p->adt->zero(p);
Chris@82 150
Chris@82 151 start_over:
Chris@82 152 for (iter = 1; iter; iter *= 2) {
Chris@82 153 double tmin = 0;
Chris@82 154 int first = 1;
Chris@82 155 crude_time begin = X(get_crude_time)();
Chris@82 156
Chris@82 157 /* repeat the measurement TIME_REPEAT times */
Chris@82 158 for (repeat = 0; repeat < TIME_REPEAT; ++repeat) {
Chris@82 159 double t = measure(pln, p, iter);
Chris@82 160
Chris@82 161 if (plnr->cost_hook)
Chris@82 162 t = plnr->cost_hook(p, t, COST_MAX);
Chris@82 163 if (t < 0)
Chris@82 164 goto start_over;
Chris@82 165
Chris@82 166 if (first || t < tmin)
Chris@82 167 tmin = t;
Chris@82 168 first = 0;
Chris@82 169
Chris@82 170 /* do not run for too long */
Chris@82 171 if (X(elapsed_since)(plnr, p, begin) > FFTW_TIME_LIMIT)
Chris@82 172 break;
Chris@82 173 }
Chris@82 174
Chris@82 175 if (tmin >= TIME_MIN) {
Chris@82 176 X(plan_awake)(pln, SLEEPY);
Chris@82 177 return tmin / (double) iter;
Chris@82 178 }
Chris@82 179 }
Chris@82 180 goto start_over; /* may happen if timer is screwed up */
Chris@82 181 }
Chris@82 182
Chris@82 183 #else /* no cycle counter */
Chris@82 184
Chris@82 185 double X(measure_execution_time)(const planner *plnr,
Chris@82 186 plan *pln, const problem *p)
Chris@82 187 {
Chris@82 188 UNUSED(plnr);
Chris@82 189 UNUSED(p);
Chris@82 190 UNUSED(pln);
Chris@82 191 return -1.0;
Chris@82 192 }
Chris@82 193
Chris@82 194 #endif