Statistiques
| Révision :

root / ETSN / MySteps_openmp.c @ 294

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

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