Advertisement
neInga

Untitled

Dec 22nd, 2021
1,243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include<iostream>
  2. #include<ctime>
  3. #include<mpi.h>
  4. #include<cmath>
  5.  
  6. using namespace std;
  7.  
  8. double Func(double x) {
  9.     return 1 / log(x);
  10. }
  11.  
  12. double Integer(double a, double b, double h) {
  13.  
  14.     double sum = .0;
  15.     for (double i = a; i < b; i += h) {
  16.         sum += (Func(i) + Func(i + h)) / 2;
  17.     }
  18.  
  19.     sum *= h;
  20.  
  21.     //return sum;
  22.     return 2;
  23. }
  24.  
  25. //Нулевой процесс отправляет границы интервалов остальным процессам, использовать рассылку(Scatter);
  26. //Для получения окончательного результата нулевой процесс получает результаты с помощью парных взаимодействий(send / recv)
  27. //и суммирует.
  28. void main(int argc, char** argv)
  29. {
  30.     const int* y =(const int *)4;
  31.     //MPI_Init(y, &argv);
  32.     MPI_Init(&argc, &argv);
  33.     double a = 2, b = 6;//границы
  34.     int rank;//номер процесса
  35.     int numTasks;//кол-во потоков
  36.  
  37.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);  
  38.     MPI_Comm_size(MPI_COMM_WORLD, &numTasks);  
  39.    
  40.  
  41.     MPI_Status status;//статус завершения
  42.     double* sendBuf = new double[3 * numTasks]; //массив с границами  интервалов
  43.     double recvBuffer[3];
  44.     double step = (b - a) / numTasks;//шаг в зависимости от ко-ва потоков
  45.     double shift = (b - a) / 10000.;
  46.     clock_t time = clock();
  47.     if (rank == 0) { //границы интервалов вычисляем в нулевом процессе
  48.         for (size_t i = 0; i < numTasks * 3; i += 3) {
  49.             sendBuf[i] = a + i / 3 * step;//начало
  50.             sendBuf[i + 1] = sendBuf[i] + step;//конец
  51.             sendBuf[i + 2] = shift;
  52.         }
  53.     }
  54.     MPI_Scatter(sendBuf, 3, MPI_DOUBLE, recvBuffer, 3, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  55.     //          откуда, размер, тип, буфер приема, размер, тип, ранг процесса отправки, коммуникатор
  56.  
  57.     double res = Integer(recvBuffer[0], recvBuffer[1], recvBuffer[2]);
  58.    
  59.     double* curRes = new double;
  60.     if (rank == 0)
  61.     {
  62.         time = clock() - time;
  63.         double* curRes = new double();
  64.         MPI_Reduce(&res, curRes, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
  65.         cout << res << endl;
  66.  
  67.         cout << "Trapes : " << res << endl;
  68.         cout << "Time : " << time << " ms" << endl;
  69.         //delete curRes;
  70.         cout << "CRes : " << *curRes << endl;
  71.  
  72.     }
  73.  
  74.    
  75.     MPI_Finalize();  //
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement