Facebook
From Sludgy Bird, 3 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 57
  1. #include <stdio.h>
  2. #include <mpi.h>
  3. int main(int argc, char **argv) {
  4.   double precision=10000000;
  5.   //precision=100 ;
  6.   int myrank,proccount;
  7.   double pi,pi_final;
  8.   int mine,sign, licznik, sign2;
  9.   int i;
  10.   // Initialize MPI
  11.   MPI_Init(&argc, &argv);
  12.   // find out my rank
  13.   MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  14.   // find out the number of processes in MPI_COMM_WORLD
  15.   MPI_Comm_size(MPI_COMM_WORLD, &proccount);
  16.   // now distribute the required precision
  17.   if (precision<proccount) {
  18.     printf("Precision smaller than the number of processes - try again.");
  19.     MPI_Finalize();
  20.     return -1;
  21.   }
  22.   // each process performs computations on its part
  23.  
  24.   pi=0;
  25.   licznik=0;
  26.   mine=-1;
  27.   //
  28.   sign2=-1;
  29.  
  30.   mine+=(myrank*proccount*2)+2;
  31.   if(proccount%2==1)
  32.   {
  33.     if(myrank%2==1)
  34.     {
  35.       sign2=1;
  36.     }
  37.   }
  38.  
  39.   for(;mine<precision;)
  40.   {
  41.     sign2=sign2*(-1);
  42.     if(licznik==proccount)
  43.     {
  44.       licznik=0;
  45.       mine+=((proccount-1)*(proccount)*2);
  46.       int i2=0;
  47.       if((proccount%2)!=0)
  48.       {
  49.     for(i2;i2<proccount;i2++)
  50.     {
  51.       //sign2=sign2*(-1);
  52.      //printf("\nvvvvvvvvvvvvvvvv");
  53.  
  54.     }
  55.       }
  56.       //mine+=(2*2*(proccount+1));
  57.     }
  58.     //if(myrank==2) printf("\nProcess mryank: %d sign2: %d mine: %d, procca: %d \n\n", myrank,sign2,mine, proccount);
  59.     pi+=sign2/(double)mine;
  60.     mine+=2;
  61.     licznik++;
  62.   }
  63.  
  64.   /*
  65.   mine=myrank*2+1;
  66.   sign=(((mine-1)/2)%2)?-1:1;
  67.   for (;mine<precision;) {
  68.     //        printf("\nProcess %d %d %d", myrank,sign,mine);
  69.     //        fflush(stdout);
  70.     pi+=sign/(double)mine;
  71.     mine+=2*proccount;
  72.     sign=(((mine-1)/2)%2)?-1:1;
  73.   } */
  74.   // now merge the numbers to rank 0
  75.   MPI_Reduce(&pi,&pi_final,1,
  76.              MPI_DOUBLE,MPI_SUM,0,
  77.              MPI_COMM_WORLD);
  78.   if (!myrank) {
  79.     pi_final*=4;
  80.     printf("\n\n\npi=%.20f",pi_final);
  81.    
  82.   }
  83.   // Shut down MPI
  84.   MPI_Finalize();
  85.   return 0;
  86. }