Statistiques
| Révision :

root / FFT / FFT2D.c @ 296

Historique | Voir | Annoter | Télécharger (5,28 ko)

1
/* 
2
   Performs matrix multiply
3

4
   Thanks for help from aurel32@debian.org
5
*/
6

    
7
#include <stdio.h>
8
#include <math.h>
9
#include <stdlib.h>
10
#include <sys/time.h>
11
#include <string.h>
12

    
13
#ifdef CUFFT
14
#include <complex.h>
15
#include <cufft.h>
16
#else
17
#include <fftw3.h>
18
#endif
19

    
20
#ifdef DOUBLE
21
#define LENGTH double
22
#else
23
#define LENGTH float
24
#endif
25

    
26
// kind of plan estimations for FFTW3
27
#define ESTIMATE 1
28
#define MEASURE 2
29
#define PATIENT 3
30
#define EXHAUSTIVE 4
31

    
32
// Default values
33
#define NTHREADS 1
34
#define NLOOPS 10
35
#define DIMENSION 1024
36

    
37
// Redefine FFTW function calls 
38
#ifdef FLOAT
39
#define FFTW_COMPLEX fftwf_complex
40
#define FFTW_PLAN fftwf_plan
41
#define FFTW_INIT_THREADS fftwf_init_threads
42
#define FFTW_PLAN_WITH_NTHREADS fftwf_plan_with_nthreads
43
#define FFTW_MALLOC fftwf_malloc
44
#define        FFTW_PLAN_DFT_2D fftwf_plan_dft_2d
45
#define FFTW_EXECUTE fftwf_execute
46
#define FFTW_DESTROY_PLAN fftwf_destroy_plan
47
#define FFTW_FREE fftwf_free
48

    
49
#define CUFFTCOMPLEX cufftComplex
50
#define CUFFT_X2X CUFFT_C2C
51
#define CUFFTEXECX2X cufftExecC2C
52

    
53
#elif DOUBLE
54
#define FFTW_COMPLEX fftw_complex
55
#define FFTW_PLAN fftw_plan
56
#define FFTW_INIT_THREADS fftw_init_threads
57
#define FFTW_PLAN_WITH_NTHREADS fftw_plan_with_nthreads
58
#define FFTW_MALLOC fftw_malloc
59
#define        FFTW_PLAN_DFT_2D fftw_plan_dft_2d
60
#define FFTW_EXECUTE fftw_execute
61
#define FFTW_DESTROY_PLAN fftw_destroy_plan
62
#define FFTW_FREE fftw_free
63

    
64
#define CUFFTCOMPLEX cufftDoubleComplex
65
#define CUFFT_X2X CUFFT_Z2Z
66
#define CUFFTEXECX2X cufftExecZ2Z
67

    
68
#endif
69

    
70
int main(int argc,char **argv)
71
{
72
  int i;
73
  int nloops=NLOOPS,nthreads=NTHREADS,size;
74
  int type_plan=0;
75
  double dplan=0.,dcompute=0.;
76
  
77
  struct timeval tv1,tv2;
78
  struct timezone tz;
79
    
80
  if ((argc==1)||
81
      (strcmp(argv[1],"-h")==0)||
82
      (strcmp(argv[1],"--help")==0))
83
    {
84
      printf("\n\tCalculate fake FFTW images\n\n"
85
             "\tParameters to give :\n\n"
86
             "\t1> Plan ESTIMATE MEASURE PATIENT EXHAUSTIVE\n"
87
             "\t2> Size of Image (2^n)\n"
88
             "\t3> Number of Loops (integer)\n"
89
             "\t4> Number of Threads (integer)\n\n");
90
      
91
      return(0);
92
    }
93

    
94
  // initialization of FFTW threads
95
  
96
  if (atoi(argv[4])<1) {
97
    nthreads=1;
98
  }
99
  else {
100
    nthreads=atoi(argv[4]);
101
  }
102
  
103
  if (atoi(argv[3])<1) {
104
    nloops=1;
105
  }
106
  else {
107
    nloops=atoi(argv[3]);
108
  }
109
  
110
  if (atoi(argv[2])<1) {
111
    size=2;
112
  }
113
  else {
114
    size=atoi(argv[2]);
115
  }
116
    
117
  printf("%i %i\n",size,nthreads);
118
        
119
#ifdef CUFFT
120
  cufftHandle plan;
121
  CUFFTCOMPLEX *in, *devin;
122

    
123
  size_t arraySize = sizeof(CUFFTCOMPLEX)*size*size;
124
  cudaMallocHost((void**) &in, arraySize);
125
  cudaMalloc((void**) &devin, arraySize);
126
    
127
  // initialisation of arrays
128
  for (i = 0; i < size*size; i++) {
129
    in[i].x=1.;
130
    in[i].y=0.;
131
  }
132
  in[0].x=1.;
133
  in[0].y=0.;
134

    
135
  // First timer to start plan
136
  gettimeofday(&tv1, &tz);
137
  
138
  // Plan & copy to device
139
  cufftPlan2d(&plan, size, size, CUFFT_X2X);
140
  cudaMemcpy(devin, in, arraySize, cudaMemcpyHostToDevice);
141

    
142
  // Second timer to end plan      
143
  gettimeofday(&tv2, &tz);        
144
  dplan=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
145
                     (tv2.tv_usec-tv1.tv_usec))/1000000.;  
