annotate fft/fftw/fftw-3.3.4/tests/fftw-bench.c @ 40:223f770b5341 kissfft-double tip

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