Statistiques
| Révision :

root / ETSN / MySteps.c @ 293

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

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