146

    
147
  // First timer to start process
148
  gettimeofday(&tv1, &tz);
149

    
150
  // Process
151
  for (i=0;i<nloops;i++) {
152
    CUFFTEXECX2X(plan, devin, devin, CUFFT_FORWARD);
153
  }
154
    
155
  cudaMemcpy(in, devin, arraySize, cudaMemcpyDeviceToHost);
156

    
157
  printf("%i=%f,%f\n",0,in[0].x,in[0].y);
158

    
159
  // Second timer to end process
160
  gettimeofday(&tv2, &tz);
161

    
162
  cufftDestroy(plan);
163
  cudaFreeHost(in);
164
  cudaFree(devin);
165

    
166
#elif FFTW3      
167

    
168
  FFTW_COMPLEX *in;
169
  FFTW_PLAN p;
170

    
171
  FFTW_INIT_THREADS();
172
  FFTW_PLAN_WITH_NTHREADS(nthreads);
173

    
174
  in = (FFTW_COMPLEX*) FFTW_MALLOC(sizeof(FFTW_COMPLEX)*size*size);
175

    
176
  // First timer to start plan
177
  gettimeofday(&tv1, &tz);
178
  
179
  if (strcmp(argv[1],"MEASURE")==0) {
180
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_MEASURE);
181
    type_plan=MEASURE;
182
  }
183
  
184
  if (strcmp(argv[1],"PATIENT")==0) {
185
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_PATIENT);
186
    type_plan=PATIENT;
187
  }
188
  
189
  if (strcmp(argv[1],"EXHAUSTIVE")==0) {
190
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_EXHAUSTIVE);
191
    type_plan=EXHAUSTIVE;
192
  }
193
  
194
  if ((type_plan==0)||(strcmp(argv[1],"ESTIMATE")==0)) {
195
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_ESTIMATE);
196
    type_plan=ESTIMATE;
197
  }
198
  // Second timer to end plan      
199
  gettimeofday(&tv2, &tz);        
200
  dplan=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
201
                 (tv2.tv_usec-tv1.tv_usec))/1000000.;  
202
  
203
  // initialisation of arrays
204
  for (i = 0; i < size*size; i++) {
205
    (in[i])[0]=0.;
206
    (in[i])[1]=0.;
207
  }
208
  (in[0])[0]=1.;
209
  (in[0])[1]=0.;
210
  
211
  // First timer to start process
212
  gettimeofday(&tv1, &tz);
213
  for (i=0;i<nloops;i++) {
214
    FFTW_EXECUTE(p);
215
  }
216
  // Second timer to end process
217
  gettimeofday(&tv2, &tz);
218
  FFTW_DESTROY_PLAN(p);
219
  FFTW_FREE(in); 
220
#endif
221

    
222
  dcompute=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
223
                    (tv2.tv_usec-tv1.tv_usec))/1000000./(double)nloops;  
224
  
225
  printf("%s,%i,%i,%i,%i,%lf,%lf\n",argv[1],
226
         size,size,nthreads,nloops,dplan,dcompute);
227
  
228
  /* if ((file=fopen(argv[7],"a"))==NULL) */
229
  /*         { */
230
  /*           printf("Impossible to append result in %s file\n", */
231
  /*                  argv[7]); */
232
  /*           return(0); */
233
  /*         } */
234
  
235
  /* fprintf(file,"%s,%i,%i,%i,%i,%lf,%lf\n", */
236
  /*           argv[1],size,size,nthreads,nloops,dplan,dcompute); */
237
  
238
  /* fclose(file); */
239
  
240
  return 0;
241
}