Statistiques
| Révision :

root / FFT / FFT2D.c @ 279

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

1 2 equemene
/*
2 2 equemene
   Performs matrix multiply
3 2 equemene

4 2 equemene
   Thanks for help from aurel32@debian.org
5 2 equemene
*/
6 2 equemene
7 2 equemene
#include <stdio.h>
8 2 equemene
#include <math.h>
9 2 equemene
#include <stdlib.h>
10 2 equemene
#include <sys/time.h>
11 2 equemene
#include <string.h>
12 2 equemene
13 2 equemene
#ifdef CUFFT
14 2 equemene
#include <complex.h>
15 2 equemene
#include <cufft.h>
16 2 equemene
#else
17 2 equemene
#include <fftw3.h>
18 2 equemene
#endif
19 2 equemene
20 2 equemene
#ifdef DOUBLE
21 2 equemene
#define LENGTH double
22 2 equemene
#else
23 2 equemene
#define LENGTH float
24 2 equemene
#endif
25 2 equemene
26 2 equemene
// kind of plan estimations for FFTW3
27 2 equemene
#define ESTIMATE 1
28 2 equemene
#define MEASURE 2
29 2 equemene
#define PATIENT 3
30 2 equemene
#define EXHAUSTIVE 4
31 2 equemene
32 2 equemene
// Default values
33 2 equemene
#define NTHREADS 1
34 2 equemene
#define NLOOPS 10
35 2 equemene
#define DIMENSION 1024
36 2 equemene
37 2 equemene
// Redefine FFTW function calls
38 2 equemene
#ifdef FLOAT
39 2 equemene
#define FFTW_COMPLEX fftwf_complex
40 2 equemene
#define FFTW_PLAN fftwf_plan
41 2 equemene
#define FFTW_INIT_THREADS fftwf_init_threads
42 2 equemene
#define FFTW_PLAN_WITH_NTHREADS fftwf_plan_with_nthreads
43 2 equemene
#define FFTW_MALLOC fftwf_malloc
44 2 equemene
#define        FFTW_PLAN_DFT_2D fftwf_plan_dft_2d
45 2 equemene
#define FFTW_EXECUTE fftwf_execute
46 2 equemene
#define FFTW_DESTROY_PLAN fftwf_destroy_plan
47 2 equemene
#define FFTW_FREE fftwf_free
48 3 equemene
49 3 equemene
#define CUFFTCOMPLEX cufftComplex
50 3 equemene
#define CUFFT_X2X CUFFT_C2C
51 3 equemene
#define CUFFTEXECX2X cufftExecC2C
52 3 equemene
53 2 equemene
#elif DOUBLE
54 2 equemene
#define FFTW_COMPLEX fftw_complex
55 2 equemene
#define FFTW_PLAN fftw_plan
56 2 equemene
#define FFTW_INIT_THREADS fftw_init_threads
57 2 equemene
#define FFTW_PLAN_WITH_NTHREADS fftw_plan_with_nthreads
58 2 equemene
#define FFTW_MALLOC fftw_malloc
59 2 equemene
#define        FFTW_PLAN_DFT_2D fftw_plan_dft_2d
60 2 equemene
#define FFTW_EXECUTE fftw_execute
61 2 equemene
#define FFTW_DESTROY_PLAN fftw_destroy_plan
62 2 equemene
#define FFTW_FREE fftw_free
63 3 equemene
64 3 equemene
#define CUFFTCOMPLEX cufftDoubleComplex
65 3 equemene
#define CUFFT_X2X CUFFT_Z2Z
66 3 equemene
#define CUFFTEXECX2X cufftExecZ2Z
67 3 equemene
68 2 equemene
#endif
69 2 equemene
70 2 equemene
int main(int argc,char **argv)
71 2 equemene
{
72 2 equemene
  int i;
73 2 equemene
  int nloops=NLOOPS,nthreads=NTHREADS,size;
74 2 equemene
  int type_plan=0;
75 2 equemene
  double dplan=0.,dcompute=0.;
76 2 equemene
77 2 equemene
  struct timeval tv1,tv2;
78 2 equemene
  struct timezone tz;
79 2 equemene
80 2 equemene
  if ((argc==1)||
81 2 equemene
      (strcmp(argv[1],"-h")==0)||
82 2 equemene
      (strcmp(argv[1],"--help")==0))
83 2 equemene
    {
84 2 equemene
      printf("\n\tCalculate fake FFTW images\n\n"
85 2 equemene
             "\tParameters to give :\n\n"
86 2 equemene
             "\t1> Plan ESTIMATE MEASURE PATIENT EXHAUSTIVE\n"
87 2 equemene
             "\t2> Size of Image (2^n)\n"
88 2 equemene
             "\t3> Number of Loops (integer)\n"
89 2 equemene
             "\t4> Number of Threads (integer)\n\n");
90 2 equemene
91 2 equemene
      return(0);
92 2 equemene
    }
93 2 equemene
94 2 equemene
  // initialization of FFTW threads
95 2 equemene
96 2 equemene
  if (atoi(argv[4])<1) {
97 2 equemene
    nthreads=1;
98 2 equemene
  }
99 2 equemene
  else {
100 2 equemene
    nthreads=atoi(argv[4]);
101 2 equemene
  }
102 2 equemene
103 2 equemene
  if (atoi(argv[3])<1) {
104 2 equemene
    nloops=1;
105 2 equemene
  }
106 2 equemene
  else {
107 2 equemene
    nloops=atoi(argv[3]);
108 2 equemene
  }
109 2 equemene
110 2 equemene
  if (atoi(argv[2])<1) {
111 2 equemene
    size=2;
112 2 equemene
  }
113 2 equemene
  else {
114 2 equemene
    size=atoi(argv[2]);
115 2 equemene
  }
116 2 equemene
117 2 equemene
  printf("%i %i\n",size,nthreads);
118 2 equemene
119 2 equemene
#ifdef CUFFT
120 2 equemene
  cufftHandle plan;
121 3 equemene
  CUFFTCOMPLEX *in, *devin;
122 2 equemene
123 3 equemene
  size_t arraySize = sizeof(CUFFTCOMPLEX)*size*size;
124 2 equemene
  cudaMallocHost((void**) &in, arraySize);
125 2 equemene
  cudaMalloc((void**) &devin, arraySize);
126 2 equemene
127 2 equemene
  // initialisation of arrays
128 2 equemene
  for (i = 0; i < size*size; i++) {
129 2 equemene
    in[i].x=1.;
130 2 equemene
    in[i].y=0.;
131 2 equemene
  }
132 2 equemene
  in[0].x=1.;
133 2 equemene
  in[0].y=0.;
134 2 equemene
135 2 equemene
  // First timer to start plan
136 2 equemene
  gettimeofday(&tv1, &tz);
137 2 equemene
138 2 equemene
  // Plan & copy to device
139 3 equemene
  cufftPlan2d(&plan, size, size, CUFFT_X2X);
140 2 equemene
  cudaMemcpy(devin, in, arraySize, cudaMemcpyHostToDevice);
141 2 equemene
142 2 equemene
  // Second timer to end plan
143 2 equemene
  gettimeofday(&tv2, &tz);
144 2 equemene
  dplan=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
145 2 equemene
                     (tv2.tv_usec-tv1.tv_usec))/1000000.;
