Statistiques
| Révision :

root / Pi / C / OpenMP / XeonPhi / Pi_OpenMP.c @ 82

Historique | Voir | Annoter | Télécharger (4,77 ko)

1 78 equemene
//
2 78 equemene
// Estimation of Pi using Monte Carlo exploration process
3 82 equemene
// Exploit OpenMP on Xeon Phi
4 82 equemene
// source /opt/intel/bin/compilervars.sh intel64
5 82 equemene
// icpc -std=c99 -O3 -o Pi Pi.c -lm
6 78 equemene
//
7 78 equemene
8 78 equemene
#include <math.h>
9 78 equemene
#include <stdio.h>
10 78 equemene
#include <stdlib.h>
11 78 equemene
#include <omp.h>
12 78 equemene
#include <limits.h>
13 78 equemene
14 78 equemene
// Marsaglia RNG very simple implementation
15 78 equemene
#define znew  ((z=36969*(z&65535)+(z>>16))<<16)
16 78 equemene
#define wnew  ((w=18000*(w&65535)+(w>>16))&65535)
17 78 equemene
#define MWC   (znew+wnew)
18 78 equemene
#define SHR3  (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5))
19 78 equemene
#define CONG  (jcong=69069*jcong+1234567)
20 78 equemene
#define KISS  ((MWC^CONG)+SHR3)
21 78 equemene
22 78 equemene
#define MWCfp MWC * 2.328306435454494e-10f
23 78 equemene
#define KISSfp KISS * 2.328306435454494e-10f
24 82 equemene
#define SHR3fp SHR3 * 2.328306435454494e-10f
25 82 equemene
#define CONGfp CONG * 2.328306435454494e-10f
26 78 equemene
27 78 equemene
#define ITERATIONS 1000000000
28 78 equemene
29 78 equemene
#define PROCESS 4
30 78 equemene
31 78 equemene
#ifdef LONG
32 78 equemene
#define LENGTH long long
33 78 equemene
#else
34 78 equemene
#define LENGTH int
35 78 equemene
#endif
36 78 equemene
37 78 equemene
#pragma omp declare target
38 78 equemene
LENGTH splitter(int,int,int,LENGTH);
39 78 equemene
40 78 equemene
LENGTH MainLoopGlobal(LENGTH iterations,unsigned int seed_w,unsigned int seed_z)
41 78 equemene
{
42 82 equemene
#if defined TCONG
43 82 equemene
   unsigned int jcong=seed_z;
44 82 equemene
#elif defined TSHR3
45 82 equemene
   unsigned int jsr=seed_w;
46 82 equemene
#elif defined TMWC
47 78 equemene
   unsigned int z=seed_z;
48 78 equemene
   unsigned int w=seed_w;
49 82 equemene
#elif defined TKISS
50 82 equemene
   unsigned int jcong=seed_z;
51 82 equemene
   unsigned int jsr=seed_w;
52 82 equemene
   unsigned int z=seed_z;
53 82 equemene
   unsigned int w=seed_w;
54 82 equemene
#endif
55 82 equemene
56 78 equemene
   LENGTH total=0;
57 78 equemene
58 78 equemene
   for (LENGTH i=0;i<iterations;i++) {
59 78 equemene
60 82 equemene
#if defined TINT32
61 82 equemene
    #define THEONE 1073741824
62 82 equemene
    #if defined TCONG
63 82 equemene
        unsigned int x=CONG>>17 ;
64 82 equemene
        unsigned int y=CONG>>17 ;
65 82 equemene
    #elif defined TSHR3
66 82 equemene
        unsigned int x=SHR3>>17 ;
67 82 equemene
        unsigned int y=SHR3>>17 ;
68 82 equemene
    #elif defined TMWC
69 82 equemene
        unsigned int x=MWC>>17 ;
70 82 equemene
        unsigned int y=MWC>>17 ;
71 82 equemene
    #elif defined TKISS
72 82 equemene
        unsigned int x=KISS>>17 ;
73 82 equemene
        unsigned int y=KISS>>17 ;
74 82 equemene
    #endif
75 82 equemene
#elif defined TINT64
76 82 equemene
    #define THEONE 4611686018427387904
77 82 equemene
    #if defined TCONG
78 82 equemene
        unsigned long x=(unsigned long)(CONG>>1) ;
79 82 equemene
        unsigned long y=(unsigned long)(CONG>>1) ;
80 82 equemene
    #elif defined TSHR3
81 82 equemene
        unsigned long x=(unsigned long)(SHR3>>1) ;
82 82 equemene
        unsigned long y=(unsigned long)(SHR3>>1) ;
83 82 equemene
    #elif defined TMWC
84 82 equemene
        unsigned long x=(unsigned long)(MWC>>1) ;
85 82 equemene
        unsigned long y=(unsigned long)(MWC>>1) ;
86 82 equemene
    #elif defined TKISS
87 82 equemene
        unsigned long x=(unsigned long)(KISS>>1) ;
88 82 equemene
        unsigned long y=(unsigned long)(KISS>>1) ;
89 82 equemene
    #endif
90 82 equemene
#elif defined TFP32
91 82 equemene
    #define THEONE 1.0f
92 82 equemene
    #if defined TCONG
93 82 equemene
        float x=CONGfp ;
94 82 equemene
        float y=CONGfp ;
95 82 equemene
    #elif defined TSHR3
96 82 equemene
        float x=SHR3fp ;
97 82 equemene
        float y=SHR3fp ;
98 82 equemene
    #elif defined TMWC
99 82 equemene
        float x=MWCfp ;
100 82 equemene
        float y=MWCfp ;
101 82 equemene
    #elif defined TKISS
102 82 equemene
      float x=KISSfp ;
103 82 equemene
      float y=KISSfp ;
104 82 equemene
    #endif
105 82 equemene
#elif defined TFP64
106 82 equemene
    #define THEONE 1.0f
107 82 equemene
    #if defined TCONG
108 82 equemene
        double x=(double)CONGfp ;
109 82 equemene
        double y=(double)CONGfp ;
110 82 equemene
    #elif defined TSHR3
111 82 equemene
        double x=(double)SHR3fp ;
112 82 equemene
        double y=(double)SHR3fp ;
113 82 equemene
    #elif defined TMWC
114 82 equemene
        double x=(double)MWCfp ;
115 82 equemene
        double y=(double)MWCfp ;
116 82 equemene
    #elif defined TKISS
117 82 equemene
        double x=(double)KISSfp ;
118 82 equemene
        double y=(double)KISSfp ;
119 82 equemene
    #endif
120 82 equemene
#endif
121 78 equemene
122 78 equemene
      // Matching test
123 82 equemene
      unsigned long inside=((x*x+y*y) < THEONE) ? 1:0;
124 78 equemene
      total+=inside;
125 82 equemene
126 78 equemene
   }
127 78 equemene
128 78 equemene
   return(total);
129 78 equemene
}
130 78 equemene
131 78 equemene
LENGTH splitter(int process,int seed_w,int seed_z,LENGTH iterations) {
132 78 equemene
133 82 equemene
  LENGTH inside[4096],insides=0;
134 78 equemene
  int i;
135 78 equemene
136 78 equemene
#pragma omp target device(0)
137 78 equemene
#pragma omp teams num_teams(60) thread_limit(4)
138 82 equemene
// #pragma omp parallel for
139 78 equemene
#pragma omp distribute
140 78 equemene
  for (int i=0 ; i<process; i++) {
141 82 equemene
    inside[i]=MainLoopGlobal(iterations/process,seed_w+i,seed_z+i);
142 78 equemene
  }
143 78 equemene
144 78 equemene
  for (int i=0 ; i<process; i++) {
145 82 equemene
    printf("\tFound %lld for process %i\n",(long long)inside[i],i);
146 78 equemene
    insides+=inside[i];
147 78 equemene
  }
148 82 equemene
  printf("\n");
149 78 equemene
150 78 equemene
  return(insides);
151 78 equemene
}
152 78 equemene
153 78 equemene
int main(int argc, char *argv[]) {
154 78 equemene
155 78 equemene
  unsigned int seed_w=10,seed_z=10,process=PROCESS;
156 78 equemene
  LENGTH iterations=ITERATIONS;
157 82 equemene
  LENGTH insides=0;
158 78 equemene
159 78 equemene
  if (argc > 1) {
160 78 equemene
    iterations=(LENGTH)atoll(argv[1]);
161 78 equemene
    process=atoi(argv[2]);
162 78 equemene
  }
163 78 equemene
  else {
164 78 equemene
    printf("\n\tPi : Estimate Pi with Monte Carlo exploration\n\n");
165 78 equemene
    printf("\t\t#1 : number of iterations (default 1 billion)\n");
166 78 equemene
    printf("\t\t#2 : number of process (default 4)\n\n");
167 78 equemene
  }
168 78 equemene
169 78 equemene
  printf ("\n\tInformation about architecture:\n\n");
170 78 equemene
171 78 equemene
  printf ("\tSizeof int = %lld bytes.\n", (long long)sizeof(int));
172 78 equemene
  printf ("\tSizeof long = %lld bytes.\n", (long long)sizeof(long));
173 78 equemene
  printf ("\tSizeof long long = %lld bytes.\n\n", (long long)sizeof(long long));
174 78 equemene
175 78 equemene
  printf ("\tMax int = %u\n", INT_MAX);
176 78 equemene
  printf ("\tMax long = %ld\n", LONG_MAX);
177 78 equemene
  printf ("\tMax long long = %lld\n\n", LLONG_MAX);
178 78 equemene
179 78 equemene
  insides=splitter(process,seed_w,seed_z,iterations);
180 78 equemene
181 78 equemene
  float pi=4.*(float)insides/(float)iterations;
182 78 equemene
183 78 equemene
  printf("\tPi=%f with error %f and %lld iterations\n\n",pi,
184 78 equemene
         fabs(pi-4*atan(1))/pi,(long long)iterations);
185 78 equemene
186 78 equemene
}