Statistiques
| Révision :

root / ETSN / MyDFT.c @ 298

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

1
/* Simple Discrete Fourier Transform implemented in C and OpenMP/C */
2
/* compilation with : gcc -fopenmp -O3 -o MyDFT MyDFT.c -lm -lgomp */
3

    
4
#include <math.h>
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <sys/time.h>
8

    
9
#define PI 3.141592653589793
10

    
11
#define MYFLOAT float
12

    
13
void MyDFT(MYFLOAT *A, MYFLOAT *B, MYFLOAT *a, MYFLOAT *b,int size)
14
{
15
  for (uint j=0;j<size;j++)
16
    {
17
      MYFLOAT At=0.,Bt=0.;
18
      for (uint i=0; i<size;i++) 
19
        {
20
          At+=a[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)-b[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
21
          Bt+=a[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)+b[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
22
        }
23
      A[j]=At;
24
      B[j]=Bt;
25
    }
26
}
27

    
28
void MyDFTOMP(MYFLOAT *A, MYFLOAT *B, MYFLOAT *a, MYFLOAT *b,int size)
29
{
30
  #pragma omp parallel for
31
  for (uint j=0;j<size;j++)
32
    {
33
      MYFLOAT At=0.,Bt=0.;
34
      for (uint i=0; i<size;i++) 
35
        {
36
          At+=a[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)-b[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
37
          Bt+=a[i]*sin(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size)+b[i]*cos(2.*PI*(MYFLOAT)(j*i)/(MYFLOAT)size);
38
        }
39
      A[j]=At;
40
      B[j]=Bt;
41
    }
42
}
43

    
44

    
45

    
46
int main(int argc,char *argv[])
47
{
48
  float *a,*b,*A,*B;
49
  int size=1024;
50
  struct timeval tv1,tv2;
51
 
52
  if (argc > 1) {
53
    size=(int)atoll(argv[1]);
54
  }
55
  else {
56
    printf("\n\tPi : Estimate DFT\n\n\t\t#1 : size (default 1024)\n\n");
57
  }
58

    
59
  a=(float*)malloc(size*sizeof(MYFLOAT));
60
  b=(float*)malloc(size*sizeof(MYFLOAT));
61
  A=(float*)malloc(size*sizeof(MYFLOAT));
62
  B=(float*)malloc(size*sizeof(MYFLOAT));
63

    
64
  for (int i=0;i<size;i++)
65
    {
66
      a[i]=1.;
67
      b[i]=1.;
68
      A[i]=0.;
69
      A[i]=0.;
70
    }
71

    
72
  gettimeofday(&tv1, NULL);
73
  MyDFT(A,B,a,b,size);
74
  gettimeofday(&tv2, NULL);
75

    
76
  MYFLOAT elapsed=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
77
                            (tv2.tv_usec-tv1.tv_usec))/1000000;
78

    
79
  gettimeofday(&tv1, NULL);
80
  MyDFTOMP(A,B,a,b,size);
81
  gettimeofday(&tv2, NULL);
82

    
83
  MYFLOAT elapsedOMP=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
84
                            (tv2.tv_usec-tv1.tv_usec))/1000000;
85

    
86
  /* printf("A=["); */
87
  /* for (int i=0;i<size;i++) */
88
  /*   { */
89
  /*     printf("%.2f ",A[i]); */
90
  /*   } */
91
  /* printf(" ]\n\n"); */
92

    
93
  /* printf("B=["); */
94
  /* for (int i=0;i<size;i++) */
95
  /*   { */
96
  /*     printf("%.2f ",B[i]); */
97
  /*   } */
98
  /* printf(" ]\n\n"); */
99

    
100
  printf("\nA[0]=%.3f A[%i]=%.3f\n",A[0],size,A[size-1]);
101
  printf("B[0]=%.3f B[%i]=%.3f\n\n",B[0],size,B[size-1]);
102

    
103
  printf("Elapsed Time: %.3f\n",elapsed);
104
  printf("OMP Elapsed Time: %.3f\n",elapsedOMP);
105

    
106
  printf("NaiveRate: %.i\n",(int)((float)size/elapsed));
107
  printf("OMPRate: %.i\n",(int)((float)size/elapsedOMP));
108
  
109
  free(a);
110
  free(b);
111
  free(A);
112
  free(B);
113
}
114