Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.42 KB | None | 0 0
  1. #include <random>
  2. #include <chrono>
  3. #include <iostream>
  4. #include <vector>
  5. #include <functional>
  6. #include <numeric>
  7. #include <intrin.h>
  8. #include <omp.h>
  9. #include <iomanip>
  10. using namespace std;
  11. void printMatrix(int n, double* m);
  12.  
  13. void luDecomposition(int n, double* mat)
  14. {
  15. double **lower = 0;
  16. double **upper = 0;
  17. lower = upper = new double *[n];
  18. for (int i = 0; i < n; i++)
  19. {
  20. lower[i] = new double[n];
  21. upper[i] = new double[n];
  22. }
  23. //double[n][n], upper[n][n];
  24. //memset(lower, 0, sizeof(lower));
  25. //memset(upper, 0, sizeof(upper));
  26. for (int i = 0; i < n; i++) {
  27.  
  28. for (int k = i; k < n; k++) {
  29.  
  30. double sum = 0;
  31. for (int j = 0; j < i; j++)
  32. sum += (lower[i][j] * upper[j][k]);
  33.  
  34. upper[i][k] = mat[(n*i) + k] - sum;
  35. }
  36.  
  37. for (int k = i; k < n; k++) {
  38. if (i == k)
  39. lower[i][i] = 1;
  40. else {
  41.  
  42. double sum = 0;
  43. for (int j = 0; j < i; j++)
  44. sum += (lower[k][j] * upper[j][i]);
  45.  
  46. lower[k][i] = (mat[(n*k) + i] - sum) / upper[i][i];
  47. }
  48. }
  49. }
  50.  
  51. cout << setw(6) << "Lower Triangular" << endl << endl;
  52.  
  53.  
  54. for (int i = 0; i < n; i++) {
  55. for (int j = 0; j < n; j++)
  56. {
  57. cout << lower[i][j] << setw(6) << " ";
  58. }
  59. cout << endl;
  60. }
  61. cout << endl << endl;
  62. cout << setw(6) << "upper Triangular" << endl << endl;
  63. for (int i = 0; i < n; i++) {
  64. for (int j = 0; j < n; j++)
  65. {
  66. cout << upper[i][j] << setw(6) << " ";
  67. }
  68. cout << endl;
  69. }
  70. cout << endl << endl;
  71.  
  72. }
  73.  
  74. void lup_od_omp(double* a, int n) {
  75.  
  76. int i, j, k;
  77.  
  78. for (k = 0; k < n - 1; ++k)
  79. {
  80. #pragma omp parallel for shared(a,n,k) private(i) schedule(static, 64)
  81. for (i = k + 1; i < n; i++)
  82. {
  83. a[i*n + k] /= a[k*n + k];
  84. for (j = k + 1; j < n; j++)
  85. {
  86. a[i*n + j] -= a[i*n + k] * a[k*n + j];
  87. }
  88. }
  89. }
  90. }
  91.  
  92.  
  93. void printMatrix(int n, double* m)
  94. {
  95. for (size_t i = 0; i < n; ++i)
  96. {
  97. for (size_t j = 0; j < n; ++j)
  98. {
  99. cout.precision(4);
  100. std::cout << setw(6) << m[(n * i) + j] << setw(8) << " ";
  101. }
  102. std::cout << std::endl;
  103. }
  104. cout << endl;
  105. }
  106.  
  107. int main()
  108. {
  109. size_t runCount = 1000;
  110. std::vector<std::vector<long long>> result;
  111. result.emplace_back();
  112. result.emplace_back();
  113. result.emplace_back();
  114.  
  115. size_t n = 10;
  116.  
  117. double *m1 = nullptr;
  118. double *temp1 = nullptr;
  119. double *temp2 = nullptr;
  120.  
  121.  
  122. try
  123. {
  124. m1 = new double[n * n];
  125. temp1 = new double[n * n];
  126. temp2 = new double[n * n];
  127. }
  128. catch (std::bad_alloc& e)
  129. {
  130. std::cout << "Need more memory" << std::endl;
  131. delete[] m1;
  132. delete[] temp1;
  133. delete[] temp2;
  134. return 1;
  135. }
  136.  
  137. for (size_t currentRun = 0; currentRun < runCount; ++currentRun)
  138. {
  139. std::cout << "current run: " << currentRun << std::endl;
  140. std::random_device rd;
  141.  
  142. for (size_t i = 0; i < n * n; ++i)
  143. {
  144. m1[i] = static_cast<double>(rd()) / static_cast<double>(rd());
  145. }
  146. std::cout << endl << "Matrix:\r\n";
  147. printMatrix(n, m1);
  148.  
  149. std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
  150. luDecomposition(n, m1);
  151. std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
  152.  
  153. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
  154.  
  155. result[0].push_back(duration);
  156. std::cout << "Seq duration: " << duration << std::endl;
  157.  
  158. for (size_t i = 0; i < n * n; ++i)
  159. {
  160. temp1[i] = 0;
  161. temp2[i] = 0;
  162. }
  163.  
  164. t1 = std::chrono::high_resolution_clock::now();
  165. lup_od_omp(m1, n);
  166. t2 = std::chrono::high_resolution_clock::now();
  167.  
  168. duration = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
  169.  
  170. result[1].push_back(duration);
  171.  
  172. //for (size_t i = 0; i < n * n; ++i)
  173. //{
  174. //[i] = 0;
  175. //}
  176.  
  177. //t1 = std::chrono::high_resolution_clock::now();
  178. //sumOpenMP(n * n, m1, m2, res);
  179. //t2 = std::chrono::high_resolution_clock::now();
  180.  
  181. duration = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
  182.  
  183. result[2].push_back(duration);
  184. std::cout << "Vec duration: " << duration << std::endl;
  185. }
  186.  
  187. for (size_t i = 0; i < result.size(); ++i)
  188. {
  189. auto r = std::accumulate(result[i].begin(), result[i].end(), 0);
  190. std::cout << static_cast<double>(r) / static_cast<double>(result[i].size()) << std::endl;
  191. }
  192.  
  193. //sumOpenMP(n * n, m1, m2, res);
  194.  
  195. //std::cout << "m1:\r\n";
  196. //printMatrix(n, m1);
  197.  
  198. //std::cout << "m2:\r\n";
  199. //printMatrix(n, m2);
  200.  
  201.  
  202. delete[] m1;
  203. delete[] temp1;
  204. delete[] temp2;
  205.  
  206.  
  207. std::cin >> n;
  208.  
  209. return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement