Advertisement
Tvor0zhok

ParProg2 (6)

Oct 25th, 2023
542
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. // https://drive.google.com/drive/folders/1GK3t7PBsRFQp01ApEmk1wb6Scrw_CFA4?usp=sharing
  2.  
  3. #define _USE_MATH_DEFINES
  4. #include <locale.h>
  5. #include <time.h>
  6. #include <vector>
  7. #include <ppl.h>
  8. #include <concurrent_vector.h>
  9. #include <concurrent_queue.h>
  10. #include <iostream>
  11. #include <cmath>
  12. #include <queue>
  13.  
  14. #define N1 400
  15. #define N2 50
  16. #define EPS 1e-9
  17.  
  18. double fun(double x, double y)
  19. {
  20.     double ans = 0;
  21.  
  22.     for (int k = 1; k <= N2; k++)
  23.         for (int j = 1; j <= N2; j++)
  24.             ans += cos(k * x) * sin(j * y) / (1 + k * k * k + j * j * j) / sqrt(1 + k + j);
  25.  
  26.     return ans;
  27. }
  28.  
  29. struct Point
  30. {
  31.     double x, y, f;
  32.  
  33.     Point(double _x, double _y, double _f)
  34.     {
  35.         x = _x; y = _y; f = _f;
  36.     }
  37. };
  38.  
  39. int main()
  40. {
  41.     setlocale(LC_ALL, "Russian");
  42.    
  43.     std::vector<Point> Pts;
  44.  
  45.     double h = 2.0 * M_PI / N1; double Time = clock();
  46.  
  47.     for (int k = 0; k < N1; k++)
  48.         for (int j = 0; j < N1; j++) {
  49.             double x = h * k; double y = h * j; double f = fun(x, y);
  50.             if (f >= 0) Pts.push_back(Point(x, y, f));
  51.         }
  52.  
  53.     Time = (clock() - Time) / CLOCKS_PER_SEC;
  54.  
  55.     std::cout << "(Вектор, Посл. реализация) Вычисления завершены. Размер контейнера: "
  56.         << Pts.size() << std::endl << "Время: " << Time << " сек." << std::endl;
  57.  
  58.     Pts.clear();
  59.  
  60.     concurrency::concurrent_vector<Point> CPts;
  61.  
  62.     double Time1 = clock();
  63.  
  64.     concurrency::parallel_for(0, N1,
  65.         [&CPts, h](int k) {
  66.             for (int j = 0; j < N1; j++) {
  67.                 double x = h * k; double y = h * j; double f = fun(x, y);
  68.                 if (f >= 0) CPts.push_back(Point(x, y, f));
  69.             }});
  70.  
  71.     Time1 = (clock() - Time1) / CLOCKS_PER_SEC;
  72.  
  73.     std::cout << "(Вектор, Парал. реализация) Вычисления завершены. Размер контейнера: " <<
  74.         CPts.size() << std::endl
  75.         << "Время : " << Time1 << " сек." << std::endl;
  76.  
  77.     CPts.clear();
  78.  
  79.     double k = Time / Time1;
  80.  
  81.     std::cout << "Ускорение: " << k << "\n";
  82.  
  83.     std::queue<Point> Pts_queue;
  84.  
  85.     h = 2.0 * M_PI / N1;
  86.     Time = clock();
  87.  
  88.     for (int k = 0; k < N1; k++)
  89.         for (int j = 0; j < N1; j++) {
  90.             double x = h * k; double y = h * j; double f = fun(x, y);
  91.             if (f >= 0)
  92.                 Pts_queue.push(Point(x, y, f));
  93.         }
  94.  
  95.     Time = (clock() - Time) / CLOCKS_PER_SEC;
  96.  
  97.     std::cout << "(Очередь, Посл. реализация) Вычисления завершены. Размер контейнера: "
  98.         << Pts_queue.size() << std::endl << "Время : " << Time << " сек." << std::endl;
  99.  
  100.     concurrency::concurrent_queue<Point> CPts_queue;
  101.  
  102.     Time1 = clock();
  103.  
  104.     concurrency::parallel_for(0, N1,
  105.         [&CPts_queue, h](int k) {
  106.             for (int j = 0; j < N1; j++) {
  107.                 double x = h * k;
  108.                 double y = h * j;
  109.                 double f = fun(x, y);
  110.                 if (f >= 0)
  111.                     CPts_queue.push(Point(x, y, f));
  112.             }});
  113.  
  114.     Time1 = (clock() - Time1) / CLOCKS_PER_SEC;
  115.  
  116.     std::cout << "(Очерель, Парал. реализация) Вычисления завершены. Размер контейнера: " <<
  117.         CPts_queue.unsafe_size() << std::endl << "Время : " << Time1 << " сек." << std::endl;
  118.  
  119.     k = Time / Time1;
  120.  
  121.     std::cout << "Ускорение: " << k << "\n";
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement