34 static int comp1(
const void *x,
const void *y)
36 return ((*(
const R*) x) < (*(
const R*) y) ? -1 : 1);
39 static int comp2(
const void *x,
const void *y)
41 int nx0, nx1, ny0, ny1;
42 nx0 = global_n * (int)LRINT(*((
const R*) x + 0));
43 nx1 = global_n * (int)LRINT(*((
const R*) x + 1));
44 ny0 = global_n * (
int)LRINT(*((const R*) y + 0));
45 ny1 = global_n * (
int)LRINT(*((const R*) y + 1));
58 static
int comp3(const
void *x, const
void *y)
60 int nx0, nx1, nx2, ny0, ny1, ny2;
61 nx0 = global_n * (int)LRINT(*((
const R*) x + 0));
62 nx1 = global_n * (int)LRINT(*((
const R*) x + 1));
63 nx2 = global_n * (
int)LRINT(*((const R*) x + 2));
64 ny0 = global_n * (
int)LRINT(*((const R*) y + 0));
65 ny1 = global_n * (
int)LRINT(*((const R*) y + 1));
66 ny2 = global_n * (
int)LRINT(*((const R*) y + 2));
84 static
void measure_time_nfft(
int d,
int N,
unsigned test_ndft)
86 int r, M, NN[d], nn[d];
87 R t, t_fft, t_ndft, t_nfft;
93 printf("\\verb+%ld+&\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
95 for (r = 0, M = 1; r < d; r++)
102 NFFT(init_guru)(&p, d, NN, M, nn, 2,
106 FFTW_MEASURE | FFTW_DESTROY_INPUT);
108 p_fft = FFTW(plan_dft)(d, NN, p.f_hat, p.f, FFTW_FORWARD, FFTW_MEASURE);
111 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
120 qsort(p.x, (
size_t)(p.M_total), (
size_t)(d) *
sizeof(R), comp1);
125 qsort(p.x, (
size_t)(p.M_total), (
size_t)(d) *
sizeof(R), comp2);
130 qsort(p.x, (
size_t)(p.M_total), (
size_t)(d) *
sizeof(R), comp3);
135 NFFT(precompute_one_psi)(&p);
138 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
144 while (t_fft < K(1.0))
148 FFTW(execute)(p_fft);
150 t = NFFT(elapsed_seconds)(t1, t0);
156 printf(
"\\verb+%.1" __FES__
"+ &\t", t_fft);
163 while (t_ndft < K(1.0))
167 NFFT(trafo_direct)(&p);
169 t = NFFT(elapsed_seconds)(t1, t0);
174 printf(
"\\verb+%.1" __FES__
"+ &\t", t_ndft);
178 printf(
"\\verb+*+\t&\t");
183 while (t_nfft < K(1.0))
208 t = NFFT(elapsed_seconds)(t1, t0);
214 printf(
"\\verb+%.1" __FES__
"+ & \\verb+(%3.1" __FIS__
")+\\\\\n", t_nfft, t_nfft / t_fft);
216 FFTW(destroy_plan)(p_fft);
220 static void measure_time_nfft_XXX2(
int d,
int N,
unsigned test_ndft)
222 int r, M, NN[d], nn[d];
223 R t, t_fft, t_ndft, t_nfft;
229 printf("%ld\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
232 for (r = 0, M = 1; r < d; r++)
239 NFFT(init_guru)(&p, d, NN, M, nn, 2,
244 FFTW_MEASURE | FFTW_DESTROY_INPUT);
246 p_fft = FFTW(plan_dft)(d, NN, p.f_hat, p.f, FFTW_FORWARD, FFTW_MEASURE);
248 C *swapndft = (C*) NFFT(malloc)((size_t)(p.M_total) *
sizeof(C));
251 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
253 qsort(p.x, (
size_t)(p.M_total), (
size_t)(d) *
sizeof(R), comp1);
256 NFFT(precompute_one_psi)(&p);
259 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
264 while (t_fft < K(0.1))
268 FFTW(execute)(p_fft);
270 t = NFFT(elapsed_seconds)(t1, t0);
275 printf(
"%.1" __FES__
"\t", t_fft);
280 CSWAP(p.f, swapndft);
283 while (t_ndft < K(0.1))
287 NFFT(trafo_direct)(&p);
289 t = NFFT(elapsed_seconds)(t1, t0);
293 printf(
"%.1" __FES__
"\t", t_ndft);
294 CSWAP(p.f, swapndft);
302 while (t_nfft < K(0.1))
308 t = NFFT(elapsed_seconds)(t1, t0);
312 printf(
"%.1" __FES__
"\t", t_nfft);
314 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f, p.M_total));
319 while (t_nfft < K(0.1))
325 t = NFFT(elapsed_seconds)(t1, t0);
329 printf(
"%.1" __FES__
"\t", t_nfft);
331 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f, p.M_total));
335 NFFT(free)(swapndft);
336 FFTW(destroy_plan)(p_fft);
340 static void measure_time_nfft_XXX3(
int d,
int N,
unsigned test_ndft)
342 int r, M, NN[d], nn[d];
343 R t, t_fft, t_ndft, t_nfft;
349 printf("%ld\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
352 for (r = 0, M = 1; r < d; r++)
359 NFFT(init_guru)(&p, d, NN, M, nn, 2,
364 FFTW_MEASURE | FFTW_DESTROY_INPUT);
366 p_fft = FFTW(plan_dft)(d, NN, p.f, p.f_hat, FFTW_BACKWARD, FFTW_MEASURE);
368 C *swapndft = (C*) NFFT(malloc)((size_t)(p.N_total) *
sizeof(C));
371 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
373 qsort(p.x, (
size_t)(p.M_total), (
size_t)(d) *
sizeof(R), comp1);
376 NFFT(precompute_one_psi)(&p);
379 NFFT(vrand_unit_complex)(p.f, p.N_total);
384 while (t_fft < K(0.1))
388 FFTW(execute)(p_fft);
390 t = NFFT(elapsed_seconds)(t1, t0);
395 printf(
"%.1" __FES__
"\t", t_fft);
400 CSWAP(p.f_hat, swapndft);
403 while (t_ndft < K(0.1))
407 NFFT(adjoint_direct)(&p);
409 t = NFFT(elapsed_seconds)(t1, t0);
413 printf(
"%.1" __FES__
"\t", t_ndft);
414 CSWAP(p.f_hat, swapndft);
422 while (t_nfft < K(0.1))
428 t = NFFT(elapsed_seconds)(t1, t0);
432 printf(
"%.1" __FES__
"\t", t_nfft);
434 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f_hat, p.N_total));
439 while (t_nfft < K(0.1))
443 NFFT(adjoint_1d)(&p);
445 t = NFFT(elapsed_seconds)(t1, t0);
449 printf(
"%.1" __FES__
"\t", t_nfft);
451 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f_hat, p.N_total));
455 NFFT(free)(swapndft);
456 FFTW(destroy_plan)(p_fft);
460 static void measure_time_nfft_XXX4(
int d,
int N,
unsigned test_ndft)
462 int r, M, NN[d], nn[d];
463 R t, t_fft, t_ndft, t_nfft;
469 printf("%ld\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
472 for (r = 0, M = 1; r < d; r++)
479 NFFT(init_guru)(&p, d, NN, M, nn, 4,
484 FFTW_MEASURE | FFTW_DESTROY_INPUT);
486 p_fft = FFTW(plan_dft)(d, NN, p.f_hat, p.f, FFTW_FORWARD, FFTW_MEASURE);
488 C *swapndft = (C*) NFFT(malloc)((size_t)(p.M_total) *
sizeof(C));
491 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
499 NFFT(precompute_one_psi)(&p);
502 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
507 while (t_fft < K(0.1))
511 FFTW(execute)(p_fft);
513 t = NFFT(elapsed_seconds)(t1, t0);
518 printf(
"%.1" __FES__
"\t", t_fft);
521 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
526 CSWAP(p.f, swapndft);
529 while (t_ndft < K(0.1))
533 NFFT(trafo_direct)(&p);
535 t = NFFT(elapsed_seconds)(t1, t0);
539 printf(
"%.1" __FES__
"\t", t_ndft);
543 CSWAP(p.f, swapndft);
551 while (t_nfft < K(0.1))
557 t = NFFT(elapsed_seconds)(t1, t0);
561 printf(
"%.1" __FES__
"\t", t_nfft);
563 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f, p.M_total));
570 while (t_nfft < K(0.1))
576 t = NFFT(elapsed_seconds)(t1, t0);
580 printf(
"%.1" __FES__
"\t", t_nfft);
582 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f, p.M_total));
588 NFFT(free)(swapndft);
589 FFTW(destroy_plan)(p_fft);
593 static void measure_time_nfft_XXX5(
int d,
int N,
unsigned test_ndft)
595 int r, M, NN[d], nn[d];
596 R t, t_fft, t_ndft, t_nfft;
602 printf("%ld\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
605 for (r = 0, M = 1; r < d; r++)
612 NFFT(init_guru)(&p, d, NN, M, nn, 4,
617 FFTW_MEASURE | FFTW_DESTROY_INPUT);
619 p_fft = FFTW(plan_dft)(d, NN, p.f, p.f_hat, FFTW_FORWARD, FFTW_MEASURE);
621 C *swapndft = (C*) NFFT(malloc)((size_t)(p.N_total) *
sizeof(C));
624 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
628 NFFT(precompute_one_psi)(&p);
631 NFFT(vrand_unit_complex)(p.f, p.M_total);
636 while (t_fft < K(0.1))
640 FFTW(execute)(p_fft);
642 t = NFFT(elapsed_seconds)(t1, t0);
647 printf(
"%.1" __FES__
"\t", t_fft);
650 NFFT(vrand_unit_complex)(p.f, p.M_total);
655 CSWAP(p.f_hat, swapndft);
658 while (t_ndft < K(0.1))
662 NFFT(adjoint_direct)(&p);
664 t = NFFT(elapsed_seconds)(t1, t0);
668 printf(
"%.1" __FES__
"\t", t_ndft);
672 CSWAP(p.f_hat, swapndft);
680 while (t_nfft < K(0.1))
686 t = NFFT(elapsed_seconds)(t1, t0);
690 printf(
"%.1" __FES__
"\t", t_nfft);
692 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f_hat, p.N_total));
699 while (t_nfft < K(0.1))
703 NFFT(adjoint_2d)(&p);
705 t = NFFT(elapsed_seconds)(t1, t0);
709 printf(
"%.1" __FES__
"\t", t_nfft);
711 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f_hat, p.N_total));
717 NFFT(free)(swapndft);
718 FFTW(destroy_plan)(p_fft);
722 static void measure_time_nfft_XXX6(
int d,
int N,
unsigned test_ndft)
724 int r, M, NN[d], nn[d];
725 R t, t_fft, t_ndft, t_nfft;
731 printf("%ld\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
734 for (r = 0, M = 1; r < d; r++)
741 NFFT(init_guru)(&p, d, NN, M, nn, 2,
746 FFTW_MEASURE | FFTW_DESTROY_INPUT);
748 p_fft = FFTW(plan_dft)(d, NN, p.f_hat, p.f, FFTW_FORWARD, FFTW_MEASURE);
750 C *swapndft = (C*) NFFT(malloc)((size_t)(p.M_total) *
sizeof(C));
753 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
758 NFFT(precompute_one_psi)(&p);
761 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
766 while (t_fft < K(0.1))
770 FFTW(execute)(p_fft);
772 t = NFFT(elapsed_seconds)(t1, t0);
777 printf(
"%.1" __FES__
"\t", t_fft);
780 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
785 CSWAP(p.f, swapndft);
788 while (t_ndft < K(0.1))
792 NFFT(trafo_direct)(&p);
794 t = NFFT(elapsed_seconds)(t1, t0);
798 printf(
"%.1" __FES__
"\t", t_ndft);
802 CSWAP(p.f, swapndft);
810 while (t_nfft < K(0.1))
816 t = NFFT(elapsed_seconds)(t1, t0);
820 printf(
"%.1" __FES__
"\t", t_nfft);
822 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f, p.M_total));
829 while (t_nfft < K(0.1))
835 t = NFFT(elapsed_seconds)(t1, t0);
839 printf(
"%.1" __FES__
"\t", t_nfft);
841 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f, p.M_total));
847 NFFT(free)(swapndft);
848 FFTW(destroy_plan)(p_fft);
852 static void measure_time_nfft_XXX7(
int d,
int N,
unsigned test_ndft)
854 int r, M, NN[d], nn[d];
855 R t, t_fft, t_ndft, t_nfft;
861 printf("%ld\t", LRINT(LOG((R)(N)) / LOG((R)(2)) * (R)(d) + K(0.5)));
864 for (r = 0, M = 1; r < d; r++)
871 NFFT(init_guru)(&p, d, NN, M, nn, 2,
876 FFTW_MEASURE | FFTW_DESTROY_INPUT);
878 p_fft = FFTW(plan_dft)(d, NN, p.f, p.f_hat, FFTW_FORWARD, FFTW_MEASURE);
880 C *swapndft = (C*) NFFT(malloc)((size_t)(p.N_total) *
sizeof(C));
883 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
887 NFFT(precompute_one_psi)(&p);
890 NFFT(vrand_unit_complex)(p.f, p.M_total);
895 while (t_fft < K(0.1))
899 FFTW(execute)(p_fft);
901 t = NFFT(elapsed_seconds)(t1, t0);
906 printf(
"%.1" __FES__
"\t", t_fft);
909 NFFT(vrand_unit_complex)(p.f, p.M_total);
914 CSWAP(p.f_hat, swapndft);
917 while (t_ndft < K(0.1))
921 NFFT(adjoint_direct)(&p);
923 t = NFFT(elapsed_seconds)(t1, t0);
927 printf(
"%.1" __FES__
"\t", t_ndft);
931 CSWAP(p.f_hat, swapndft);
939 while (t_nfft < K(0.1))
945 t = NFFT(elapsed_seconds)(t1, t0);
949 printf(
"%.1" __FES__
"\t", t_nfft);
951 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f_hat, p.N_total));
958 while (t_nfft < K(0.1))
962 NFFT(adjoint_3d)(&p);
964 t = NFFT(elapsed_seconds)(t1, t0);
968 printf(
"%.1" __FES__
"\t", t_nfft);
970 printf(
"(%.1" __FES__
")\t", NFFT(error_l_2_complex)(swapndft, p.f_hat, p.N_total));
976 NFFT(free)(swapndft);
977 FFTW(destroy_plan)(p_fft);
1018 UNUSED(measure_time_nfft_XXX2);
1019 UNUSED(measure_time_nfft_XXX3);
1020 UNUSED(measure_time_nfft_XXX4);
1021 UNUSED(measure_time_nfft_XXX5);
1022 UNUSED(measure_time_nfft_XXX6);
1023 UNUSED(measure_time_nfft_XXX7);
1025 printf(
"\\hline $l_N$ & FFT & NDFT & NFFT & NFFT/FFT\\\\\n");
1026 printf(
"\\hline \\hline \\multicolumn{5}{|c|}{$d=1$} \\\\ \\hline\n");
1027 for (l = 3; l <= 22; l++)
1031 int N = (int)(1U << (logIN / d));
1032 measure_time_nfft(d, N, logIN <= 15 ? 1 : 0);
1037 printf(
"\\hline $l_N$ & FFT & NDFT & NFFT & NFFT/FFT\\\\\n");
1038 printf(
"\\hline \\hline \\multicolumn{5}{|c|}{$d=2$} \\\\ \\hline\n");
1039 for (l = 3; l <= 11; l++)
1043 int N = (int)(1U << (logIN / d));
1044 measure_time_nfft(d, N, logIN <= 15 ? 1 : 0);
1049 printf(
"\\hline \\hline \\multicolumn{5}{|c|}{$d=3$} \\\\ \\hline\n");
1050 for (l = 3; l <= 7; l++)
1054 int N = (int)(1U << (logIN / d));
1055 measure_time_nfft(d, N, logIN <= 15 ? 1 : 0);
#define UNUSED(x)
Dummy use of unused parameters to silence compiler warnings.
Header file for the nfft3 library.
#define CSWAP(x, y)
Swap two vectors.