root / ETSN / MySteps_1_openmp.c
Historique | Voir | Annoter | Télécharger (2,63 ko)
1 | 296 | equemene | /* Simple Sum function in C and OpenMP/C */
|
---|---|---|---|
2 | 296 | equemene | /* compilation with sequential compute : gcc -fopenmp -O3 -o MySteps_1_openmp MySteps_1_openmp.c -lm -lgomp */
|
3 | 296 | equemene | /* compilation without sequential compute : gcc -DNOSERIAL -fopenmp -O3 -o MySteps_1_openmp_1_NoSerial MySteps_1_openmp.c -lm -lgomp */
|
4 | 296 | equemene | |
5 | 296 | equemene | #include <math.h> |
6 | 296 | equemene | #include <stdio.h> |
7 | 296 | equemene | #include <stdlib.h> |
8 | 296 | equemene | #include <sys/time.h> |
9 | 296 | equemene | |
10 | 296 | equemene | #define PI 3.141592653589793 |
11 | 296 | equemene | |
12 | 296 | equemene | #define MYFLOAT float |
13 | 296 | equemene | |
14 | 296 | equemene | void MySum(MYFLOAT *res, MYFLOAT *a, MYFLOAT *b, int size) |
15 | 296 | equemene | { |
16 | 296 | equemene | for (uint i=0; i<size;i++) |
17 | 296 | equemene | { |
18 | 296 | equemene | res[i] = a[i] + b[i]; |
19 | 296 | equemene | } |
20 | 296 | equemene | } |
21 | 296 | equemene | |
22 | 296 | equemene | void MySillySumOMP(MYFLOAT *res, MYFLOAT *a, MYFLOAT *b, int size) |
23 | 296 | equemene | { |
24 | 296 | equemene | #pragma omp parallel for |
25 | 296 | equemene | for (uint i=0; i<size;i++) |
26 | 296 | equemene | { |
27 | 296 | equemene | res[i] = a[i] + b[i]; |
28 | 296 | equemene | } |
29 | 296 | equemene | } |
30 | 296 | equemene | |
31 | 296 | equemene | MYFLOAT MyNorm(MYFLOAT *a,MYFLOAT *b,int size)
|
32 | 296 | equemene | { |
33 | 296 | equemene | MYFLOAT norm=0.;
|
34 | 296 | equemene | |
35 | 296 | equemene | for (int i=0;i<size;i++) |
36 | 296 | equemene | { |
37 | 296 | equemene | norm+=pow(a[i]-b[i],2);
|
38 | 296 | equemene | } |
39 | 296 | equemene | |
40 | 296 | equemene | return(sqrt(norm));
|
41 | 296 | equemene | } |
42 | 296 | equemene | |
43 | 296 | equemene | void MyPrint(MYFLOAT *a,int size) |
44 | 296 | equemene | { |
45 | 296 | equemene | printf("[");
|
46 | 296 | equemene | for (int i=0;i<size;i++) |
47 | 296 | equemene | { |
48 | 296 | equemene | printf(" %.8e ",a[i]);
|
49 | 296 | equemene | } |
50 | 296 | equemene | printf("]\n");
|
51 | 296 | equemene | } |
52 | 296 | equemene | |
53 | 296 | equemene | int main(int argc,char *argv[]) |
54 | 296 | equemene | { |
55 | 296 | equemene | float *a,*b,*res,*resacc;
|
56 | 296 | equemene | int size=1024; |
57 | 296 | equemene | struct timeval tv1,tv2;
|
58 | 296 | equemene | |
59 | 296 | equemene | if (argc > 1) { |
60 | 296 | equemene | size=(int)atoll(argv[1]); |
61 | 296 | equemene | } |
62 | 296 | equemene | else {
|
63 | 296 | equemene | printf("\n\tPi : Estimate SillySum\n\n\t\t#1 : size (default 1024)\n\n");
|
64 | 296 | equemene | } |
65 | 296 | equemene | |
66 | 296 | equemene | printf("%i\n",size);
|
67 | 296 | equemene | |
68 | 296 | equemene | a=(float*)malloc(size*sizeof(MYFLOAT)); |
69 | 296 | equemene | b=(float*)malloc(size*sizeof(MYFLOAT)); |
70 | 296 | equemene | res=(float*)malloc(size*sizeof(MYFLOAT)); |
71 | 296 | equemene | resacc=(float*)malloc(size*sizeof(MYFLOAT)); |
72 | 296 | equemene | |
73 | 296 | equemene | srand(110271);
|
74 | 296 | equemene | |
75 | 296 | equemene | for (int i=0;i<size;i++) |
76 | 296 | equemene | { |
77 | 296 | equemene | a[i]=(MYFLOAT)rand()/(MYFLOAT)RAND_MAX; |
78 | 296 | equemene | b[i]=(MYFLOAT)rand()/(MYFLOAT)RAND_MAX; |
79 | 296 | equemene | res[i]=0.;
|
80 | 296 | equemene | resacc[i]=0.;
|
81 | 296 | equemene | } |
82 | 296 | equemene | |
83 | 296 | equemene | #ifndef NOSERIAL
|
84 | 296 | equemene | gettimeofday(&tv1, NULL);
|
85 | 296 | equemene | MySum(res,a,b,size); |
86 | 296 | equemene | gettimeofday(&tv2, NULL);
|
87 | 296 | equemene | #endif
|
88 | 296 | equemene | |
89 | 296 | equemene | MYFLOAT elapsed=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
|
90 | 296 | equemene | (tv2.tv_usec-tv1.tv_usec))/1000000;
|
91 | 296 | equemene | |
92 | 296 | equemene | gettimeofday(&tv1, NULL);
|
93 | 296 | equemene | MySillySumOMP(resacc,a,b,size); |
94 | 296 | equemene | gettimeofday(&tv2, NULL);
|
95 | 296 | equemene | |
96 | 296 | equemene | MYFLOAT elapsedAcc=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
|
97 | 296 | equemene | (tv2.tv_usec-tv1.tv_usec))/1000000;
|
98 | 296 | equemene | |
99 | 296 | equemene | #ifndef NOSERIAL
|
100 | 296 | equemene | MYFLOAT MyChecker=MyNorm(res,resacc,size); |
101 | 296 | equemene | printf("Norm: %.8e\n",MyChecker);
|
102 | 296 | equemene | #endif
|
103 | 296 | equemene | |
104 | 296 | equemene | #ifdef VERBOSE
|
105 | 296 | equemene | MyPrint(res,size); |
106 | 296 | equemene | MyPrint(resacc,size); |
107 | 296 | equemene | #endif
|
108 | 296 | equemene | |
109 | 296 | equemene | #ifndef NOSERIAL
|
110 | 296 | equemene | printf("Elapsed Time: %.3f\n",elapsed);
|
111 | 296 | equemene | #endif
|
112 | 296 | equemene | |
113 | 296 | equemene | printf("OMP Elapsed Time: %.3f\n",elapsedAcc);
|
114 | 296 | equemene | |
115 | 296 | equemene | #ifndef NOSERIAL
|
116 | 296 | equemene | printf("NaiveRate: %.lld\n",(unsigned long)((float)size/elapsed)); |
117 | 296 | equemene | #endif
|
118 | 296 | equemene | printf("OMPRate: %.lld\n",(unsigned long)((float)size/elapsedAcc)); |
119 | 296 | equemene | |
120 | 296 | equemene | #ifndef NOSERIAL
|
121 | 296 | equemene | printf("AccRatio: %.3f\n",elapsed/elapsedAcc);
|
122 | 296 | equemene | #endif
|
123 | 296 | equemene | |
124 | 296 | equemene | free(a); |
125 | 296 | equemene | free(b); |
126 | 296 | equemene | free(res); |
127 | 296 | equemene | free(resacc); |
128 | 296 | equemene | } |