146 2 equemene
147 2 equemene
  // First timer to start process
148 2 equemene
  gettimeofday(&tv1, &tz);
149 2 equemene
150 2 equemene
  // Process
151 2 equemene
  for (i=0;i<nloops;i++) {
152 3 equemene
    CUFFTEXECX2X(plan, devin, devin, CUFFT_FORWARD);
153 2 equemene
  }
154 2 equemene
155 2 equemene
  cudaMemcpy(in, devin, arraySize, cudaMemcpyDeviceToHost);
156 2 equemene
157 2 equemene
  printf("%i=%f,%f\n",0,in[0].x,in[0].y);
158 2 equemene
159 2 equemene
  // Second timer to end process
160 2 equemene
  gettimeofday(&tv2, &tz);
161 2 equemene
162 2 equemene
  cufftDestroy(plan);
163 2 equemene
  cudaFreeHost(in);
164 2 equemene
  cudaFree(devin);
165 2 equemene
166 2 equemene
#elif FFTW3
167 2 equemene
168 2 equemene
  FFTW_COMPLEX *in;
169 2 equemene
  FFTW_PLAN p;
170 2 equemene
171 2 equemene
  FFTW_INIT_THREADS();
172 2 equemene
  FFTW_PLAN_WITH_NTHREADS(nthreads);
