Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <ctime>
  4. #include <thread>
  5. #include <algorithm>
  6. #include <Windows.h>
  7.  
  8. struct SLAU
  9. {
  10. public:
  11. SLAU(int n) : Size(n) //конструктор. Задает СЛАУ
  12. {
  13. System.resize(Size);
  14. for (auto &i : System)
  15. {
  16. i.resize(Size);
  17. for (auto &j : i)
  18. {
  19. j = rand() % 10;
  20. }
  21. }
  22. }
  23.  
  24. void show_system() // Вывод исходной СЛАУ
  25. {
  26. for (const auto &i : System)
  27. {
  28. for (const auto &j : i)
  29. {
  30. std::cout << j << " ";
  31. }
  32. std::cout << std::endl;
  33. }
  34. }
  35.  
  36. void show_div() //Вывод разбиения
  37. {
  38. for (const auto i : Div)
  39. {
  40. for (const auto j : i)
  41. {
  42. std::for_each(j.begin(), j.end(), [](int x){std::cout << x << " "; });
  43. std::cout << std::endl;
  44. }
  45. std::cout << std::endl << std::endl;
  46. }
  47. }
  48.  
  49. void set_div() //Разбиваем систему на блоки по кол-ву потоков
  50. {
  51. int k = 0;
  52. int count = threads;
  53. Div.resize(threads);
  54. for (auto &i : Div)
  55. {
  56. if (Size != 0)
  57. {
  58. i.resize(Size / count);
  59. Size -= (Size / count);
  60. count--;
  61. }
  62. else break;
  63. for (auto &j : i)
  64. {
  65. j.resize(System.size());
  66. std::copy(System[k].begin(), System[k].end(), j.begin());
  67. k++;
  68. }
  69. }
  70. }
  71.  
  72. std::vector<std::vector<int>> get_vector(int i)
  73. {
  74. return Div[i];
  75. }
  76.  
  77. int get_size()
  78. {
  79. return Size;
  80. }
  81.  
  82. int get_threads()
  83. {
  84. return threads;
  85. }
  86.  
  87. private:
  88. int threads = 2;//std::thread::hardware_concurrency();
  89. int Size;
  90. std::vector<std::vector <int>> System;
  91. std::vector<std::vector<std::vector <int>>> Div;
  92. };
  93.  
  94. struct ved_str
  95. {
  96. //int number;
  97. std::vector<int> mas;
  98. };
  99.  
  100. void main_string(std::vector<std::vector <int>> &vec, ved_str *str, int j, int eq_num) //поиск локальной ведущей строки
  101. {
  102. int max_value = -1;
  103. int number = 0;
  104. for (int i = 0; i < vec.size(); i++)
  105. {
  106. if (j > eq_num)
  107. {
  108. eq_num++;
  109. continue;
  110. }
  111. else if (vec[i][j] > max_value)
  112. {
  113. max_value = vec[i][j];
  114. number = i;
  115. }
  116. }
  117. str->mas.push_back(max_value);
  118. }
  119.  
  120. int main()
  121. {
  122. double Time = 0;
  123. int size = 100;
  124.  
  125. srand(time(NULL));
  126. SLAU s1(size);
  127. std::vector<std::thread> thrds;
  128. s1.set_div();
  129. ved_str Main_str;
  130. //ПОТОКИ
  131. for (int j = 0; j < 10; j++) //
  132. {
  133. double start = clock();
  134. for (int i = 0; i < size; i++)
  135. {
  136.  
  137. std::thread a(main_string, s1.get_vector(0), &Main_str, i, 0);
  138. std::thread b(main_string, s1.get_vector(1), &Main_str, i, 150);
  139. //std::thread c(main_string, s1.get_vector(2), &Main_str, i, 150);
  140. //std::thread d(main_string, s1.get_vector(3), &Main_str, i, 225);
  141.  
  142. a.join();
  143. b.join();
  144. //c.join();
  145. //d.join();
  146.  
  147. Main_str.mas.clear();
  148.  
  149. }
  150. double end = clock();
  151. Time += (end - start) / 1000;
  152. std::cout << (end - start) / 1000 << std::endl;
  153. }
  154.  
  155. system("pause");
  156. return 0;
  157. }
  158.  
  159. int main()
  160. {
  161. double Time = 0;
  162. int size = 100;
  163.  
  164. srand(time(NULL));
  165. SLAU s1(size);
  166. std::vector<std::thread> thrds;
  167. s1.set_div();
  168. ved_str Main_str;
  169. //ПОТОКИ
  170. double start = clock();
  171. for (int i = 0; i < size; i++)
  172. {
  173. int equation_number = 0;
  174. for (int j = 0; j < s1.get_threads(); j++)
  175. {
  176. thrds.push_back(std::thread(&main_string, s1.get_vector(j), &Main_str, i, equation_number));
  177. equation_number += s1.get_vector(j).size();
  178. }
  179. for (auto &j : thrds)
  180. {
  181. if (j.std::thread::joinable()) j.join();
  182. }
  183. int st = *std::max_element(Main_str.mas.begin(), Main_str.mas.end());
  184. thrds.clear();
  185. Main_str.mas.clear();
  186. }
  187. double end = clock();
  188. Time += (end - start) / 1000;
  189. std::cout << (end - start) / 1000 << std::endl;
  190. system("pause");
  191. return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement