Statistiques
| Révision :

root / ETSN / MySteps_6_openacc.c @ 299

Historique | Voir | Annoter | Télécharger (3,37 ko)

1 296 equemene
/* Simple SillySum function in C and OpenACC/C */
2 296 equemene
/* compilation with sequential compute : gcc -O3 -fopenacc -foffload=nvptx-none -foffload="-O3 -misa=sm_35 -lm" -o MySteps_6_openacc MySteps_6_openacc.c -lm */
3 296 equemene
/* compilation without sequential compute : gcc -DNOSERIAL -O3 -fopenacc -foffload=nvptx-none -foffload="-O3 -misa=sm_35 -lm" -o MySteps_6_openacc_NoSerial MySteps_6_openacc.c -lm */
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
#pragma acc routine
15 296 equemene
MYFLOAT MySillyFunction(MYFLOAT x)
16 296 equemene
{
17 296 equemene
    return(pow(sqrt(log(exp(atanh(tanh(asinh(sinh(acosh(cosh(atan(tan(asin(sin(acos(cos(x))))))))))))))),2));
18 296 equemene
}
19 296 equemene
20 296 equemene
void MySillySum(MYFLOAT *res, MYFLOAT *a, MYFLOAT *b,int calls, int size)
21 296 equemene
{
22 296 equemene
  for (uint i=0; i<size;i++)
23 296 equemene
    {
24 296 equemene
      MYFLOAT ai=a[i];
25 296 equemene
      MYFLOAT bi=b[i];
26 296 equemene
27 296 equemene
      for (int c=0;c<calls;c++)
28 296 equemene
        {
29 296 equemene
          ai=MySillyFunction(ai);
30 296 equemene
          bi=MySillyFunction(bi);
31 296 equemene
        }
32 296 equemene
33 296 equemene
      res[i] = ai + bi;
34 296 equemene
    }
35 296 equemene
}
36 296 equemene
37 296 equemene
void MySillySumOpenACC(MYFLOAT *res, MYFLOAT *a, MYFLOAT *b,int calls, int size)
38 296 equemene
{
39 296 equemene
  #pragma acc data copyin(a[0:size],b[0:size]),copyout(res[0:size])
40 296 equemene
  #pragma acc parallel loop
41 296 equemene
  for (uint i=0; i<size;i++)
42 296 equemene
    {
43 296 equemene
      MYFLOAT ai=a[i];
44 296 equemene
      MYFLOAT bi=b[i];
45 296 equemene
46 296 equemene
      for (int c=0;c<calls;c++)
47 296 equemene
        {
48 296 equemene
          ai=MySillyFunction(ai);
49 296 equemene
          bi=MySillyFunction(bi);
50 296 equemene
        }
51 296 equemene
52 296 equemene
      res[i] = ai + bi;
53 296 equemene
    }
54 296 equemene
}
55 296 equemene
56 296 equemene
MYFLOAT MyNorm(MYFLOAT *a,MYFLOAT *b,int size)
57 296 equemene
{
58 296 equemene
  MYFLOAT norm=0.;
59 296 equemene
60 296 equemene
  for (int i=0;i<size;i++)
61 296 equemene
    {
62 296 equemene
      norm+=pow(a[i]-b[i],2);
63 296 equemene
    }
64 296 equemene
65 296 equemene
  return(sqrt(norm));
66 296 equemene
}
67 296 equemene
68 296 equemene
void MyPrint(MYFLOAT *a,int size)
69 296 equemene
{
70 296 equemene
  printf("[");
71 296 equemene
  for (int i=0;i<size;i++)
72 296 equemene
    {
73 296 equemene
      printf(" %.8e ",a[i]);
74 296 equemene
    }
75 296 equemene
  printf("]\n");
76 296 equemene
}
77 296 equemene
78 296 equemene
int main(int argc,char *argv[])
79 296 equemene
{
80 296 equemene
  float *a,*b,*res,*resacc;
81 296 equemene
  int size=1024;
82 296 equemene
  int calls=1;
83 296 equemene
  struct timeval tv1,tv2;
84 296 equemene
85 296 equemene
  if (argc > 1) {
86 296 equemene
    size=(int)atoll(argv[1]);
87 296 equemene
    calls=(int)atoll(argv[2]);
88 296 equemene
  }
89 296 equemene
  else {
90 296 equemene
    printf("\n\tPi : Estimate SillySum\n\n\t\t#1 : size (default 1024)\n\t\t#2 : calls (default 1)\n\n");
91 296 equemene
  }
92 296 equemene
93 296 equemene
  printf("%i %i\n",size,calls);
94 296 equemene
95 296 equemene
  a=(float*)malloc(size*sizeof(MYFLOAT));
96 296 equemene
  b=(float*)malloc(size*sizeof(MYFLOAT));
97 296 equemene
  res=(float*)malloc(size*sizeof(MYFLOAT));
98 296 equemene
  resacc=(float*)malloc(size*sizeof(MYFLOAT));
99 296 equemene
100 296 equemene
  srand(110271);
101 296 equemene
102 296 equemene
  for (int i=0;i<size;i++)
103 296 equemene
    {
104 296 equemene
      a[i]=(MYFLOAT)rand()/(MYFLOAT)RAND_MAX;
105 296 equemene
      b[i]=(MYFLOAT)rand()/(MYFLOAT)RAND_MAX;
106 296 equemene
      res[i]=0.;
107 296 equemene
      resacc[i]=0.;
108 296 equemene
    }
109 296 equemene
110 296 equemene
#ifndef NOSERIAL
111 296 equemene
  gettimeofday(&tv1, NULL);
112 296 equemene
  MySillySum(res,a,b,calls,size);
113 296 equemene
  gettimeofday(&tv2, NULL);
114 296 equemene
#endif
115 296 equemene
116 296 equemene
  MYFLOAT elapsed=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
117 296 equemene
                            (tv2.tv_usec-tv1.tv_usec))/1000000;
