Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4.  
  5. #define MASTER 0 /*Procesul master */
  6. #define TRIES 50000 /*Numarul de incercari-generari de numere aleatoare*/
  7. #define ITER 100 /*Numaarul de iteratii pt cele TRIES incercari*/
  8.  
  9. #define SQR(x) ((x)*(x))
  10.  
  11. double hit (int tries);
  12.  
  13. int main (int argc, char ** argv)
  14. {
  15. double local_pi, /*valoarea pi locala*/
  16. sum_pi, /*buffer pentru suma valorile locale*/
  17. aver_pi, /*valoarea medie a tuturor iteratiilor*/
  18. pi; /*valoarea pi generata de procesul master*/
  19.  
  20. int my_rank, nproc, rc, i;
  21. MPI_Status status;
  22.  
  23. MPI_Init(&argc,&argv);
  24. MPI_Comm_size(MPI_COMM_WORLD, &nproc);
  25. MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  26. printf("Procesul MPI %d a pornit...\n", my_rank);
  27.  
  28. srandom(my_rank); //initializez generatorul de numere aleatoare cu rangul procesului.
  29.  
  30. aver_pi=0.;
  31. for(i = 0;i < ITER; i++)
  32. {
  33. local_pi=hit(TRIES);
  34. rc=MPI_Reduce(&local_pi, &sum_pi, 1, MPI_DOUBLE, MPI_SUM, MASTER, MPI_COMM_WORLD);
  35. if(rc != MPI_SUCCESS)
  36. printf("Procesul %d: eroare la operatia MPI_Reduce\n", my_rank);
  37.  
  38. /*Master computes average for this iteration and all iterations*/
  39. if(my_rank == MASTER)
  40. {
  41. pi=sum_pi/nproc;
  42. aver_pi=((aver_pi * i) + pi)/(i + 1);
  43. printf("\t Dupa %d incercari, valoarea medie a lui pi = %10.8f\n", (TRIES * (i+1)),aver_pi);
  44. }
  45. }
  46. if (my_rank == MASTER)
  47. printf("\nValoarea aproximativa a lui Pi: 3.1415926535897 \n");
  48. MPI_Finalize();
  49. return 0;
  50. }
  51.  
  52. double hit (int tries)
  53. {
  54. double x_coord, y_coord, pi, r;
  55. int score = 0, n;
  56. unsigned int nrconst = 2 << (31-1);
  57. for (n=1; n<=tries; n++)
  58. {
  59. r = (double) random()/nrconst;
  60. x_coord = 2.*r -1.;
  61. r = (double) random()/nrconst;
  62. y_coord = 2.*r -1.;
  63. if((SQR(x_coord) + SQR(y_coord)) <= 1.0)
  64. score++;
  65. }
  66. pi = 4.0 * (double)score/(double)tries;
  67. return pi;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement