annotate src/fftw-3.3.8/tests/bench.c @ 84:08ae793730bd

Add null config files
author Chris Cannam
date Mon, 02 Mar 2020 14:03:47 +0000
parents d0c2a83c1364
children
rev   line source
Chris@82 1 /**************************************************************************/
Chris@82 2 /* NOTE to users: this is the FFTW self-test and benchmark program.
Chris@82 3 It is probably NOT a good place to learn FFTW usage, since it has a
Chris@82 4 lot of added complexity in order to exercise and test the full API,
Chris@82 5 etcetera. We suggest reading the manual.
Chris@82 6
Chris@82 7 (Some of the self-test code is split off into fftw-bench.c and
Chris@82 8 hook.c.) */
Chris@82 9 /**************************************************************************/
Chris@82 10
Chris@82 11 #include <math.h>
Chris@82 12 #include <stdio.h>
Chris@82 13 #include <string.h>
Chris@82 14 #include "tests/fftw-bench.h"
Chris@82 15
Chris@82 16 static const char *mkversion(void) { return FFTW(version); }
Chris@82 17 static const char *mkcc(void) { return FFTW(cc); }
Chris@82 18 static const char *mkcodelet_optim(void) { return FFTW(codelet_optim); }
Chris@82 19
Chris@82 20 BEGIN_BENCH_DOC
Chris@82 21 BENCH_DOC("name", "fftw3")
Chris@82 22 BENCH_DOCF("version", mkversion)
Chris@82 23 BENCH_DOCF("cc", mkcc)
Chris@82 24 BENCH_DOCF("codelet-optim", mkcodelet_optim)
Chris@82 25 END_BENCH_DOC
Chris@82 26
Chris@82 27 static FFTW(iodim) *bench_tensor_to_fftw_iodim(bench_tensor *t)
Chris@82 28 {
Chris@82 29 FFTW(iodim) *d;
Chris@82 30 int i;
Chris@82 31
Chris@82 32 BENCH_ASSERT(t->rnk >= 0);
Chris@82 33 if (t->rnk == 0) return 0;
Chris@82 34
Chris@82 35 d = (FFTW(iodim) *)bench_malloc(sizeof(FFTW(iodim)) * t->rnk);
Chris@82 36 for (i = 0; i < t->rnk; ++i) {
Chris@82 37 d[i].n = t->dims[i].n;
Chris@82 38 d[i].is = t->dims[i].is;
Chris@82 39 d[i].os = t->dims[i].os;
Chris@82 40 }
Chris@82 41
Chris@82 42 return d;
Chris@82 43 }
Chris@82 44
Chris@82 45 static void extract_reim_split(int sign, int size, bench_real *p,
Chris@82 46 bench_real **r, bench_real **i)
Chris@82 47 {
Chris@82 48 if (sign == FFTW_FORWARD) {
Chris@82 49 *r = p + 0;
Chris@82 50 *i = p + size;
Chris@82 51 } else {
Chris@82 52 *r = p + size;
Chris@82 53 *i = p + 0;
Chris@82 54 }
Chris@82 55 }
Chris@82 56
Chris@82 57 static int sizeof_problem(bench_problem *p)
Chris@82 58 {
Chris@82 59 return tensor_sz(p->sz) * tensor_sz(p->vecsz);
Chris@82 60 }
Chris@82 61
Chris@82 62 /* ouch */
Chris@82 63 static int expressible_as_api_many(bench_tensor *t)
Chris@82 64 {
Chris@82 65 int i;
Chris@82 66
Chris@82 67 BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk));
Chris@82 68
Chris@82 69 i = t->rnk - 1;
Chris@82 70 while (--i >= 0) {
Chris@82 71 bench_iodim *d = t->dims + i;
Chris@82 72 if (d[0].is % d[1].is) return 0;
Chris@82 73 if (d[0].os % d[1].os) return 0;
Chris@82 74 }
Chris@82 75 return 1;
Chris@82 76 }
Chris@82 77
Chris@82 78 static int *mkn(bench_tensor *t)
Chris@82 79 {
Chris@82 80 int *n = (int *) bench_malloc(sizeof(int *) * t->rnk);
Chris@82 81 int i;
Chris@82 82 for (i = 0; i < t->rnk; ++i)
Chris@82 83 n[i] = t->dims[i].n;
Chris@82 84 return n;
Chris@82 85 }
Chris@82 86
Chris@82 87 static void mknembed_many(bench_tensor *t, int **inembedp, int **onembedp)
Chris@82 88 {
Chris@82 89 int i;
Chris@82 90 bench_iodim *d;
Chris@82 91 int *inembed = (int *) bench_malloc(sizeof(int *) * t->rnk);
Chris@82 92 int *onembed = (int *) bench_malloc(sizeof(int *) * t->rnk);
Chris@82 93
Chris@82 94 BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk));
Chris@82 95 *inembedp = inembed; *onembedp = onembed;
Chris@82 96
Chris@82 97 i = t->rnk - 1;
Chris@82 98 while (--i >= 0) {
Chris@82 99 d = t->dims + i;
Chris@82 100 inembed[i+1] = d[0].is / d[1].is;
Chris@82 101 onembed[i+1] = d[0].os / d[1].os;
Chris@82 102 }
Chris@82 103 }
Chris@82 104
Chris@82 105 /* try to use the most appropriate API function. Big mess. */
Chris@82 106
Chris@82 107 static int imax(int a, int b) { return (a > b ? a : b); }
Chris@82 108
Chris@82 109 static int halfish_sizeof_problem(bench_problem *p)
Chris@82 110 {
Chris@82 111 int n2 = sizeof_problem(p);
Chris@82 112 if (BENCH_FINITE_RNK(p->sz->rnk) && p->sz->rnk > 0)
Chris@82 113 n2 = (n2 / imax(p->sz->dims[p->sz->rnk - 1].n, 1)) *
Chris@82 114 (p->sz->dims[p->sz->rnk - 1].n / 2 + 1);
Chris@82 115 return n2;
Chris@82 116 }
Chris@82 117
Chris@82 118 static FFTW(plan) mkplan_real_split(bench_problem *p, unsigned flags)
Chris@82 119 {
Chris@82 120 FFTW(plan) pln;
Chris@82 121 bench_tensor *sz = p->sz, *vecsz = p->vecsz;
Chris@82 122 FFTW(iodim) *dims, *howmany_dims;
Chris@82 123 bench_real *ri, *ii, *ro, *io;
Chris@82 124 int n2 = halfish_sizeof_problem(p);
Chris@82 125
Chris@82 126 extract_reim_split(FFTW_FORWARD, n2, (bench_real *) p->in, &ri, &ii);
Chris@82 127 extract_reim_split(FFTW_FORWARD, n2, (bench_real *) p->out, &ro, &io);
Chris@82 128
Chris@82 129 dims = bench_tensor_to_fftw_iodim(sz);
Chris@82 130 howmany_dims = bench_tensor_to_fftw_iodim(vecsz);
Chris@82 131 if (p->sign < 0) {
Chris@82 132 if (verbose > 2) printf("using plan_guru_split_dft_r2c\n");
Chris@82 133 pln = FFTW(plan_guru_split_dft_r2c)(sz->rnk, dims,
Chris@82 134 vecsz->rnk, howmany_dims,
Chris@82 135 ri, ro, io, flags);
Chris@82 136 }
Chris@82 137 else {
Chris@82 138 if (verbose > 2) printf("using plan_guru_split_dft_c2r\n");
Chris@82 139 pln = FFTW(plan_guru_split_dft_c2r)(sz->rnk, dims,
Chris@82 140 vecsz->rnk, howmany_dims,
Chris@82 141 ri, ii, ro, flags);
Chris@82 142 }
Chris@82 143 bench_free(dims);
Chris@82 144 bench_free(howmany_dims);
Chris@82 145 return pln;
Chris@82 146 }
Chris@82 147
Chris@82 148 static FFTW(plan) mkplan_real_interleaved(bench_problem *p, unsigned flags)
Chris@82 149 {
Chris@82 150 FFTW(plan) pln;
Chris@82 151 bench_tensor *sz = p->sz, *vecsz = p->vecsz;
Chris@82 152
Chris@82 153 if (vecsz->rnk == 0 && tensor_unitstridep(sz)
Chris@82 154 && tensor_real_rowmajorp(sz, p->sign, p->in_place))
Chris@82 155 goto api_simple;
Chris@82 156
Chris@82 157 if (vecsz->rnk == 1 && expressible_as_api_many(sz))
Chris@82 158 goto api_many;
Chris@82 159
Chris@82 160 goto api_guru;
Chris@82 161
Chris@82 162 api_simple:
Chris@82 163 switch (sz->rnk) {
Chris@82 164 case 1:
Chris@82 165 if (p->sign < 0) {
Chris@82 166 if (verbose > 2) printf("using plan_dft_r2c_1d\n");
Chris@82 167 return FFTW(plan_dft_r2c_1d)(sz->dims[0].n,
Chris@82 168 (bench_real *) p->in,
Chris@82 169 (bench_complex *) p->out,
Chris@82 170 flags);
Chris@82 171 }
Chris@82 172 else {
Chris@82 173 if (verbose > 2) printf("using plan_dft_c2r_1d\n");
Chris@82 174 return FFTW(plan_dft_c2r_1d)(sz->dims[0].n,
Chris@82 175 (bench_complex *) p->in,
Chris@82 176 (bench_real *) p->out,
Chris@82 177 flags);
Chris@82 178 }
Chris@82 179 break;
Chris@82 180 case 2:
Chris@82 181 if (p->sign < 0) {
Chris@82 182 if (verbose > 2) printf("using plan_dft_r2c_2d\n");
Chris@82 183 return FFTW(plan_dft_r2c_2d)(sz->dims[0].n, sz->dims[1].n,
Chris@82 184 (bench_real *) p->in,
Chris@82 185 (bench_complex *) p->out,
Chris@82 186 flags);
Chris@82 187 }
Chris@82 188 else {
Chris@82 189 if (verbose > 2) printf("using plan_dft_c2r_2d\n");
Chris@82 190 return FFTW(plan_dft_c2r_2d)(sz->dims[0].n, sz->dims[1].n,
Chris@82 191 (bench_complex *) p->in,
Chris@82 192 (bench_real *) p->out,
Chris@82 193 flags);
Chris@82 194 }
Chris@82 195 break;
Chris@82 196 case 3:
Chris@82 197 if (p->sign < 0) {
Chris@82 198 if (verbose > 2) printf("using plan_dft_r2c_3d\n");
Chris@82 199 return FFTW(plan_dft_r2c_3d)(
Chris@82 200 sz->dims[0].n, sz->dims[1].n, sz->dims[2].n,
Chris@82 201 (bench_real *) p->in, (bench_complex *) p->out,
Chris@82 202 flags);
Chris@82 203 }
Chris@82 204 else {
Chris@82 205 if (verbose > 2) printf("using plan_dft_c2r_3d\n");
Chris@82 206 return FFTW(plan_dft_c2r_3d)(
Chris@82 207 sz->dims[0].n, sz->dims[1].n, sz->dims[2].n,
Chris@82 208 (bench_complex *) p->in, (bench_real *) p->out,
Chris@82 209 flags);
Chris@82 210 }
Chris@82 211 break;
Chris@82 212 default: {
Chris@82 213 int *n = mkn(sz);
Chris@82 214 if (p->sign < 0) {
Chris@82 215 if (verbose > 2) printf("using plan_dft_r2c\n");
Chris@82 216 pln = FFTW(plan_dft_r2c)(sz->rnk, n,
Chris@82 217 (bench_real *) p->in,
Chris@82 218 (bench_complex *) p->out,
Chris@82 219 flags);
Chris@82 220 }
Chris@82 221 else {
Chris@82 222 if (verbose > 2) printf("using plan_dft_c2r\n");
Chris@82 223 pln = FFTW(plan_dft_c2r)(sz->rnk, n,
Chris@82 224 (bench_complex *) p->in,
Chris@82 225 (bench_real *) p->out,
Chris@82 226 flags);
Chris@82 227 }
Chris@82 228 bench_free(n);
Chris@82 229 return pln;
Chris@82 230 }
Chris@82 231 }
Chris@82 232
Chris@82 233 api_many:
Chris@82 234 {
Chris@82 235 int *n, *inembed, *onembed;
Chris@82 236 BENCH_ASSERT(vecsz->rnk == 1);
Chris@82 237 n = mkn(sz);
Chris@82 238 mknembed_many(sz, &inembed, &onembed);
Chris@82 239 if (p->sign < 0) {
Chris@82 240 if (verbose > 2) printf("using plan_many_dft_r2c\n");
Chris@82 241 pln = FFTW(plan_many_dft_r2c)(
Chris@82 242 sz->rnk, n, vecsz->dims[0].n,
Chris@82 243 (bench_real *) p->in, inembed,
Chris@82 244 sz->dims[sz->rnk - 1].is, vecsz->dims[0].is,
Chris@82 245 (bench_complex *) p->out, onembed,
Chris@82 246 sz->dims[sz->rnk - 1].os, vecsz->dims[0].os,
Chris@82 247 flags);
Chris@82 248 }
Chris@82 249 else {
Chris@82 250 if (verbose > 2) printf("using plan_many_dft_c2r\n");
Chris@82 251 pln = FFTW(plan_many_dft_c2r)(
Chris@82 252 sz->rnk, n, vecsz->dims[0].n,
Chris@82 253 (bench_complex *) p->in, inembed,
Chris@82 254 sz->dims[sz->rnk - 1].is, vecsz->dims[0].is,
Chris@82 255 (bench_real *) p->out, onembed,
Chris@82 256 sz->dims[sz->rnk - 1].os, vecsz->dims[0].os,
Chris@82 257 flags);
Chris@82 258 }
Chris@82 259 bench_free(n); bench_free(inembed); bench_free(onembed);
Chris@82 260 return pln;
Chris@82 261 }
Chris@82 262
Chris@82 263 api_guru:
Chris@82 264 {
Chris@82 265 FFTW(iodim) *dims, *howmany_dims;
Chris@82 266
Chris@82 267 if (p->sign < 0) {
Chris@82 268 dims = bench_tensor_to_fftw_iodim(sz);
Chris@82 269 howmany_dims = bench_tensor_to_fftw_iodim(vecsz);
Chris@82 270 if (verbose > 2) printf("using plan_guru_dft_r2c\n");
Chris@82 271 pln = FFTW(plan_guru_dft_r2c)(sz->rnk, dims,
Chris@82 272 vecsz->rnk, howmany_dims,
Chris@82 273 (bench_real *) p->in,
Chris@82 274 (bench_complex *) p->out,
Chris@82 275 flags);
Chris@82 276 }
Chris@82 277 else {
Chris@82 278 dims = bench_tensor_to_fftw_iodim(sz);
Chris@82 279 howmany_dims = bench_tensor_to_fftw_iodim(vecsz);
Chris@82 280 if (verbose > 2) printf("using plan_guru_dft_c2r\n");
Chris@82 281 pln = FFTW(plan_guru_dft_c2r)(sz->rnk, dims,
Chris@82 282 vecsz->rnk, howmany_dims,
Chris@82 283 (bench_complex *) p->in,
Chris@82 284 (bench_real *) p->out,
Chris@82 285 flags);
Chris@82 286 }
Chris@82 287 bench_free(dims);
Chris@82 288 bench_free(howmany_dims);
Chris@82 289 return pln;
Chris@82 290 }
Chris@82 291 }
Chris@82 292
Chris@82 293 static FFTW(plan) mkplan_real(bench_problem *p, unsigned flags)
Chris@82 294 {
Chris@82 295 if (p->split)
Chris@82 296 return mkplan_real_split(p, flags);
Chris@82 297 else
Chris@82 298 return mkplan_real_interleaved(p, flags);
Chris@82 299 }
Chris@82 300
Chris@82 301 static FFTW(plan) mkplan_complex_split(bench_problem *p, unsigned flags)
Chris@82 302 {
Chris@82 303 FFTW(plan) pln;
Chris@82 304 bench_tensor *sz = p->sz, *vecsz = p->vecsz;
Chris@82 305 FFTW(iodim) *dims, *howmany_dims;
Chris@82 306 bench_real *ri, *ii, *ro, *io;
Chris@82 307
Chris@82 308 extract_reim_split(p->sign, p->iphyssz, (bench_real *) p->in, &ri, &ii);
Chris@82 309 extract_reim_split(p->sign, p->ophyssz, (bench_real *) p->out, &ro, &io);
Chris@82 310
Chris@82 311 dims = bench_tensor_to_fftw_iodim(sz);
Chris@82 312 howmany_dims = bench_tensor_to_fftw_iodim(vecsz);
Chris@82 313 if (verbose > 2) printf("using plan_guru_split_dft\n");
Chris@82 314 pln = FFTW(plan_guru_split_dft)(sz->rnk, dims,
Chris@82 315 vecsz->rnk, howmany_dims,
Chris@82 316 ri, ii, ro, io, flags);
Chris@82 317 bench_free(dims);
Chris@82 318 bench_free(howmany_dims);
Chris@82 319 return pln;
Chris@82 320 }
Chris@82 321
Chris@82 322 static FFTW(plan) mkplan_complex_interleaved(bench_problem *p, unsigned flags)
Chris@82 323 {
Chris@82 324 FFTW(plan) pln;
Chris@82 325 bench_tensor *sz = p->sz, *vecsz = p->vecsz;
Chris@82 326
Chris@82 327 if (vecsz->rnk == 0 && tensor_unitstridep(sz) && tensor_rowmajorp(sz))
Chris@82 328 goto api_simple;
Chris@82 329
Chris@82 330 if (vecsz->rnk == 1 && expressible_as_api_many(sz))
Chris@82 331 goto api_many;
Chris@82 332
Chris@82 333 goto api_guru;
Chris@82 334
Chris@82 335 api_simple:
Chris@82 336 switch (sz->rnk) {
Chris@82 337 case 1:
Chris@82 338 if (verbose > 2) printf("using plan_dft_1d\n");
Chris@82 339 return FFTW(plan_dft_1d)(sz->dims[0].n,
Chris@82 340 (bench_complex *) p->in,
Chris@82 341 (bench_complex *) p->out,
Chris@82 342 p->sign, flags);
Chris@82 343 break;
Chris@82 344 case 2:
Chris@82 345 if (verbose > 2) printf("using plan_dft_2d\n");
Chris@82 346 return FFTW(plan_dft_2d)(sz->dims[0].n, sz->dims[1].n,
Chris@82 347 (bench_complex *) p->in,
Chris@82 348 (bench_complex *) p->out,
Chris@82 349 p->sign, flags);
Chris@82 350 break;
Chris@82 351 case 3:
Chris@82 352 if (verbose > 2) printf("using plan_dft_3d\n");
Chris@82 353 return FFTW(plan_dft_3d)(
Chris@82 354 sz->dims[0].n, sz->dims[1].n, sz->dims[2].n,
Chris@82 355 (bench_complex *) p->in, (bench_complex *) p->out,
Chris@82 356 p->sign, flags);
Chris@82 357 break;
Chris@82 358 default: {
Chris@82 359 int *n = mkn(sz);
Chris@82 360 if (verbose > 2) printf("using plan_dft\n");
Chris@82 361 pln = FFTW(plan_dft)(sz->rnk, n,
Chris@82 362 (bench_complex *) p->in,
Chris@82 363 (bench_complex *) p->out, p->sign, flags);
Chris@82 364 bench_free(n);
Chris@82 365 return pln;
Chris@82 366 }
Chris@82 367 }
Chris@82 368
Chris@82 369 api_many:
Chris@82 370 {
Chris@82 371 int *n, *inembed, *onembed;
Chris@82 372 BENCH_ASSERT(vecsz->rnk == 1);
Chris@82 373 n = mkn(sz);
Chris@82 374 mknembed_many(sz, &inembed, &onembed);
Chris@82 375 if (verbose > 2) printf("using plan_many_dft\n");
Chris@82 376 pln = FFTW(plan_many_dft)(
Chris@82 377 sz->rnk, n, vecsz->dims[0].n,
Chris@82 378 (bench_complex *) p->in,
Chris@82 379 inembed, sz->dims[sz->rnk - 1].is, vecsz->dims[0].is,
Chris@82 380 (bench_complex *) p->out,
Chris@82 381 onembed, sz->dims[sz->rnk - 1].os, vecsz->dims[0].os,
Chris@82 382 p->sign, flags);
Chris@82 383 bench_free(n); bench_free(inembed); bench_free(onembed);
Chris@82 384 return pln;
Chris@82 385 }
Chris@82 386
Chris@82 387 api_guru:
Chris@82 388 {
Chris@82 389 FFTW(iodim) *dims, *howmany_dims;
Chris@82 390
Chris@82 391 dims = bench_tensor_to_fftw_iodim(sz);
Chris@82 392 howmany_dims = bench_tensor_to_fftw_iodim(vecsz);
Chris@82 393 if (verbose > 2) printf("using plan_guru_dft\n");
Chris@82 394 pln = FFTW(plan_guru_dft)(sz->rnk, dims,
Chris@82 395 vecsz->rnk, howmany_dims,
Chris@82 396 (bench_complex *) p->in,
Chris@82 397 (bench_complex *) p->out,
Chris@82 398 p->sign, flags);
Chris@82 399 bench_free(dims);
Chris@82 400 bench_free(howmany_dims);
Chris@82 401 return pln;
Chris@82 402 }
Chris@82 403 }
Chris@82 404
Chris@82 405 static FFTW(plan) mkplan_complex(bench_problem *p, unsigned flags)
Chris@82 406 {
Chris@82 407 if (p->split)
Chris@82 408 return mkplan_complex_split(p, flags);
Chris@82 409 else
Chris@82 410 return mkplan_complex_interleaved(p, flags);
Chris@82 411 }
Chris@82 412
Chris@82 413 static FFTW(plan) mkplan_r2r(bench_problem *p, unsigned flags)
Chris@82 414 {
Chris@82 415 FFTW(plan) pln;
Chris@82 416 bench_tensor *sz = p->sz, *vecsz = p->vecsz;
Chris@82 417 FFTW(r2r_kind) *k;
Chris@82 418
Chris@82 419 k = (FFTW(r2r_kind) *) bench_malloc(sizeof(FFTW(r2r_kind)) * sz->rnk);
Chris@82 420 {
Chris@82 421 int i;
Chris@82 422 for (i = 0; i < sz->rnk; ++i)
Chris@82 423 switch (p->k[i]) {
Chris@82 424 case R2R_R2HC: k[i] = FFTW_R2HC; break;
Chris@82 425 case R2R_HC2R: k[i] = FFTW_HC2R; break;
Chris@82 426 case R2R_DHT: k[i] = FFTW_DHT; break;
Chris@82 427 case R2R_REDFT00: k[i] = FFTW_REDFT00; break;
Chris@82 428 case R2R_REDFT01: k[i] = FFTW_REDFT01; break;
Chris@82 429 case R2R_REDFT10: k[i] = FFTW_REDFT10; break;
Chris@82 430 case R2R_REDFT11: k[i] = FFTW_REDFT11; break;
Chris@82 431 case R2R_RODFT00: k[i] = FFTW_RODFT00; break;
Chris@82 432 case R2R_RODFT01: k[i] = FFTW_RODFT01; break;
Chris@82 433 case R2R_RODFT10: k[i] = FFTW_RODFT10; break;
Chris@82 434 case R2R_RODFT11: k[i] = FFTW_RODFT11; break;
Chris@82 435 default: BENCH_ASSERT(0);
Chris@82 436 }
Chris@82 437 }
Chris@82 438
Chris@82 439 if (vecsz->rnk == 0 && tensor_unitstridep(sz) && tensor_rowmajorp(sz))
Chris@82 440 goto api_simple;
Chris@82 441
Chris@82 442 if (vecsz->rnk == 1 && expressible_as_api_many(sz))
Chris@82 443 goto api_many;
Chris@82 444
Chris@82 445 goto api_guru;
Chris@82 446
Chris@82 447 api_simple:
Chris@82 448 switch (sz->rnk) {
Chris@82 449 case 1:
Chris@82 450 if (verbose > 2) printf("using plan_r2r_1d\n");
Chris@82 451 pln = FFTW(plan_r2r_1d)(sz->dims[0].n,
Chris@82 452 (bench_real *) p->in,
Chris@82 453 (bench_real *) p->out,
Chris@82 454 k[0], flags);
Chris@82 455 goto done;
Chris@82 456 case 2:
Chris@82 457 if (verbose > 2) printf("using plan_r2r_2d\n");
Chris@82 458 pln = FFTW(plan_r2r_2d)(sz->dims[0].n, sz->dims[1].n,
Chris@82 459 (bench_real *) p->in,
Chris@82 460 (bench_real *) p->out,
Chris@82 461 k[0], k[1], flags);
Chris@82 462 goto done;
Chris@82 463 case 3:
Chris@82 464 if (verbose > 2) printf("using plan_r2r_3d\n");
Chris@82 465 pln = FFTW(plan_r2r_3d)(
Chris@82 466 sz->dims[0].n, sz->dims[1].n, sz->dims[2].n,
Chris@82 467 (bench_real *) p->in, (bench_real *) p->out,
Chris@82 468 k[0], k[1], k[2], flags);
Chris@82 469 goto done;
Chris@82 470 default: {
Chris@82 471 int *n = mkn(sz);
Chris@82 472 if (verbose > 2) printf("using plan_r2r\n");
Chris@82 473 pln = FFTW(plan_r2r)(sz->rnk, n,
Chris@82 474 (bench_real *) p->in, (bench_real *) p->out,
Chris@82 475 k, flags);
Chris@82 476 bench_free(n);
Chris@82 477 goto done;
Chris@82 478 }
Chris@82 479 }
Chris@82 480
Chris@82 481 api_many:
Chris@82 482 {
Chris@82 483 int *n, *inembed, *onembed;
Chris@82 484 BENCH_ASSERT(vecsz->rnk == 1);
Chris@82 485 n = mkn(sz);
Chris@82 486 mknembed_many(sz, &inembed, &onembed);
Chris@82 487 if (verbose > 2) printf("using plan_many_r2r\n");
Chris@82 488 pln = FFTW(plan_many_r2r)(
Chris@82 489 sz->rnk, n, vecsz->dims[0].n,
Chris@82 490 (bench_real *) p->in,
Chris@82 491 inembed, sz->dims[sz->rnk - 1].is, vecsz->dims[0].is,
Chris@82 492 (bench_real *) p->out,
Chris@82 493 onembed, sz->dims[sz->rnk - 1].os, vecsz->dims[0].os,
Chris@82 494 k, flags);
Chris@82 495 bench_free(n); bench_free(inembed); bench_free(onembed);
Chris@82 496 goto done;
Chris@82 497 }
Chris@82 498
Chris@82 499 api_guru:
Chris@82 500 {
Chris@82 501 FFTW(iodim) *dims, *howmany_dims;
Chris@82 502
Chris@82 503 dims = bench_tensor_to_fftw_iodim(sz);
Chris@82 504 howmany_dims = bench_tensor_to_fftw_iodim(vecsz);
Chris@82 505 if (verbose > 2) printf("using plan_guru_r2r\n");
Chris@82 506 pln = FFTW(plan_guru_r2r)(sz->rnk, dims,
Chris@82 507 vecsz->rnk, howmany_dims,
Chris@82 508 (bench_real *) p->in,
Chris@82 509 (bench_real *) p->out, k, flags);
Chris@82 510 bench_free(dims);
Chris@82 511 bench_free(howmany_dims);
Chris@82 512 goto done;
Chris@82 513 }
Chris@82 514
Chris@82 515 done:
Chris@82 516 bench_free(k);
Chris@82 517 return pln;
Chris@82 518 }
Chris@82 519
Chris@82 520 FFTW(plan) mkplan(bench_problem *p, unsigned flags)
Chris@82 521 {
Chris@82 522 switch (p->kind) {
Chris@82 523 case PROBLEM_COMPLEX: return mkplan_complex(p, flags);
Chris@82 524 case PROBLEM_REAL: return mkplan_real(p, flags);
Chris@82 525 case PROBLEM_R2R: return mkplan_r2r(p, flags);
Chris@82 526 default: BENCH_ASSERT(0); return 0;
Chris@82 527 }
Chris@82 528 }
Chris@82 529
Chris@82 530 void main_init(int *argc, char ***argv)
Chris@82 531 {
Chris@82 532 UNUSED(argc);
Chris@82 533 UNUSED(argv);
Chris@82 534 }
Chris@82 535
Chris@82 536 void initial_cleanup(void)
Chris@82 537 {
Chris@82 538 }
Chris@82 539
Chris@82 540 void final_cleanup(void)
Chris@82 541 {
Chris@82 542 }
Chris@82 543
Chris@82 544 int import_wisdom(FILE *f)
Chris@82 545 {
Chris@82 546 return FFTW(import_wisdom_from_file)(f);
Chris@82 547 }
Chris@82 548
Chris@82 549 void export_wisdom(FILE *f)
Chris@82 550 {
Chris@82 551 FFTW(export_wisdom_to_file)(f);
Chris@82 552 }