173 2 equemene
174 2 equemene
  in = (FFTW_COMPLEX*) FFTW_MALLOC(sizeof(FFTW_COMPLEX)*size*size);
175 2 equemene
176 2 equemene
  // First timer to start plan
177 2 equemene
  gettimeofday(&tv1, &tz);
178 2 equemene
179 2 equemene
  if (strcmp(argv[1],"MEASURE")==0) {
180 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_MEASURE);
181 2 equemene
    type_plan=MEASURE;
182 2 equemene
  }
183 2 equemene
184 2 equemene
  if (strcmp(argv[1],"PATIENT")==0) {
185 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_PATIENT);
186 2 equemene
    type_plan=PATIENT;
187 2 equemene
  }
188 2 equemene
189 2 equemene
  if (strcmp(argv[1],"EXHAUSTIVE")==0) {
190 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_EXHAUSTIVE);
191 2 equemene
    type_plan=EXHAUSTIVE;
192 2 equemene
  }
193 2 equemene
194 2 equemene
  if ((type_plan==0)||(strcmp(argv[1],"ESTIMATE")==0)) {
195 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_ESTIMATE);
196 2 equemene
    type_plan=ESTIMATE;
197 2 equemene
  }
198 2 equemene
  // Second timer to end plan
199 2 equemene
  gettimeofday(&tv2, &tz);
200 2 equemene
  dplan=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
201 2 equemene
                 (tv2.tv_usec-tv1.tv_usec))/1000000.;
202 2 equemene
203 2 equemene
  // initialisation of arrays
204 2 equemene
  for (i = 0; i < size*size; i++) {
205 2 equemene
    (in[i])[0]=0.;
206 2 equemene
    (in[i])[1]=0.;
207 2 equemene
  }
208 2 equemene
  (in[0])[0]=1.;
209 2 equemene
  (in[0])[1]=0.;
210 2 equemene
211 2 equemene
  // First timer to start process
212 2 equemene
  gettimeofday(&tv1, &tz);
213 2 equemene
  for (i=0;i<nloops;i++) {
214 2 equemene
    FFTW_EXECUTE(p);
215 2 equemene
  }
216 2 equemene
  // Second timer to end process
217 2 equemene
  gettimeofday(&tv2, &tz);
218 2 equemene
  FFTW_DESTROY_PLAN(p);
219 2 equemene
  FFTW_FREE(in);
220 2 equemene
#endif
221 2 equemene
222 2 equemene
  dcompute=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
223 2 equemene
                    (tv2.tv_usec-tv1.tv_usec))/1000000./(double)nloops;
224 2 equemene
225 2 equemene
  printf("%s,%i,%i,%i,%i,%lf,%lf\n",argv[1],
226 2 equemene
         size,size,nthreads,nloops,dplan,dcompute);
227 2 equemene
228 2 equemene
  /* if ((file=fopen(argv[7],"a"))==NULL) */
229 2 equemene
  /*         { */
230 2 equemene
  /*           printf("Impossible to append result in %s file\n", */
231 2 equemene
  /*                  argv[7]); */
232 2 equemene
  /*           return(0); */
233 2 equemene
  /*         } */
234 2 equemene
235 2 equemene
  /* fprintf(file,"%s,%i,%i,%i,%i,%lf,%lf\n", */
236 2 equemene
  /*           argv[1],size,size,nthreads,nloops,dplan,dcompute); */
237 2 equemene
238 2 equemene
  /* fclose(file); */
239 2 equemene
240 2 equemene
  return 0;
241 2 equemene
}