Révision 23 Pi/C/MPI/Pi_MPI.c

Pi_MPI.c (revision 23)
8 8
#include <stdlib.h>
9 9
#include <mpi.h>
10 10

  
11
#ifdef TIME
12
#include <sys/time.h>
13
#endif
14

  
11 15
// Marsaglia RNG very simple implementation
12 16
#define znew  ((z=36969*(z&65535)+(z>>16))<<16)
13 17
#define wnew  ((w=18000*(w&65535)+(w>>16))&65535)
......
55 59
  int numtasks,rank,rc,tag=1,i;
56 60
  float pi;
57 61

  
62
#ifdef TIME
63
  struct timeval start,end;
64
  long int useconds;
65
#endif
66

  
58 67
  MPI_Status Stat;
59 68

  
60 69
  rc = MPI_Init(&argc,&argv);
......
76 85
      printf("\t\t#1 : number of iterations (default 1 billion)\n\n");
77 86
    }
78 87

  
79
    part_iterations=iterations/numtasks;
88
    part_iterations=iterations/numtasks+1;
80 89
    // Split part of code
81 90
    for (i=1;i<numtasks;i++) {
82 91
      rc = MPI_Send(&part_iterations, 1, MPI_UNSIGNED_LONG, i, tag, 
83 92
                    MPI_COMM_WORLD);
84 93
    }
85 94
    
95
#ifdef TIME
96
    gettimeofday(&start,(struct timezone *)0);
97
#endif
98

  
86 99
    insides=MainLoopGlobal(part_iterations,seed_w,seed_z);
87
    printf("\tOn %i, find %lu inside\n",rank,(unsigned long)insides);
88
    
100

  
101
#ifdef TIME
102
    gettimeofday(&end,(struct timezone *)0);
103
    useconds=(end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec;
104

  
105
      printf("\tOn %i, find %lu inside in %lu useconds.\n",rank,
106
	     (unsigned long)insides,useconds);
107
#else
108
      printf("\tOn %i, find %lu inside\n",rank,
109
	     (unsigned long)insides);
110

  
111
#endif
112

  
89 113
    // Join part of code
90 114
    for (i=1;i<numtasks;i++) {
91 115
      rc = MPI_Recv(&inside[i], 1, MPI_UNSIGNED_LONG, i, tag, 
......
96 120
    
97 121
    pi=4.*(float)insides/(float)((iterations/numtasks)*numtasks);
98 122
    
99
    printf("\n\tPi=%f with error %f and %lu iterations\n\n",pi,
100
           fabs(pi-4*atan(1))/pi,(unsigned long)iterations);
123
    printf("\n\tPi=%.40f\n\twith error %.40f\n\twith %lu iterations\n\n",pi,
124
           fabs(pi-4*atan(1.))/pi,(unsigned long)iterations);
101 125
  }
102 126
  else
103 127
    {
......
108 132
      printf("\tOn %i, receive from master %lu\n",
109 133
             rank,(unsigned long)part_iterations);
110 134
      
135
#ifdef TIME
136
      gettimeofday(&start,(struct timezone *)0);
137
#endif
138

  
111 139
      part_inside=MainLoopGlobal(part_iterations,seed_w,seed_z);
112 140
      
113
      printf("\tOn %i, find %lu inside\n",rank,(unsigned long)part_inside);
141
#ifdef TIME
142
    gettimeofday(&end,(struct timezone *)0);
143
    useconds=(end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec;
114 144

  
145
      printf("\tOn %i, find %lu inside in %lu useconds.\n",rank,
146
	     (unsigned long)part_inside,useconds);
147
#else
148
      printf("\tOn %i, find %lu inside\n",rank,
149
	     (unsigned long)part_inside);
150

  
151
#endif
152

  
115 153
      rc = MPI_Send(&part_inside, 1, MPI_UNSIGNED_LONG, 0, tag, MPI_COMM_WORLD);
116 154
    }
117 155
  

Formats disponibles : Unified diff