Advertisement
Tvor0zhok

ParProg8.3

May 15th, 2023
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <iomanip>
  4. #include "mpi.h"
  5. using namespace std;
  6.  
  7. double MPI_Simps(double a, double b, int N, double Func(double), int& ProcID)
  8. {
  9. double h = (b - a) / (2 * N);
  10.  
  11. int k, NumProc;
  12. double S1, mpi_S1, S2, mpi_S2, Tmp;
  13.  
  14. MPI_Init(NULL, NULL);
  15. MPI_Comm_size(MPI_COMM_WORLD, &NumProc);
  16. MPI_Comm_rank(MPI_COMM_WORLD, &ProcID);
  17. MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
  18.  
  19. mpi_S1 = 0; mpi_S2 = 0;
  20.  
  21. for (k = 1 + ProcID; k < N; k += NumProc)
  22. {
  23. Tmp = a + (2 * k - 1) * h;
  24. mpi_S1 += Func(Tmp);
  25. mpi_S2 += Func(Tmp + h);
  26. }
  27.  
  28. MPI_Reduce(&mpi_S1, &S1, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
  29. MPI_Reduce(&mpi_S2, &S2, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
  30. MPI_Finalize();
  31.  
  32. S1 += Func(b - h);
  33.  
  34. return h * (Func(a) + Func(b) + 4.0 * S1 + 2.0 * S2) / 3.0;
  35. }
  36.  
  37. double fun(double x)
  38. {
  39. return 1.0 / (1.0 + x * x);
  40. }
  41.  
  42. int main(int argc, char** argv)
  43. {
  44. int ProcID;
  45.  
  46. double Tms = clock();
  47. double Intgr = MPI_Simps(0, 1000000, 1000000000, fun, ProcID);
  48.  
  49. Tms = (clock() - Tms) / CLOCKS_PER_SEC;
  50.  
  51. if (!ProcID)
  52. {
  53. cout << "Time=" << Tms << " sec" << endl;
  54.  
  55. cout.precision(8);
  56. cout << "Intgr=" << Intgr << " " << M_PI / 2.0 << endl;
  57. }
  58.  
  59. // Последовательная реализация
  60. // Time=25.396 sec
  61. // Intgr = 1.5707953 1.5707963
  62.  
  63. return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement