Advertisement
Guest User

Untitled

a guest
Dec 11th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. // ConsoleApplication6.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "iostream"
  6. #include "cmath"
  7. #include "ctime"
  8. #include "omp.h"
  9. using namespace std;
  10.  
  11. const double EPS = 1E-9;
  12.  
  13. double FindDeterminant(double **a, int n)
  14. {
  15. double det = 1.0;
  16.  
  17. for (int i = 0; i < n; ++i)
  18. {
  19. int k = i;
  20. for (int j = i + 1; j<n; ++j)
  21. {
  22. if (abs(a[j][i]) > abs(a[k][i]))
  23. k = j;
  24. }
  25. if (abs(a[k][i]) < EPS)
  26. {
  27. det = 0.0;
  28. break;
  29. }
  30. swap(a[i], a[k]);
  31. if (i != k)
  32. det = (-1) * det;
  33. det *= a[i][i];
  34. for (int j = i + 1; j < n; ++j)
  35. {
  36. a[i][j] /= a[i][i];
  37. }
  38. for (int j = 0; j<n; ++j)
  39. {
  40. if (j != i && abs(a[j][i]) > EPS)
  41. {
  42. for (int k = i + 1; k < n; ++k)
  43. {
  44. a[j][k] -= a[i][k] * a[j][i];
  45. }
  46. }
  47. }
  48. }
  49. return det;
  50. }
  51.  
  52. double parallelFindDeterminant(double **a, int n, int threads)
  53. {
  54. double det = 1.0;
  55.  
  56. for (int i = 0; i < n; ++i)
  57. {
  58. int k = i;
  59. for (int j = i + 1; j<n; ++j)
  60. {
  61. if (abs(a[j][i]) > abs(a[k][i]))
  62. k = j;
  63. }
  64. if (abs(a[k][i]) < EPS)
  65. {
  66. det = 0.0;
  67. break;
  68. }
  69. swap(a[i], a[k]);
  70. if (i != k)
  71. det = (-1) * det;
  72. det *= a[i][i];
  73. for (int j = i + 1; j < n; ++j)
  74. {
  75. a[i][j] /= a[i][i];
  76. }
  77. omp_set_num_threads(threads);
  78. #pragma omp parallel for
  79. for (int j = 0; j<n; ++j)
  80. {
  81. if (j != i && abs(a[j][i]) > EPS)
  82. {
  83. for (int k = i + 1; k < n; ++k)
  84. {
  85. a[j][k] -= a[i][k] * a[j][i];
  86. }
  87. }
  88. }
  89. }
  90. return det;
  91. }
  92.  
  93. int main()
  94. {
  95. setlocale(LC_ALL, "Rus");
  96. int n, threads;
  97. double **a;
  98. cout << "Введите размер матрицы - ";
  99. cin >> n;
  100. cout << "Введиnt количество потоков - ";
  101. cin >> threads;
  102. srand(time(NULL));
  103. a = new double*[n];
  104. for (int i = 0; i < n; i++)
  105. {
  106. a[i] = new double[n];
  107. }
  108. for (int i = 0; i < n; i++)
  109. {
  110. for (int j = 0; j < n; j++)
  111. {
  112. a[i][j] = (double)(rand() % 10);
  113. }
  114. }
  115. cout << "Введенная матрица" << endl << endl;
  116. /*for (int i = 0; i < n; i++)
  117. {
  118. for (int j = 0; j < n; j++)
  119. {
  120. cout << a[i][j] << " ";
  121. }
  122. cout << endl;
  123. }*/
  124.  
  125.  
  126.  
  127. clock_t startTime1 = clock(); //начало выполнения основной функции
  128. double det = FindDeterminant(a, n); //нахождение определителя матрицы
  129. clock_t finishTime1 = clock(); //конец выполнения основной функции
  130. clock_t searchTime1 = (double)(finishTime1 - startTime1); //вычисление разницы от начала до конца выполнения функции
  131.  
  132. clock_t startTime2 = clock(); //начало выполнения основной функции
  133. det = parallelFindDeterminant(a, n, threads); //нахождение определителя матрицы
  134. clock_t finishTime2 = clock(); //конец выполнения основной функции
  135. clock_t searchTime2 = (double)(finishTime2 - startTime2); //вычисление разницы от начала до конца выполнения функции
  136. double time1 = searchTime1;
  137. double time2 = searchTime2;
  138.  
  139. cout << "Время работы последовательного кода - " << time1 << endl;
  140. cout << "Время работы параллельного кода - " << time2 << endl;
  141.  
  142. cout << "Определитель - " << det << endl;
  143.  
  144. system("pause");
  145. return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement