Statistiques
| Révision :

root / FFT / FFT2D.c @ 2

Historique | Voir | Annoter | Télécharger (5,08 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 2 equemene
#elif DOUBLE
49 2 equemene
#define FFTW_COMPLEX fftw_complex
50 2 equemene
#define FFTW_PLAN fftw_plan
51 2 equemene
#define FFTW_INIT_THREADS fftw_init_threads
52 2 equemene
#define FFTW_PLAN_WITH_NTHREADS fftw_plan_with_nthreads
53 2 equemene
#define FFTW_MALLOC fftw_malloc
54 2 equemene
#define        FFTW_PLAN_DFT_2D fftw_plan_dft_2d
55 2 equemene
#define FFTW_EXECUTE fftw_execute
56 2 equemene
#define FFTW_DESTROY_PLAN fftw_destroy_plan
57 2 equemene
#define FFTW_FREE fftw_free
58 2 equemene
#endif
59 2 equemene
60 2 equemene
int main(int argc,char **argv)
61 2 equemene
{
62 2 equemene
  int i;
63 2 equemene
  int nloops=NLOOPS,nthreads=NTHREADS,size;
64 2 equemene
  int type_plan=0;
65 2 equemene
  double dplan=0.,dcompute=0.;
66 2 equemene
67 2 equemene
  struct timeval tv1,tv2;
68 2 equemene
  struct timezone tz;
69 2 equemene
70 2 equemene
  if ((argc==1)||
71 2 equemene
      (strcmp(argv[1],"-h")==0)||
72 2 equemene
      (strcmp(argv[1],"--help")==0))
73 2 equemene
    {
74 2 equemene
      printf("\n\tCalculate fake FFTW images\n\n"
75 2 equemene
             "\tParameters to give :\n\n"
76 2 equemene
             "\t1> Plan ESTIMATE MEASURE PATIENT EXHAUSTIVE\n"
77 2 equemene
             "\t2> Size of Image (2^n)\n"
78 2 equemene
             "\t3> Number of Loops (integer)\n"
79 2 equemene
             "\t4> Number of Threads (integer)\n\n");
80 2 equemene
81 2 equemene
      return(0);
82 2 equemene
    }
83 2 equemene
84 2 equemene
  // initialization of FFTW threads
85 2 equemene
86 2 equemene
  if (atoi(argv[4])<1) {
87 2 equemene
    nthreads=1;
88 2 equemene
  }
89 2 equemene
  else {
90 2 equemene
    nthreads=atoi(argv[4]);
91 2 equemene
  }
92 2 equemene
93 2 equemene
  if (atoi(argv[3])<1) {
94 2 equemene
    nloops=1;
95 2 equemene
  }
96 2 equemene
  else {
97 2 equemene
    nloops=atoi(argv[3]);
98 2 equemene
  }
99 2 equemene
100 2 equemene
  if (atoi(argv[2])<1) {
101 2 equemene
    size=2;
102 2 equemene
  }
103 2 equemene
  else {
104 2 equemene
    size=atoi(argv[2]);
105 2 equemene
  }
106 2 equemene
107 2 equemene
  printf("%i %i\n",size,nthreads);
108 2 equemene
109 2 equemene
#ifdef CUFFT
110 2 equemene
  cufftHandle plan;
111 2 equemene
  cufftComplex *in, *devin;
112 2 equemene
113 2 equemene
  size_t arraySize = sizeof(cufftComplex)*size*size;
114 2 equemene
  cudaMallocHost((void**) &in, arraySize);
115 2 equemene
  cudaMalloc((void**) &devin, arraySize);
116 2 equemene
117 2 equemene
  // initialisation of arrays
118 2 equemene
  for (i = 0; i < size*size; i++) {
119 2 equemene
    in[i].x=1.;
120 2 equemene
    in[i].y=0.;
121 2 equemene
  }
122 2 equemene
  in[0].x=1.;
123 2 equemene
  in[0].y=0.;
124 2 equemene
125 2 equemene
  // First timer to start plan
126 2 equemene
  gettimeofday(&tv1, &tz);
127 2 equemene
128 2 equemene
  // Plan & copy to device
129 2 equemene
  cufftPlan2d(&plan, size, size, CUFFT_C2C);
130 2 equemene
  cudaMemcpy(devin, in, arraySize, cudaMemcpyHostToDevice);
131 2 equemene
132 2 equemene
  // Second timer to end plan
133 2 equemene
  gettimeofday(&tv2, &tz);
134 2 equemene
  dplan=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
135 2 equemene
                     (tv2.tv_usec-tv1.tv_usec))/1000000.;
136 2 equemene
137 2 equemene
  // First timer to start process
138 2 equemene
  gettimeofday(&tv1, &tz);
139 2 equemene
140 2 equemene
  // Process
141 2 equemene
  for (i=0;i<nloops;i++) {
142 2 equemene
    cufftExecC2C(plan, devin, devin, CUFFT_FORWARD);
143 2 equemene
  }
144 2 equemene
145 2 equemene
  cudaMemcpy(in, devin, arraySize, cudaMemcpyDeviceToHost);
146 2 equemene
147 2 equemene
  printf("%i=%f,%f\n",0,in[0].x,in[0].y);
148 2 equemene
149 2 equemene
  // Second timer to end process
150 2 equemene
  gettimeofday(&tv2, &tz);
151 2 equemene
152 2 equemene
  cufftDestroy(plan);
153 2 equemene
  cudaFreeHost(in);
154 2 equemene
  cudaFree(devin);
155 2 equemene
156 2 equemene
#elif FFTW3
157 2 equemene
158 2 equemene
  FFTW_COMPLEX *in;
159 2 equemene
  FFTW_PLAN p;
160 2 equemene
161 2 equemene
  FFTW_INIT_THREADS();
162 2 equemene
  FFTW_PLAN_WITH_NTHREADS(nthreads);
163 2 equemene
164 2 equemene
  in = (FFTW_COMPLEX*) FFTW_MALLOC(sizeof(FFTW_COMPLEX)*size*size);
165 2 equemene
166 2 equemene
  // First timer to start plan
167 2 equemene
  gettimeofday(&tv1, &tz);
168 2 equemene
169 2 equemene
  if (strcmp(argv[1],"MEASURE")==0) {
170 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_MEASURE);
171 2 equemene
    type_plan=MEASURE;
172 2 equemene
  }
