Statistiques
| Révision :

root / ETSN / MyDFT.c @ 303

Historique | Voir | Annoter | Télécharger (2,61 ko)

1 279 equemene
/* Simple Discrete Fourier Transform implemented in C and OpenMP/C */
2 279 equemene
/* compilation with : gcc -fopenmp -O3 -o MyDFT MyDFT.c -lm -lgomp */
3 279 equemene
4 279 equemene
#include <math.h>
5 279 equemene
#include <stdio.h>
6 279 equemene
#include <stdlib.h>
7 279 equemene
#include <sys/time.h>
8 279 equemene
9 279 equemene
#define PI 3.141592653589793
10 279 equemene
11 279 equemene
#define MYFLOAT float
12 279 equemene
13 279 equemene
void MyDFT(MYFLOAT *A, MYFLOAT *B, MYFLOAT *a, MYFLOAT *b,int size)
14 279 equemene
{
15 279 equemene
  for (uint j=0;j<size;j++)
16 279 equemene
    {
17 279 equemene
      MYFLOAT At=0.,Bt=0.;
18 279 equemene
      for (uint i=0; i<size;i++)
19 279 equemene
        {
20 301 equemene
          At+=a[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)+b[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
21 301 equemene
          Bt+=-a[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)+b[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
22 279 equemene
        }
23 279 equemene
      A[j]=At;
24 279 equemene
      B[j]=Bt;
25 279 equemene
    }
26 279 equemene
}
27 279 equemene
28 279 equemene
void MyDFTOMP(MYFLOAT *A, MYFLOAT *B, MYFLOAT *a, MYFLOAT *b,int size)
29 279 equemene
{
30 279 equemene
  #pragma omp parallel for
31 279 equemene
  for (uint j=0;j<size;j++)
32 279 equemene
    {
33 279 equemene
      MYFLOAT At=0.,Bt=0.;
34 279 equemene
      for (uint i=0; i<size;i++)
35 279 equemene
        {
36 301 equemene
          At+=a[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)+b[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
37 301 equemene
          Bt+=-a[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)+b[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
38 279 equemene
        }
39 279 equemene
      A[j]=At;
40 279 equemene
      B[j]=Bt;
41 279 equemene
    }
42 279 equemene
}
43 279 equemene
44 279 equemene
45 279 equemene
46 279 equemene
int main(int argc,char *argv[])
47 279 equemene
{
48 279 equemene
  float *a,*b,*A,*B;
49 279 equemene
  int size=1024;
50 279 equemene
  struct timeval tv1,tv2;
51 279 equemene
52 279 equemene
  if (argc > 1) {
53 279 equemene
    size=(int)atoll(argv[1]);
54 279 equemene
  }
55 279 equemene
  else {
56 279 equemene
    printf("\n\tPi : Estimate DFT\n\n\t\t#1 : size (default 1024)\n\n");
57 279 equemene
  }
58 279 equemene
59 279 equemene
  a=(float*)malloc(size*sizeof(MYFLOAT));
60 279 equemene
  b=(float*)malloc(size*sizeof(MYFLOAT));
61 279 equemene
  A=(float*)malloc(size*sizeof(MYFLOAT));
62 279 equemene
  B=(float*)malloc(size*sizeof(MYFLOAT));
63 279 equemene
64 279 equemene
  for (int i=0;i<size;i++)
65 279 equemene
    {
66 279 equemene
      a[i]=1.;
67 279 equemene
      b[i]=1.;
68 279 equemene
      A[i]=0.;
69 279 equemene
      A[i]=0.;
70 279 equemene
    }
71 279 equemene
72 279 equemene
  gettimeofday(&tv1, NULL);
73 279 equemene
  MyDFT(A,B,a,b,size);
74 279 equemene
  gettimeofday(&tv2, NULL);
75 279 equemene
76 279 equemene
  MYFLOAT elapsed=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
77 279 equemene
                            (tv2.tv_usec-tv1.tv_usec))/1000000;
78 279 equemene
79 279 equemene
  gettimeofday(&tv1, NULL);
80 279 equemene
  MyDFTOMP(A,B,a,b,size);
81 279 equemene
  gettimeofday(&tv2, NULL);
82 279 equemene
83 279 equemene
  MYFLOAT elapsedOMP=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
84 279 equemene
                            (tv2.tv_usec-tv1.tv_usec))/1000000;
85 279 equemene
86 279 equemene
  /* printf("A=["); */
87 279 equemene
  /* for (int i=0;i<size;i++) */
88 279 equemene
  /*   { */
89 279 equemene
  /*     printf("%.2f ",A[i]); */
90 279 equemene
  /*   } */
91 279 equemene
  /* printf(" ]\n\n"); */
92 279 equemene
93 279 equemene
  /* printf("B=["); */
94 279 equemene
  /* for (int i=0;i<size;i++) */
95 279 equemene
  /*   { */
96 279 equemene
  /*     printf("%.2f ",B[i]); */
97 279 equemene
  /*   } */
98 279 equemene
  /* printf(" ]\n\n"); */
99 279 equemene
100 279 equemene
  printf("\nA[0]=%.3f A[%i]=%.3f\n",A[0],size,A[size-1]);
101 279 equemene
  printf("B[0]=%.3f B[%i]=%.3f\n\n",B[0],size,B[size-1]);
102 279 equemene
103 279 equemene
  printf("Elapsed Time: %.3f\n",elapsed);
104 279 equemene
  printf("OMP Elapsed Time: %.3f\n",elapsedOMP);
105 279 equemene
106 279 equemene
  printf("NaiveRate: %.i\n",(int)((float)size/elapsed));
107 279 equemene
  printf("OMPRate: %.i\n",(int)((float)size/elapsedOMP));
108 279 equemene
109 279 equemene
  free(a);
110 279 equemene
  free(b);
111 279 equemene
  free(A);
112 279 equemene
  free(B);
113 279 equemene
}