118 296 equemene
119 296 equemene
  gettimeofday(&tv1, NULL);
120 296 equemene
  MySillySumOpenACC(resacc,a,b,calls,size);
121 296 equemene
  gettimeofday(&tv2, NULL);
122 296 equemene
123 296 equemene
  MYFLOAT elapsedAcc=(MYFLOAT)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
124 296 equemene
                               (tv2.tv_usec-tv1.tv_usec))/1000000;
125 296 equemene
126 296 equemene
#ifndef NOSERIAL
127 296 equemene
  MYFLOAT MyChecker=MyNorm(res,resacc,size);
128 296 equemene
  printf("Norm: %.8e\n",MyChecker);
129 296 equemene
#endif
130 296 equemene
131 296 equemene
#ifdef VERBOSE
132 296 equemene
  MyPrint(res,size);
133 296 equemene
  MyPrint(resacc,size);
134 296 equemene
#endif
135 296 equemene
136 296 equemene
#ifndef NOSERIAL
137 296 equemene
  printf("Elapsed Time: %.3f\n",elapsed);
138 296 equemene
  printf("OpenACC Elapsed Time: %.3f\n",elapsedAcc);
139 296 equemene
#endif
140 296 equemene
141 296 equemene
#ifndef NOSERIAL
142 299 equemene
  printf("NativeRate: %.lld\n",(unsigned long)((float)size/elapsed));
143 296 equemene
#endif
144 296 equemene
  printf("OpenACCRate: %.lld\n",(unsigned long)((float)size/elapsedAcc));
145 296 equemene
146 296 equemene
#ifndef NOSERIAL
147 299 equemene
  printf("ACCRatio: %.3f\n",elapsed/elapsedAcc);
148 296 equemene
#endif
149 296 equemene
150 296 equemene
  free(a);
151 296 equemene
  free(b);
152 296 equemene
  free(res);
153 296 equemene
  free(resacc);
154 296 equemene
}