173 2 equemene
174 2 equemene
  if (strcmp(argv[1],"PATIENT")==0) {
175 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_PATIENT);
176 2 equemene
    type_plan=PATIENT;
177 2 equemene
  }
178 2 equemene
179 2 equemene
  if (strcmp(argv[1],"EXHAUSTIVE")==0) {
180 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_EXHAUSTIVE);
181 2 equemene
    type_plan=EXHAUSTIVE;
182 2 equemene
  }
183 2 equemene
184 2 equemene
  if ((type_plan==0)||(strcmp(argv[1],"ESTIMATE")==0)) {
185 2 equemene
    p = FFTW_PLAN_DFT_2D(size,size,in,in,FFTW_FORWARD,FFTW_ESTIMATE);
186 2 equemene
    type_plan=ESTIMATE;
187 2 equemene
  }
188 2 equemene
  // Second timer to end plan
189 2 equemene
  gettimeofday(&tv2, &tz);
190 2 equemene
  dplan=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
191 2 equemene
                 (tv2.tv_usec-tv1.tv_usec))/1000000.;
192 2 equemene
193 2 equemene
  // initialisation of arrays
194 2 equemene
  for (i = 0; i < size*size; i++) {
195 2 equemene
    (in[i])[0]=0.;
196 2 equemene
    (in[i])[1]=0.;
197 2 equemene
  }
198 2 equemene
  (in[0])[0]=1.;
199 2 equemene
  (in[0])[1]=0.;
200 2 equemene
201 2 equemene
  // First timer to start process
202 2 equemene
  gettimeofday(&tv1, &tz);
203 2 equemene
  for (i=0;i<nloops;i++) {
204 2 equemene
    FFTW_EXECUTE(p);
205 2 equemene
  }
206 2 equemene
  // Second timer to end process
207 2 equemene
  gettimeofday(&tv2, &tz);
208 2 equemene
  FFTW_DESTROY_PLAN(p);
209 2 equemene
  FFTW_FREE(in);
210 2 equemene
#endif
211 2 equemene
212 2 equemene
  dcompute=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +                \
213 2 equemene
                    (tv2.tv_usec-tv1.tv_usec))/1000000./(double)nloops;
214 2 equemene
215 2 equemene
  printf("%s,%i,%i,%i,%i,%lf,%lf\n",argv[1],
216 2 equemene
         size,size,nthreads,nloops,dplan,dcompute);
217 2 equemene
218 2 equemene
  /* if ((file=fopen(argv[7],"a"))==NULL) */
219 2 equemene
  /*         { */
220 2 equemene
  /*           printf("Impossible to append result in %s file\n", */
221 2 equemene
  /*                  argv[7]); */
222 2 equemene
  /*           return(0); */
223 2 equemene
  /*         } */
224 2 equemene
225 2 equemene
  /* fprintf(file,"%s,%i,%i,%i,%i,%lf,%lf\n", */
226 2 equemene
  /*           argv[1],size,size,nthreads,nloops,dplan,dcompute); */
227 2 equemene
228 2 equemene
  /* fclose(file); */
229 2 equemene
230 2 equemene
  return 0;
231 2 equemene
}