NFFT Logo 3.2.3
nfft_benchomp.c
1 /*
2  * Copyright (c) 2002, 2012 Jens Keiner, Stefan Kunis, Daniel Potts
3  *
4  * This program is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU General Public License as published by the Free Software
6  * Foundation; either version 2 of the License, or (at your option) any later
7  * version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12  * details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 51
16  * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <unistd.h>
22 
23 #include "config.h"
24 
25 #include <nfft3.h>
26 #include <nfft3util.h>
27 
28 #define NREPEAT 5
29 
30 static FILE* file_out_tex = NULL;
31 
32 int get_nthreads_array(int **arr)
33 {
34  int max_threads = nfft_get_omp_num_threads();
35  int alloc_num = 2;
36  int k;
37  int ret_number = 0;
38  int max_threads_pw2 = (max_threads / 2) * 2 == max_threads ? 1 : 0;
39 
40  if (max_threads <= 5)
41  {
42  *arr = (int*) malloc(max_threads*sizeof(int));
43  for (k = 0; k < max_threads; k++)
44  *(*arr + k) = k+1;
45  return max_threads;
46  }
47 
48  for (k = 1; k <= max_threads; k*=2, alloc_num++);
49 
50  *arr = (int*) malloc(alloc_num*sizeof(int));
51 
52  for (k = 1; k <= max_threads; k*=2)
53  {
54  if (k != max_threads && 2*k > max_threads && max_threads_pw2)
55  {
56  *(*arr + ret_number) = max_threads/2;
57  ret_number++;
58  }
59 
60  *(*arr + ret_number) = k;
61  ret_number++;
62 
63  if (k != max_threads && 2*k > max_threads)
64  {
65  *(*arr + ret_number) = max_threads;
66  ret_number++;
67  break;
68  }
69  }
70 
71  return ret_number;
72 }
73 
74 
75 void check_result_value(const int val, const int ok, const char *msg)
76 {
77  if (val != ok)
78  {
79  fprintf(stderr, "ERROR %s: %d not %d\n", msg, val, ok);
80 
81  exit(1);
82  }
83 }
84 
85 void run_test_create(int d, int trafo_adjoint, int N, int M, double sigma)
86 {
87  char cmd[1025];
88 
89  if (d==1)
90  snprintf(cmd, 1024, "./nfft_benchomp_createdataset %d %d %d %d %lg > nfft_benchomp_test.data", d, trafo_adjoint, N, M, sigma);
91  else if (d==2)
92  snprintf(cmd, 1024, "./nfft_benchomp_createdataset %d %d %d %d %d %lg > nfft_benchomp_test.data", d, trafo_adjoint, N, N, M, sigma);
93  else if (d==3)
94  snprintf(cmd, 1024, "./nfft_benchomp_createdataset %d %d %d %d %d %d %lg > nfft_benchomp_test.data", d, trafo_adjoint, N, N, N, M, sigma);
95  else if (d==4)
96  snprintf(cmd, 1024, "./nfft_benchomp_createdataset %d %d %d %d %d %d %d %lg > nfft_benchomp_test.data", d, trafo_adjoint, N, N, N, N, M, sigma);
97  else
98  exit(1);
99  fprintf(stderr, "%s\n", cmd);
100  check_result_value(system(cmd), 0, "createdataset");
101 }
102 
103 void run_test_init_output()
104 {
105  FILE *f = fopen("nfft_benchomp_test.result", "w");
106  if (f!= NULL)
107  fclose(f);
108 }
109 
110 typedef struct
111 {
112  int d;
113  int trafo_adjoint;
114  int N;
115  int M;
116  double sigma;
117  int m;
118  int flags;
119 } s_param;
120 
121 typedef struct
122 {
123  double avg;
124  double min;
125  double max;
126 } s_resval;
127 
128 typedef struct
129 {
130  int nthreads;
131  s_resval resval[6];
132 } s_result;
133 
134 typedef struct
135 {
136  s_param param;
137  s_result *results;
138  int nresults;
139 } s_testset;
140 
141 void run_test(s_resval *res, int nrepeat, int m, int flags, int nthreads)
142 {
143  char cmd[1025];
144  int r,t;
145 
146  for (t = 0; t < 6; t++)
147  {
148  res[t].avg = 0.0; res[t].min = 1.0/0.0; res[t].max = 0.0;
149  }
150 
151  if (nthreads < 2)
152  snprintf(cmd, 1024, "./nfft_benchomp_detail_single %d %d < nfft_benchomp_test.data > nfft_benchomp_test.out", m, flags);
153  else
154  snprintf(cmd, 1024, "./nfft_benchomp_detail_threads %d %d %d < nfft_benchomp_test.data > nfft_benchomp_test.out", m, flags, nthreads);
155  fprintf(stderr, "%s\n", cmd);
156  check_result_value(system(cmd), 0, cmd);
157 
158  for (r = 0; r < nrepeat; r++)
159  {
160  int retval;
161  double v[6];
162  FILE *f;
163  check_result_value(system(cmd), 0, cmd);
164  f = fopen("nfft_benchomp_test.out", "r");
165  retval = fscanf(f, "%lg %lg %lg %lg %lg %lg", v, v+1, v+2, v+3, v+4, v+5);
166  check_result_value(retval, 6, "read nfft_benchomp_test.out");
167  fclose(f);
168 
169  for (t = 0; t < 6; t++)
170  {
171  res[t].avg += v[t];
172  if (res[t].min > v[t])
173  res[t].min = v[t];
174  if (res[t].max < v[t])
175  res[t].max = v[t];
176  }
177  }
178 
179  for (t = 0; t < 6; t++)
180  res[t].avg /= nrepeat;
181 
182  fprintf(stderr, "%d %d: ", nthreads, nrepeat);
183  for (t = 0; t < 6; t++)
184  fprintf(stderr, "%.3e %.3e %.3e | ", res[t].avg, res[t].min, res[t].max);
185  fprintf(stderr, "\n");
186 }
187 
188 const char *get_psi_string(int flags)
189 {
190  if (flags & PRE_ONE_PSI)
191  return "unknownPSI";
192 
193  return "nopsi";
194 }
195 const char *get_sort_string(int flags)
196 {
197  if (flags & NFFT_SORT_NODES)
198  return "sorted";
199 
200  return "unsorted";
201 }
202 
203 const char *get_adjoint_omp_string(int flags)
204 {
205  if (flags & NFFT_OMP_BLOCKWISE_ADJOINT)
206  return "blockwise";
207 
208  return "";
209 }
210 
211 #define MASK_D (1U<<0)
212 #define MASK_TA (1U<<1)
213 #define MASK_N (1U<<2)
214 #define MASK_SIGMA (1U<<3)
215 #define MASK_M (1U<<4)
216 #define MASK_WINM (1U<<5)
217 #define MASK_FLAGS_PSI (1U<<6)
218 #define MASK_FLAGS_SORT (1U<<7)
219 #define MASK_FLAGS_BW (1U<<8)
220 
221 unsigned int determine_different_parameters(s_testset *testsets, int ntestsets)
222 {
223  int t;
224  unsigned int mask = 0;
225 
226  if (ntestsets < 2)
227  return 0;
228 
229  for (t = 1; t < ntestsets; t++)
230  {
231  if (testsets[t-1].param.d != testsets[t].param.d)
232  mask |= MASK_D;
233  if (testsets[t-1].param.trafo_adjoint != testsets[t].param.trafo_adjoint)
234  mask |= MASK_TA;
235  if (testsets[t-1].param.N != testsets[t].param.N)
236  mask |= MASK_N;
237  if (testsets[t-1].param.sigma != testsets[t].param.sigma)
238  mask |= MASK_SIGMA;
239  if (testsets[t-1].param.M != testsets[t].param.M)
240  mask |= MASK_M;
241  if (testsets[t-1].param.m != testsets[t].param.m)
242  mask |= MASK_WINM;
243  if ((testsets[t-1].param.flags & PRE_ONE_PSI) != (testsets[t].param.flags & PRE_ONE_PSI))
244  mask |= MASK_FLAGS_PSI;
245  if ((testsets[t-1].param.flags & NFFT_SORT_NODES) != (testsets[t].param.flags & NFFT_SORT_NODES))
246  mask |= MASK_FLAGS_SORT;
247  if ((testsets[t-1].param.flags & NFFT_OMP_BLOCKWISE_ADJOINT) != (testsets[t].param.flags & NFFT_OMP_BLOCKWISE_ADJOINT))
248  mask |= MASK_FLAGS_BW;
249  }
250 
251  return mask;
252 }
253 
254 void get_plot_title(char *outstr, int maxlen, char *hostname, s_param param, unsigned int diff_mask)
255 {
256  unsigned int mask = ~diff_mask;
257  int offset = 0;
258  int len;
259 
260  len = snprintf(outstr, maxlen, "%s", hostname);
261  if (len < 0 || len+offset >= maxlen-1) return;
262  offset += len;
263 
264  if (mask & MASK_D)
265  {
266  len = snprintf(outstr+offset, maxlen-offset, " %dd", param.d);
267  if (len < 0 || len+offset >= maxlen-1) return;
268  offset += len;
269  }
270 
271  if (mask & MASK_TA)
272  {
273  len = snprintf(outstr+offset, maxlen-offset, " $\\mathrm{NFFT}%s$", param.trafo_adjoint==0?"":"^\\top");
274  if (len < 0 || len+offset >= maxlen-1) return;
275  offset += len;
276  }
277 
278  if (mask & MASK_N)
279  {
280  len = snprintf(outstr+offset, maxlen-offset, " N=%d", param.N);
281  if (len < 0 || len+offset >= maxlen-1) return;
282  offset += len;
283  }
284 
285  if (mask & MASK_SIGMA)
286  {
287  len = snprintf(outstr+offset, maxlen-offset, " N=%g", param.sigma);
288  if (len < 0 || len+offset >= maxlen-1) return;
289  offset += len;
290  }
291 
292  if (mask & MASK_M)
293  {
294  len = snprintf(outstr+offset, maxlen-offset, " M=%d", param.M);
295  if (len < 0 || len+offset >= maxlen-1) return;
296  offset += len;
297  }
298 
299  if (mask & MASK_WINM)
300  {
301  len = snprintf(outstr+offset, maxlen-offset, " m=%d", param.m);
302  if (len < 0 || len+offset >= maxlen-1) return;
303  offset += len;
304  }
305 
306  if (mask & MASK_FLAGS_PSI)
307  {
308  len = snprintf(outstr+offset, maxlen-offset, " %s", get_psi_string(param.flags));
309  if (len < 0 || len+offset >= maxlen-1) return;
310  offset += len;
311  }
312 
313  if (mask & MASK_FLAGS_SORT)
314  {
315  len = snprintf(outstr+offset, maxlen-offset, " %s", get_sort_string(param.flags));
316  if (len < 0 || len+offset >= maxlen-1) return;
317  offset += len;
318  }
319 
320  if ((mask & MASK_FLAGS_BW) && strlen(get_adjoint_omp_string(param.flags)) > 0)
321  {
322  len = snprintf(outstr+offset, maxlen-offset, " %s", get_adjoint_omp_string(param.flags));
323  if (len < 0 || len+offset >= maxlen-1) return;
324  offset += len;
325  }
326 }
327 
328 void print_output_speedup_total_tref(FILE *out, s_testset *testsets, int ntestsets, double tref)
329 {
330  int i, t;
331  char hostname[1025];
332  char plottitle[1025];
333  unsigned int diff_mask = determine_different_parameters(testsets, ntestsets);
334 
335  if (gethostname(hostname, 1024) != 0)
336  strncpy(hostname, "unnamed", 1024);
337 
338  get_plot_title(plottitle, 1024, hostname, testsets[0].param, diff_mask | MASK_FLAGS_SORT);
339 
340  fprintf(out, "\\begin{tikzpicture}\n");
341  fprintf(out, "\\begin{axis}[");
342  fprintf(out, "width=0.9\\textwidth, height=0.6\\textwidth, x tick label style={ /pgf/number format/1000 sep=}, xlabel=Number of threads, ylabel=Speedup, xtick=data, legend style={ legend pos = north west, legend columns=1}, ymajorgrids=true, yminorgrids=true, minor y tick num=4, ");
343  fprintf(out, " title={%s}", plottitle);
344  fprintf(out, " ]\n");
345 
346  for (t = 0; t < ntestsets; t++)
347  {
348  s_testset testset = testsets[t];
349  fprintf(stderr, "%s %dd $\\mathrm{NFFT}%s$ N=%d $\\sigma$=%g M=%d m=%d %s %s %s}", hostname, testset.param.d, testset.param.trafo_adjoint==0?"":"^\\top", testset.param.N, testset.param.sigma, testset.param.M, testset.param.m, get_psi_string(testset.param.flags), get_sort_string(testset.param.flags), get_adjoint_omp_string(testset.param.flags));
350  fprintf(stderr, "\n");
351 
352  fprintf(out, "\\addplot coordinates {");
353  for (i = 0; i < testset.nresults; i++)
354  fprintf(out, "(%d, %.6e) ", testset.results[i].nthreads, tref/testset.results[i].resval[5].avg);
355  fprintf(out, "};\n");
356 
357  for (i = 0; i < testset.nresults; i++)
358  {
359  fprintf(stderr, "%d:%.3f ", testset.results[i].nthreads, tref/testset.results[i].resval[5].avg);
360  }
361  fprintf(stderr, "\n\n");
362  }
363 
364  fprintf(out, "\\legend{{");
365  for (t = 0; t < ntestsets; t++)
366  {
367  char title[256];
368  if (t > 0)
369  fprintf(out, "},{");
370  get_plot_title(title, 255, "", testsets[t].param, ~(diff_mask | MASK_FLAGS_SORT));
371  fprintf(out, "%s", title);
372  }
373  fprintf(out, "}}\n");
374  fprintf(out, "\\end{axis}\n");
375  fprintf(out, "\\end{tikzpicture}\n");
376  fprintf(out, "\n\n");
377 
378  fflush(out);
379 }
380 
381 void print_output_speedup_total(FILE *out, s_testset *testsets, int ntestsets)
382 {
383  double tref = 1.0/0.0;
384  int t, k;
385 
386  for (t = 0; t < ntestsets; t++)
387  for (k = 0; k < testsets[t].nresults; k++)
388  if (testsets[t].results[k].nthreads == 1 && testsets[t].results[k].resval[5].avg < tref)
389  tref = testsets[t].results[k].resval[5].avg;
390 
391  print_output_speedup_total_tref(out, testsets, ntestsets, tref);
392 }
393 
394 void print_output_histo_DFBRT(FILE *out, s_testset testset)
395 {
396  int i, size = testset.nresults;
397  char hostname[1025];
398 
399  if (gethostname(hostname, 1024) != 0)
400  strncpy(hostname, "unnamed", 1024);
401 
402  fprintf(out, "\\begin{tikzpicture}\n");
403  fprintf(out, "\\begin{axis}[");
404  fprintf(out, "width=0.9\\textwidth, height=0.6\\textwidth, ");
405  fprintf(out, "symbolic x coords={");
406  for (i = 0; i < size; i++)
407  if (i > 0)
408  fprintf(out, ",%d", testset.results[i].nthreads);
409  else
410  fprintf(out, "%d", testset.results[i].nthreads);
411 fprintf(stderr, "FLAGS: %d\n", testset.param.flags);
412 
413  fprintf(out, "}, x tick label style={ /pgf/number format/1000 sep=}, xlabel=Number of threads, ylabel=Time in s, xtick=data, legend style={legend columns=-1}, ybar, bar width=7pt, ymajorgrids=true, yminorgrids=true, minor y tick num=1, ");
414  fprintf(out, " title={%s %dd $\\mathrm{NFFT}%s$ N=%d $\\sigma$=%g M=%d m=%d %s %s %s}", hostname, testset.param.d, testset.param.trafo_adjoint==0?"":"^\\top", testset.param.N, testset.param.sigma, testset.param.M, testset.param.m, get_psi_string(testset.param.flags), get_sort_string(testset.param.flags), get_adjoint_omp_string(testset.param.flags));
415  fprintf(out, " ]\n");
416  fprintf(out, "\\addplot coordinates {");
417  for (i = 0; i < size; i++)
418  fprintf(out, "(%d, %.6e) ", testset.results[i].nthreads, testset.results[i].resval[1].avg);
419  fprintf(out, "};\n");
420 
421  fprintf(out, "\\addplot coordinates {");
422  for (i = 0; i < size; i++)
423  fprintf(out, "(%d, %.6e) ", testset.results[i].nthreads, testset.results[i].resval[2].avg);
424  fprintf(out, "};\n");
425 
426  fprintf(out, "\\addplot coordinates {");
427  for (i = 0; i < size; i++)
428  fprintf(out, "(%d, %.6e) ", testset.results[i].nthreads, testset.results[i].resval[3].avg);
429  fprintf(out, "};\n");
430 
431  fprintf(out, "\\addplot coordinates {");
432  for (i = 0; i < size; i++)
433  fprintf(out, "(%d, %.6e) ", testset.results[i].nthreads, testset.results[i].resval[0].avg + testset.results[i].resval[4].avg);
434  fprintf(out, "};\n");
435 
436  fprintf(out, "\\addplot coordinates {");
437  for (i = 0; i < size; i++)
438  fprintf(out, "(%d, %.6e) ", testset.results[i].nthreads, testset.results[i].resval[5].avg);
439  fprintf(out, "};\n");
440  fprintf(out, "\\legend{D,F,B,rest,total}\n");
441  fprintf(out, "\\end{axis}\n");
442  fprintf(out, "\\end{tikzpicture}\n");
443  fprintf(out, "\n\n");
444 
445  fflush(out);
446 }
447 
448 void run_testset(s_testset *testset, int d, int trafo_adjoint, int N, int M, double sigma, int m, int flags, int *nthreads_array, int n_threads_array_size)
449 {
450  int i;
451  testset->param.d = d;
452  testset->param.trafo_adjoint = trafo_adjoint;
453  testset->param.N = N;
454  testset->param.M = M;
455  testset->param.sigma = sigma;
456  testset->param.m = m;
457  testset->param.flags = flags;
458 
459  testset->results = (s_result*) malloc(n_threads_array_size*sizeof(s_result));
460  testset->nresults = n_threads_array_size;
461 
462  run_test_create(testset->param.d, testset->param.trafo_adjoint, testset->param.N, testset->param.M, testset->param.sigma);
463  for (i = 0; i < n_threads_array_size; i++)
464  {
465  testset->results[i].nthreads = nthreads_array[i];
466  run_test(testset->results[i].resval, NREPEAT, testset->param.m, testset->param.flags, testset->results[i].nthreads = nthreads_array[i]);
467  }
468 
469 }
470 
471 void test1(int *nthreads_array, int n_threads_array_size, int m)
472 {
473  s_testset testsets[15];
474 
475  run_testset(&testsets[0], 1, 0, 2097152, 2097152, 2.0, m, 0, nthreads_array, n_threads_array_size);
476 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
477  print_output_histo_DFBRT(file_out_tex, testsets[0]);
478 #endif
479 
480  run_testset(&testsets[1], 1, 0, 2097152, 2097152, 2.0, m, NFFT_SORT_NODES, nthreads_array, n_threads_array_size);
481 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
482  print_output_histo_DFBRT(file_out_tex, testsets[1]);
483 #endif
484 
485  print_output_speedup_total(file_out_tex, testsets, 2);
486 
487  run_testset(&testsets[2], 1, 1, 2097152, 2097152, 2.0, m, 0, nthreads_array, n_threads_array_size);
488 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
489  print_output_histo_DFBRT(file_out_tex, testsets[2]);
490 #endif
491 
492  run_testset(&testsets[3], 1, 1, 2097152, 2097152, 2.0, m, NFFT_SORT_NODES, nthreads_array, n_threads_array_size);
493 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
494  print_output_histo_DFBRT(file_out_tex, testsets[3]);
495 #endif
496 
497  run_testset(&testsets[4], 1, 1, 2097152, 2097152, 2.0, m, NFFT_SORT_NODES | NFFT_OMP_BLOCKWISE_ADJOINT, nthreads_array, n_threads_array_size);
498 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
499  print_output_histo_DFBRT(file_out_tex, testsets[4]);
500 #endif
501 
502  print_output_speedup_total(file_out_tex, testsets+2, 3);
503 
504  run_testset(&testsets[5], 2, 0, 1024, 1048576, 2.0, m, 0, nthreads_array, n_threads_array_size);
505 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
506  print_output_histo_DFBRT(file_out_tex, testsets[5]);
507 #endif
508 
509  run_testset(&testsets[6], 2, 0, 1024, 1048576, 2.0, m, NFFT_SORT_NODES, nthreads_array, n_threads_array_size);
510 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
511  print_output_histo_DFBRT(file_out_tex, testsets[6]);
512 #endif
513 
514  print_output_speedup_total(file_out_tex, testsets+5, 2);
515 
516  run_testset(&testsets[7], 2, 1, 1024, 1048576, 2.0, m, 0, nthreads_array, n_threads_array_size);
517 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
518  print_output_histo_DFBRT(file_out_tex, testsets[7]);
519 #endif
520 
521  run_testset(&testsets[8], 2, 1, 1024, 1048576, 2.0, m, NFFT_SORT_NODES, nthreads_array, n_threads_array_size);
522 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
523  print_output_histo_DFBRT(file_out_tex, testsets[8]);
524 #endif
525 
526  run_testset(&testsets[9], 2, 1, 1024, 1048576, 2.0, m, NFFT_SORT_NODES | NFFT_OMP_BLOCKWISE_ADJOINT, nthreads_array, n_threads_array_size);
527 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
528  print_output_histo_DFBRT(file_out_tex, testsets[9]);
529 #endif
530 
531  print_output_speedup_total(file_out_tex, testsets+7, 3);
532 
533  run_testset(&testsets[10], 3, 0, 128, 2097152, 2.0, m, 0, nthreads_array, n_threads_array_size);
534 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
535  print_output_histo_DFBRT(file_out_tex, testsets[10]);
536 #endif
537 
538  run_testset(&testsets[11], 3, 0, 128, 2097152, 2.0, m, NFFT_SORT_NODES, nthreads_array, n_threads_array_size);
539 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
540  print_output_histo_DFBRT(file_out_tex, testsets[11]);
541 #endif
542 
543  print_output_speedup_total(file_out_tex, testsets+10, 2);
544 
545  run_testset(&testsets[12], 3, 1, 128, 2097152, 2.0, m, 0, nthreads_array, n_threads_array_size);
546 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
547  print_output_histo_DFBRT(file_out_tex, testsets[12]);
548 #endif
549 
550  run_testset(&testsets[13], 3, 1, 128, 2097152, 2.0, m, NFFT_SORT_NODES, nthreads_array, n_threads_array_size);
551 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
552  print_output_histo_DFBRT(file_out_tex, testsets[13]);
553 #endif
554 
555  run_testset(&testsets[14], 3, 1, 128, 2097152, 2.0, m, NFFT_SORT_NODES | NFFT_OMP_BLOCKWISE_ADJOINT, nthreads_array, n_threads_array_size);
556 #if defined MEASURE_TIME && defined MEASURE_TIME_FFTW
557  print_output_histo_DFBRT(file_out_tex, testsets[14]);
558 #endif
559 
560  print_output_speedup_total(file_out_tex, testsets+12, 3);
561 
562 }
563 
564 int main(int argc, char** argv)
565 {
566  int *nthreads_array;
567  int n_threads_array_size = get_nthreads_array(&nthreads_array);
568  int k;
569 
570 #if !(defined MEASURE_TIME && defined MEASURE_TIME_FFTW)
571  fprintf(stderr, "WARNING: Detailed time measurements for NFFT are not activated.\n");
572  fprintf(stderr, "For more detailed plots, please re-run the configure script with options\n");
573  fprintf(stderr, "--enable-measure-time --enable-measure-time-fftw --enable-openmp\n");
574  fprintf(stderr, "and run \"make clean all\"\n\n");
575 #endif
576 
577  for (k = 0; k < n_threads_array_size; k++)
578  fprintf(stderr, "%d ", nthreads_array[k]);
579  fprintf(stderr, "\n");
580 
581  file_out_tex = fopen("nfft_benchomp_results_plots.tex", "w");
582 
583  test1(nthreads_array, n_threads_array_size, 2);
584  test1(nthreads_array, n_threads_array_size, 4);
585  test1(nthreads_array, n_threads_array_size, 6);
586 
587  fclose(file_out_tex);
588 
589  return 0;
590 }

Generated on Tue Apr 30 2013 by Doxygen 1.8.1