Advertisement
RobertDeMilo

RB5.15 Задача генерации и суммирования матрицы

Apr 17th, 2024
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdint>
  3. #include<vector>
  4. #include<future>
  5. #include "log_duration.h"
  6.  
  7. using namespace std;
  8.  
  9. template<typename C>
  10. struct Subrange
  11. {
  12.     C& collection;
  13.     size_t first_index, last_index;
  14.  
  15.     auto begin() const
  16.     {
  17.         return collection.begin() + first_index;
  18.     }
  19.     auto end() const
  20.     {
  21.         return collection.begin() + last_index;
  22.     }
  23.     size_t size() const
  24.     {
  25.         return last_index - first_index;
  26.     }
  27. };
  28.  
  29. template<typename Container>
  30. class Paginator
  31. {
  32. private:
  33.     vector<Subrange<Container>> pages;
  34.    
  35. public:
  36.     Paginator(Container& c, size_t page_size)
  37.     {
  38.         for (size_t i = 0; i < c.size(); i += page_size)
  39.         {
  40.             pages.push_back({ c,i,min(i + page_size,c.size()) });
  41.         }
  42.     }
  43.     auto begin() const
  44.     {
  45.         return pages.begin();
  46.     }
  47.     auto end() const
  48.     {
  49.         return pages.end();
  50.     }
  51.     size_t size() const
  52.     {
  53.         return pages.size();
  54.     }
  55. };
  56.  
  57. template<typename C>
  58. Paginator<C> Paginate(C& c, size_t page_size)
  59. {
  60.     return Paginator <C>(c, page_size);
  61. }
  62.  
  63. template <typename ContainerOfVectors>
  64. void GenerateSingleThread(ContainerOfVectors& result, size_t first_row, size_t column_size)
  65. {
  66.     for (auto& row : result)
  67.     {
  68.         row.reserve(column_size);
  69.         for (size_t column = 0; column < column_size; ++column)
  70.         {
  71.             row.push_back(first_row ^ column);
  72.         }
  73.         ++first_row;
  74.     }
  75. }
  76. vector<vector<int>>GenerateSingleThread(size_t size)
  77. {
  78.     vector<vector<int>> result(size);
  79.     GenerateSingleThread(result, 0, size);
  80.     return result;
  81. }
  82. //////////////////////////////////////////////////////////////////////
  83. vector<vector<int>>GenerateMultiThread(size_t size, size_t page_size)
  84. {
  85.     vector<vector<int>> result(size);
  86.     vector<future<void>> futures;
  87.     size_t first_row = 0;
  88.     for (auto page : Paginate(result, page_size))
  89.     {
  90.         futures.push_back(async([page, first_row, size]
  91.             {GenerateSingleThread(page, first_row, size); }));
  92.         first_row += page_size;
  93.     }
  94.     return result;
  95. }
  96. ///////////////////////////////////////////////////////////////////////
  97. template <typename ContainerOfVectors>
  98. int64_t SumSingleThread(const ContainerOfVectors& matrix)
  99. {
  100.     int64_t sum = 0;
  101.     for (const auto& row : matrix)
  102.     {
  103.         for (auto item : row)
  104.         {
  105.             {
  106.                 sum += item;
  107.             }
  108.         }
  109.     }
  110.     return sum;
  111. }
  112.  
  113. int main()
  114. {
  115.     LOG_DURATION("Total");
  116.     const size_t matrix_size = 7000;
  117.     vector<vector<int>> matrix;
  118.     {
  119.         LOG_DURATION("Single thread generation");
  120.         matrix = GenerateSingleThread(matrix_size);
  121.     }
  122.     {
  123.         LOG_DURATION("Multi thread generation");
  124.         matrix = GenerateMultiThread(matrix_size, 2000);
  125.     }
  126.     {
  127.         LOG_DURATION("Single thread sum");
  128.         cout << SumSingleThread(matrix) << endl;
  129.     }
  130.  
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement