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 | } |