Statistiques
| Révision :

root / ETSN / DFT.c @ 278

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

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