Advertisement
Tvor0zhok

ParProg2 (8)

Oct 25th, 2023
532
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <agents.h>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <locale.h>
  5. #include <time.h>
  6. using namespace concurrency;
  7. using namespace std;
  8.  
  9. int const N = 100; //Размерность рядов
  10. int const NNN = 1000; //Длина массива на входе конвейера
  11. int const Chunk = 100; //Порция обрабатываемых элементов
  12.  
  13. double Func1(double x) // 1-ая ступень конвейера
  14. {
  15.     double Tmp = 0, Tmpa = x * x;
  16.  
  17.     for (int n = 0; n <= N; n++) {
  18.         double Tmpn4 = n * n * n * n, Tmpxn = sqrt(Tmpa + Tmpn4);
  19.  
  20.         for (int k = 0; k <= N; k++) {
  21.             double Tmpk = k * k;
  22.  
  23.             for (int j = 0; j <= N; j++)
  24.                 Tmp += (x + j) / (1 + Tmpxn + Tmpk + j * j * j);
  25.         }
  26.     }
  27.  
  28.     return Tmp;
  29. }
  30.  
  31. double Func2(double x) // 2-ая ступень конвейера
  32. {
  33.     double Tmp = 0, Tmpa = x * x;
  34.  
  35.     for (int n = 0; n <= N; n++) {
  36.         double Tmpn = n * n * n;
  37.  
  38.         for (int k = 0; k <= N; k++) {
  39.             double Tmpk = k * k * k;
  40.  
  41.             for (int j = 0; j <= N; j++)
  42.                 Tmp += (x * x - k) / (1 + Tmpa + Tmpn + Tmpk + j * j);
  43.         }
  44.     }
  45.  
  46.     return x * Tmp;
  47. }
  48.  
  49. class Stage_Agent : public agent // Отдельная ступень конвейера
  50. {
  51.  
  52. private:
  53.     ISource<double>& _source; // Буфер - источник информации
  54.     ITarget<double>& _target; // Буфер - приемник информации
  55.     double(*_func) (double); //Функция для обработки
  56.  
  57. public:
  58.    
  59.     //Конструктор агента
  60.     Stage_Agent(ISource<double>& source, ITarget<double>& target, double func(double)) : _target(target), _source(source)
  61.     {
  62.         _func = func;
  63.     }
  64.  
  65. protected:
  66.     void run() //Выполняемая агентом работа
  67.     {
  68.         while (true) { asend(_target, _func(receive(_source))); }
  69.     }
  70. };
  71.  
  72. int main()
  73. {
  74.     setlocale(LC_ALL, "Russian");
  75.  
  76.     vector<double> X(NNN), Y(NNN), Z(NNN);
  77.  
  78.     for (int k = 0; k < X.size(); k++) //Заполнение входного вектора
  79.         X[k] = 10 * sin((double)k);
  80.  
  81.     double Tms = clock();
  82.  
  83.     for (int k = 0; k < X.size(); k++) { //Последовательные вычисления
  84.         Y[k] = Func1(X[k]); Y[k] = Func2(Y[k]);
  85.     }
  86.  
  87.     Tms = (clock() - Tms) / CLOCKS_PER_SEC;
  88.     cout << "Время последовательного алгоритма: " << Tms << " c." << endl;
  89.  
  90.     //Буферы между ступенями конвейера
  91.     unbounded_buffer<double> buf0, buf1, buf2;
  92.  
  93.     //Первая ступень конвейера
  94.     Stage_Agent Stage_Agent1(buf0, buf1, Func1);
  95.  
  96.     //Вторая ступень конвейера
  97.     Stage_Agent Stage_Agent2(buf1, buf2, Func2);
  98.  
  99.     Stage_Agent1.start(); Stage_Agent2.start();// Запуск
  100.  
  101.     Tms = clock();
  102.     for (int k = 0; k < Chunk; k++) // Параллельные вычисления
  103.         send(buf0, X[k]);
  104.  
  105.     for (int k = Chunk; k < X.size(); k++) {
  106.         Z[k - Chunk] = receive(buf2); send(buf0, X[k]);
  107.     }
  108.  
  109.     for (int k = X.size() - Chunk; k < X.size(); k++) {
  110.         Z[k] = receive(buf2);
  111.     }
  112.  
  113.     Tms = (clock() - Tms) / CLOCKS_PER_SEC;
  114.     cout << "Время параллельного алгоритма: " << Tms << " c." << endl;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement