annotate src/fftw-3.3.3/tests/fftw-bench.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 89f5e221ed7b
children
rev   line source
cannam@95 1 /* See bench.c. We keep a few common subroutines in this file so
cannam@95 2 that they can be re-used in the MPI test program. */
cannam@95 3
cannam@95 4 #include <math.h>
cannam@95 5 #include <stdio.h>
cannam@95 6 #include <string.h>
cannam@95 7 #include "fftw-bench.h"
cannam@95 8
cannam@95 9 #ifdef _OPENMP
cannam@95 10 # include <omp.h>
cannam@95 11 #endif
cannam@95 12
cannam@95 13 #ifdef HAVE_SMP
cannam@95 14 int threads_ok = 1;
cannam@95 15 #endif
cannam@95 16
cannam@95 17 FFTW(plan) the_plan = 0;
cannam@95 18
cannam@95 19 static const char *wisdat = "wis.dat";
cannam@95 20 unsigned the_flags = 0;
cannam@95 21 int paranoid = 0;
cannam@95 22 int usewisdom = 0;
cannam@95 23 int havewisdom = 0;
cannam@95 24 int nthreads = 1;
cannam@95 25 int amnesia = 0;
cannam@95 26
cannam@95 27 extern void install_hook(void); /* in hook.c */
cannam@95 28 extern void uninstall_hook(void); /* in hook.c */
cannam@95 29
cannam@95 30 #ifdef FFTW_RANDOM_ESTIMATOR
cannam@95 31 extern unsigned FFTW(random_estimate_seed);
cannam@95 32 #endif
cannam@95 33
cannam@95 34 void useropt(const char *arg)
cannam@95 35 {
cannam@95 36 int x;
cannam@95 37 double y;
cannam@95 38
cannam@95 39 if (!strcmp(arg, "patient")) the_flags |= FFTW_PATIENT;
cannam@95 40 else if (!strcmp(arg, "estimate")) the_flags |= FFTW_ESTIMATE;
cannam@95 41 else if (!strcmp(arg, "estimatepat")) the_flags |= FFTW_ESTIMATE_PATIENT;
cannam@95 42 else if (!strcmp(arg, "exhaustive")) the_flags |= FFTW_EXHAUSTIVE;
cannam@95 43 else if (!strcmp(arg, "unaligned")) the_flags |= FFTW_UNALIGNED;
cannam@95 44 else if (!strcmp(arg, "nosimd")) the_flags |= FFTW_NO_SIMD;
cannam@95 45 else if (!strcmp(arg, "noindirectop")) the_flags |= FFTW_NO_INDIRECT_OP;
cannam@95 46 else if (!strcmp(arg, "wisdom-only")) the_flags |= FFTW_WISDOM_ONLY;
cannam@95 47 else if (sscanf(arg, "flag=%d", &x) == 1) the_flags |= x;
cannam@95 48 else if (sscanf(arg, "bflag=%d", &x) == 1) the_flags |= 1U << x;
cannam@95 49 else if (!strcmp(arg, "paranoid")) paranoid = 1;
cannam@95 50 else if (!strcmp(arg, "wisdom")) usewisdom = 1;
cannam@95 51 else if (!strcmp(arg, "amnesia")) amnesia = 1;
cannam@95 52 else if (sscanf(arg, "nthreads=%d", &x) == 1) nthreads = x;
cannam@95 53 #ifdef FFTW_RANDOM_ESTIMATOR
cannam@95 54 else if (sscanf(arg, "eseed=%d", &x) == 1) FFTW(random_estimate_seed) = x;
cannam@95 55 #endif
cannam@95 56 else if (sscanf(arg, "timelimit=%lg", &y) == 1) {
cannam@95 57 FFTW(set_timelimit)(y);
cannam@95 58 }
cannam@95 59
cannam@95 60 else fprintf(stderr, "unknown user option: %s. Ignoring.\n", arg);
cannam@95 61 }
cannam@95 62
cannam@95 63 void rdwisdom(void)
cannam@95 64 {
cannam@95 65 FILE *f;
cannam@95 66 double tim;
cannam@95 67 int success = 0;
cannam@95 68
cannam@95 69 if (havewisdom) return;
cannam@95 70
cannam@95 71 #ifdef HAVE_SMP
cannam@95 72 if (threads_ok) {
cannam@95 73 BENCH_ASSERT(FFTW(init_threads)());
cannam@95 74 FFTW(plan_with_nthreads)(nthreads);
cannam@95 75 #ifdef _OPENMP
cannam@95 76 omp_set_num_threads(nthreads);
cannam@95 77 #endif
cannam@95 78 }
cannam@95 79 else if (nthreads > 1 && verbose > 1) {
cannam@95 80 fprintf(stderr, "bench: WARNING - nthreads = %d, but threads not supported\n", nthreads);
cannam@95 81 nthreads = 1;
cannam@95 82 }
cannam@95 83 #endif
cannam@95 84
cannam@95 85 if (!usewisdom) return;
cannam@95 86
cannam@95 87 timer_start(USER_TIMER);
cannam@95 88 if ((f = fopen(wisdat, "r"))) {
cannam@95 89 if (!import_wisdom(f))
cannam@95 90 fprintf(stderr, "bench: ERROR reading wisdom\n");
cannam@95 91 else
cannam@95 92 success = 1;
cannam@95 93 fclose(f);
cannam@95 94 }
cannam@95 95 tim = timer_stop(USER_TIMER);
cannam@95 96
cannam@95 97 if (success) {
cannam@95 98 if (verbose > 1) printf("READ WISDOM (%g seconds): ", tim);
cannam@95 99
cannam@95 100 if (verbose > 3)
cannam@95 101 export_wisdom(stdout);
cannam@95 102 if (verbose > 1)
cannam@95 103 printf("\n");
cannam@95 104 }
cannam@95 105 havewisdom = 1;
cannam@95 106 }
cannam@95 107
cannam@95 108 void wrwisdom(void)
cannam@95 109 {
cannam@95 110 FILE *f;
cannam@95 111 double tim;
cannam@95 112 if (!havewisdom) return;
cannam@95 113
cannam@95 114 timer_start(USER_TIMER);
cannam@95 115 if ((f = fopen(wisdat, "w"))) {
cannam@95 116 export_wisdom(f);
cannam@95 117 fclose(f);
cannam@95 118 }
cannam@95 119 tim = timer_stop(USER_TIMER);
cannam@95 120 if (verbose > 1) printf("write wisdom took %g seconds\n", tim);
cannam@95 121 }
cannam@95 122
cannam@95 123 static unsigned preserve_input_flags(bench_problem *p)
cannam@95 124 {
cannam@95 125 /*
cannam@95 126 * fftw3 cannot preserve input for multidimensional c2r transforms.
cannam@95 127 * Enforce FFTW_DESTROY_INPUT
cannam@95 128 */
cannam@95 129 if (p->kind == PROBLEM_REAL &&
cannam@95 130 p->sign > 0 &&
cannam@95 131 !p->in_place &&
cannam@95 132 p->sz->rnk > 1)
cannam@95 133 p->destroy_input = 1;
cannam@95 134
cannam@95 135 if (p->destroy_input)
cannam@95 136 return FFTW_DESTROY_INPUT;
cannam@95 137 else
cannam@95 138 return FFTW_PRESERVE_INPUT;
cannam@95 139 }
cannam@95 140
cannam@95 141 int can_do(bench_problem *p)
cannam@95 142 {
cannam@95 143 double tim;
cannam@95 144
cannam@95 145 if (verbose > 2 && p->pstring)
cannam@95 146 printf("Planning %s...\n", p->pstring);
cannam@95 147 rdwisdom();
cannam@95 148
cannam@95 149 timer_start(USER_TIMER);
cannam@95 150 the_plan = mkplan(p, preserve_input_flags(p) | the_flags | FFTW_ESTIMATE);
cannam@95 151 tim = timer_stop(USER_TIMER);
cannam@95 152 if (verbose > 2) printf("estimate-planner time: %g s\n", tim);
cannam@95 153
cannam@95 154 if (the_plan) {
cannam@95 155 FFTW(destroy_plan)(the_plan);
cannam@95 156 return 1;
cannam@95 157 }
cannam@95 158 return 0;
cannam@95 159 }
cannam@95 160
cannam@95 161 void setup(bench_problem *p)
cannam@95 162 {
cannam@95 163 double tim;
cannam@95 164
cannam@95 165 if (amnesia) {
cannam@95 166 FFTW(forget_wisdom)();
cannam@95 167 havewisdom = 0;
cannam@95 168 }
cannam@95 169
cannam@95 170 /* Regression test: check that fftw_malloc exists and links
cannam@95 171 * properly */
cannam@95 172 FFTW(free(FFTW(malloc(42))));
cannam@95 173
cannam@95 174 rdwisdom();
cannam@95 175 install_hook();
cannam@95 176
cannam@95 177 #ifdef HAVE_SMP
cannam@95 178 if (verbose > 1 && nthreads > 1) printf("NTHREADS = %d\n", nthreads);
cannam@95 179 #endif
cannam@95 180
cannam@95 181 timer_start(USER_TIMER);
cannam@95 182 the_plan = mkplan(p, preserve_input_flags(p) | the_flags);
cannam@95 183 tim = timer_stop(USER_TIMER);
cannam@95 184 if (verbose > 1) printf("planner time: %g s\n", tim);
cannam@95 185
cannam@95 186 BENCH_ASSERT(the_plan);
cannam@95 187
cannam@95 188 {
cannam@95 189 double add, mul, nfma, cost, pcost;
cannam@95 190 FFTW(flops)(the_plan, &add, &mul, &nfma);
cannam@95 191 cost = FFTW(estimate_cost)(the_plan);
cannam@95 192 pcost = FFTW(cost)(the_plan);
cannam@95 193 if (verbose > 1) {
cannam@95 194 FFTW(print_plan)(the_plan);
cannam@95 195 printf("\n");
cannam@95 196 printf("flops: %0.0f add, %0.0f mul, %0.0f fma\n",
cannam@95 197 add, mul, nfma);
cannam@95 198 printf("estimated cost: %f, pcost = %f\n", cost, pcost);
cannam@95 199 }
cannam@95 200 }
cannam@95 201 }
cannam@95 202
cannam@95 203
cannam@95 204 void doit(int iter, bench_problem *p)
cannam@95 205 {
cannam@95 206 int i;
cannam@95 207 FFTW(plan) q = the_plan;
cannam@95 208
cannam@95 209 UNUSED(p);
cannam@95 210 for (i = 0; i < iter; ++i)
cannam@95 211 FFTW(execute)(q);
cannam@95 212 }
cannam@95 213
cannam@95 214 void done(bench_problem *p)
cannam@95 215 {
cannam@95 216 UNUSED(p);
cannam@95 217
cannam@95 218 FFTW(destroy_plan)(the_plan);
cannam@95 219 uninstall_hook();
cannam@95 220 }
cannam@95 221
cannam@95 222 void cleanup(void)
cannam@95 223 {
cannam@95 224 initial_cleanup();
cannam@95 225
cannam@95 226 wrwisdom();
cannam@95 227 #ifdef HAVE_SMP
cannam@95 228 FFTW(cleanup_threads)();
cannam@95 229 #else
cannam@95 230 FFTW(cleanup)();
cannam@95 231 #endif
cannam@95 232
cannam@95 233 # ifdef FFTW_DEBUG_MALLOC
cannam@95 234 {
cannam@95 235 /* undocumented memory checker */
cannam@95 236 FFTW_EXTERN void FFTW(malloc_print_minfo)(int v);
cannam@95 237 FFTW(malloc_print_minfo)(verbose);
cannam@95 238 }
cannam@95 239 # endif
cannam@95 240
cannam@95 241 final_cleanup();
cannam@95 242 }