Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication6.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include "iostream"
- #include "cmath"
- #include "ctime"
- #include "omp.h"
- using namespace std;
- const double EPS = 1E-9;
- double FindDeterminant(double **a, int n)
- {
- double det = 1.0;
- for (int i = 0; i < n; ++i)
- {
- int k = i;
- for (int j = i + 1; j<n; ++j)
- {
- if (abs(a[j][i]) > abs(a[k][i]))
- k = j;
- }
- if (abs(a[k][i]) < EPS)
- {
- det = 0.0;
- break;
- }
- swap(a[i], a[k]);
- if (i != k)
- det = (-1) * det;
- det *= a[i][i];
- for (int j = i + 1; j < n; ++j)
- {
- a[i][j] /= a[i][i];
- }
- for (int j = 0; j<n; ++j)
- {
- if (j != i && abs(a[j][i]) > EPS)
- {
- for (int k = i + 1; k < n; ++k)
- {
- a[j][k] -= a[i][k] * a[j][i];
- }
- }
- }
- }
- return det;
- }
- double parallelFindDeterminant(double **a, int n, int threads)
- {
- double det = 1.0;
- for (int i = 0; i < n; ++i)
- {
- int k = i;
- for (int j = i + 1; j<n; ++j)
- {
- if (abs(a[j][i]) > abs(a[k][i]))
- k = j;
- }
- if (abs(a[k][i]) < EPS)
- {
- det = 0.0;
- break;
- }
- swap(a[i], a[k]);
- if (i != k)
- det = (-1) * det;
- det *= a[i][i];
- for (int j = i + 1; j < n; ++j)
- {
- a[i][j] /= a[i][i];
- }
- omp_set_num_threads(threads);
- #pragma omp parallel for
- for (int j = 0; j<n; ++j)
- {
- if (j != i && abs(a[j][i]) > EPS)
- {
- for (int k = i + 1; k < n; ++k)
- {
- a[j][k] -= a[i][k] * a[j][i];
- }
- }
- }
- }
- return det;
- }
- int main()
- {
- setlocale(LC_ALL, "Rus");
- int n, threads;
- double **a;
- cout << "Введите размер матрицы - ";
- cin >> n;
- cout << "Введиnt количество потоков - ";
- cin >> threads;
- srand(time(NULL));
- a = new double*[n];
- for (int i = 0; i < n; i++)
- {
- a[i] = new double[n];
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- a[i][j] = (double)(rand() % 10);
- }
- }
- cout << "Введенная матрица" << endl << endl;
- /*for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- cout << a[i][j] << " ";
- }
- cout << endl;
- }*/
- clock_t startTime1 = clock(); //начало выполнения основной функции
- double det = FindDeterminant(a, n); //нахождение определителя матрицы
- clock_t finishTime1 = clock(); //конец выполнения основной функции
- clock_t searchTime1 = (double)(finishTime1 - startTime1); //вычисление разницы от начала до конца выполнения функции
- clock_t startTime2 = clock(); //начало выполнения основной функции
- det = parallelFindDeterminant(a, n, threads); //нахождение определителя матрицы
- clock_t finishTime2 = clock(); //конец выполнения основной функции
- clock_t searchTime2 = (double)(finishTime2 - startTime2); //вычисление разницы от начала до конца выполнения функции
- double time1 = searchTime1;
- double time2 = searchTime2;
- cout << "Время работы последовательного кода - " << time1 << endl;
- cout << "Время работы параллельного кода - " << time2 << endl;
- cout << "Определитель - " << det << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement