Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <mpi.h>
- #define MASTER 0 /*Procesul master */
- #define TRIES 50000 /*Numarul de incercari-generari de numere aleatoare*/
- #define ITER 100 /*Numaarul de iteratii pt cele TRIES incercari*/
- #define SQR(x) ((x)*(x))
- double hit (int tries);
- int main (int argc, char ** argv)
- {
- double local_pi, /*valoarea pi locala*/
- sum_pi, /*buffer pentru suma valorile locale*/
- aver_pi, /*valoarea medie a tuturor iteratiilor*/
- pi; /*valoarea pi generata de procesul master*/
- int my_rank, nproc, rc, i;
- MPI_Status status;
- MPI_Init(&argc,&argv);
- MPI_Comm_size(MPI_COMM_WORLD, &nproc);
- MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
- printf("Procesul MPI %d a pornit...\n", my_rank);
- srandom(my_rank); //initializez generatorul de numere aleatoare cu rangul procesului.
- aver_pi=0.;
- for(i = 0;i < ITER; i++)
- {
- local_pi=hit(TRIES);
- rc=MPI_Reduce(&local_pi, &sum_pi, 1, MPI_DOUBLE, MPI_SUM, MASTER, MPI_COMM_WORLD);
- if(rc != MPI_SUCCESS)
- printf("Procesul %d: eroare la operatia MPI_Reduce\n", my_rank);
- /*Master computes average for this iteration and all iterations*/
- if(my_rank == MASTER)
- {
- pi=sum_pi/nproc;
- aver_pi=((aver_pi * i) + pi)/(i + 1);
- printf("\t Dupa %d incercari, valoarea medie a lui pi = %10.8f\n", (TRIES * (i+1)),aver_pi);
- }
- }
- if (my_rank == MASTER)
- printf("\nValoarea aproximativa a lui Pi: 3.1415926535897 \n");
- MPI_Finalize();
- return 0;
- }
- double hit (int tries)
- {
- double x_coord, y_coord, pi, r;
- int score = 0, n;
- unsigned int nrconst = 2 << (31-1);
- for (n=1; n<=tries; n++)
- {
- r = (double) random()/nrconst;
- x_coord = 2.*r -1.;
- r = (double) random()/nrconst;
- y_coord = 2.*r -1.;
- if((SQR(x_coord) + SQR(y_coord)) <= 1.0)
- score++;
- }
- pi = 4.0 * (double)score/(double)tries;
- return pi;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement