Statistiques
| Révision :

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

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

1 78 equemene
//
2 78 equemene
// Estimation of Pi using Monte Carlo exploration process
3 78 equemene
// gcc -std=c99 -O3 -o Pi Pi.c -lm
4 78 equemene
//
5 78 equemene
6 78 equemene
#include <math.h>
7 78 equemene
#include <stdio.h>
8 78 equemene
#include <stdlib.h>
9 78 equemene
#include <omp.h>
10 78 equemene
#include <limits.h>
11 78 equemene
12 78 equemene
// Marsaglia RNG very simple implementation
13 78 equemene
#define znew  ((z=36969*(z&65535)+(z>>16))<<16)
14 78 equemene
#define wnew  ((w=18000*(w&65535)+(w>>16))&65535)
15 78 equemene
#define MWC   (znew+wnew)
16 78 equemene
#define SHR3  (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5))
17 78 equemene
#define CONG  (jcong=69069*jcong+1234567)
18 78 equemene
#define KISS  ((MWC^CONG)+SHR3)
19 78 equemene
20 78 equemene
#define MWCfp MWC * 2.328306435454494e-10f
21 78 equemene
#define KISSfp KISS * 2.328306435454494e-10f
22 78 equemene
23 78 equemene
#define ITERATIONS 1000000000
24 78 equemene
25 78 equemene
#define PROCESS 4
26 78 equemene
27 78 equemene
#ifdef LONG
28 78 equemene
#define LENGTH long long
29 78 equemene
#else
30 78 equemene
#define LENGTH int
31 78 equemene
#endif
32 78 equemene
33 78 equemene
#pragma omp declare target
34 78 equemene
LENGTH splitter(int,int,int,LENGTH);
35 78 equemene
36 78 equemene
LENGTH MainLoopGlobal(LENGTH iterations,unsigned int seed_w,unsigned int seed_z)
37 78 equemene
{
38 78 equemene
   unsigned int z=seed_z;
39 78 equemene
   unsigned int w=seed_w;
40 78 equemene
41 78 equemene
   LENGTH total=0;
42 78 equemene
43 78 equemene
   for (LENGTH i=0;i<iterations;i++) {
44 78 equemene
45 78 equemene
      float x=MWCfp ;
46 78 equemene
      float y=MWCfp ;
47 78 equemene
48 78 equemene
      // Matching test
49 78 equemene
      int inside=((x*x+y*y) < 1.0f) ? 1:0;
50 78 equemene
      total+=inside;
51 78 equemene
   }
52 78 equemene
53 78 equemene
   return(total);
54 78 equemene
}
55 78 equemene
56 78 equemene
LENGTH splitter(int process,int seed_w,int seed_z,LENGTH iterations) {
57 78 equemene
58 78 equemene
  LENGTH inside[1024],insides=0;
59 78 equemene
  int i;
60 78 equemene
61 78 equemene
#pragma omp target device(0)
62 78 equemene
#pragma omp teams num_teams(60) thread_limit(4)
63 78 equemene
#pragma omp distribute
64 78 equemene
  for (int i=0 ; i<process; i++) {
65 78 equemene
    inside[i]=MainLoopGlobal(iterations/process,seed_w+process,seed_z+process);
66 78 equemene
    //    printf("\tFound %lld for process %i\n",(long long)inside[i],i);
67 78 equemene
  }
68 78 equemene
  //printf("\n");
69 78 equemene
70 78 equemene
  for (int i=0 ; i<process; i++) {
71 78 equemene
    insides+=inside[i];
72 78 equemene
  }
73 78 equemene
74 78 equemene
  return(insides);
75 78 equemene
}
76 78 equemene
77 78 equemene
int main(int argc, char *argv[]) {
78 78 equemene
79 78 equemene
  unsigned int seed_w=10,seed_z=10,process=PROCESS;
80 78 equemene
  LENGTH iterations=ITERATIONS;
81 78 equemene
  LENGTH inside[1024],insides=0;
82 78 equemene
83 78 equemene
  if (argc > 1) {
84 78 equemene
    iterations=(LENGTH)atoll(argv[1]);
85 78 equemene
    process=atoi(argv[2]);
86 78 equemene
  }
87 78 equemene
  else {
88 78 equemene
    printf("\n\tPi : Estimate Pi with Monte Carlo exploration\n\n");
89 78 equemene
    printf("\t\t#1 : number of iterations (default 1 billion)\n");
90 78 equemene
    printf("\t\t#2 : number of process (default 4)\n\n");
91 78 equemene
  }
92 78 equemene
93 78 equemene
  printf ("\n\tInformation about architecture:\n\n");
94 78 equemene
95 78 equemene
  printf ("\tSizeof int = %lld bytes.\n", (long long)sizeof(int));
96 78 equemene
  printf ("\tSizeof long = %lld bytes.\n", (long long)sizeof(long));
97 78 equemene
  printf ("\tSizeof long long = %lld bytes.\n\n", (long long)sizeof(long long));
98 78 equemene
99 78 equemene
  printf ("\tMax int = %u\n", INT_MAX);
100 78 equemene
  printf ("\tMax long = %ld\n", LONG_MAX);
101 78 equemene
  printf ("\tMax long long = %lld\n\n", LLONG_MAX);
102 78 equemene
103 78 equemene
  insides=splitter(process,seed_w,seed_z,iterations);
104 78 equemene
105 78 equemene
  float pi=4.*(float)insides/(float)iterations;
106 78 equemene
107 78 equemene
  printf("\tPi=%f with error %f and %lld iterations\n\n",pi,
108 78 equemene
         fabs(pi-4*atan(1))/pi,(long long)iterations);
109 78 equemene
110 78 equemene
}