Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <omp.h>
- #include <iostream>
- #include <ctime>
- #include <locale>
- #include <cstdlib>
- using namespace std;
- double normOfMtx(double** C, int Dimension)
- {
- double sum = 0;
- for (int i = 0; i < Dimension; i++)
- for (int j = 0; j < Dimension; j++)
- sum += C[i][j] * C[i][j];
- return sqrt(sum);
- }
- void multiplyVer1(double **A, double **B, int Dimension, int numThreads, long q)
- {
- int i, j, k;
- double** C = new double*[Dimension];
- for (i = 0; i < Dimension; i++)
- {
- C[i] = new double[Dimension];
- for (j = 0; j < Dimension; j++)
- C[i][j] = 0;
- }
- double s = 0;
- int t1 = clock();
- for (int l = 0; l < q; l++)
- {
- #pragma omp parallel for num_threads(numThreads)
- for (i = 0; i < Dimension; i++)
- {
- #pragma omp parallel for num_threads(numThreads)
- for (j = 0; j < Dimension; j++)
- {
- for (k = 0; k < Dimension; k++)
- {
- /*s += A[i][k] * B[k][j];*/
- C[i][j] += A[i][k] * B[k][j];
- }
- /*C[i][j] = s;
- s = 0;*/
- }
- }
- }
- int t2 = clock();
- /*for (i = 0; i < Dimension; i++)
- {
- for (j = 0; j < Dimension; j++)
- cout << C[i][j] << " ";
- cout << endl;
- }*/
- cout << "Total " << ((float)(t2 - t1)) / CLOCKS_PER_SEC << " sec." << endl;
- cout << "Norm is " << normOfMtx(C, Dimension) << endl;
- system("pause");
- for (int q = 0; q < Dimension; q++)
- delete[] C[q];
- }
- void multiplyVer2(double **A, double **B, int Dimension, int numThreads, long q)
- {
- int i, j, k;
- double** C = new double*[Dimension];
- for (i = 0; i < Dimension; i++)
- {
- C[i] = new double[Dimension];
- for (j = 0; j < Dimension; j++)
- C[i][j] = 0;
- }
- double s;
- int t1 = clock();
- for (int l = 0; l < q; l++)
- {
- for (i = 0; i < Dimension; i++)
- {
- #pragma omp parallel for /*shared(A, B, C)*private(j, k)*/ num_threads(numThreads)
- for (j = 0; j < Dimension; j++)
- {
- for (k = 0; k < Dimension; k++)
- {
- C[i][j] += A[i][k] * B[k][j];
- }
- }
- }
- }
- int t2 = clock();
- /*for (i = 0; i < Dimension; i++)
- {
- for (j = 0; j < Dimension; j++)
- cout << C[i][j] << " ";
- cout << endl;
- }*/
- cout << "Total " << ((float)(t2 - t1)) / CLOCKS_PER_SEC << " sec." << endl;
- cout << "Norm is " << normOfMtx(C, Dimension) << endl;
- system("pause");
- for (int q = 0; q < Dimension; q++)
- delete[] C[q];
- }
- void multiplyVer3(double **A, double **B, int Dimension, int numThreads, long q)
- {
- int i, j, k;
- double** C = new double*[Dimension];
- for (i = 0; i < Dimension; i++)
- {
- C[i] = new double[Dimension];
- for (j = 0; j < Dimension; j++)
- C[i][j] = 0;
- }
- double s;
- int t1 = clock();
- for (int l = 0; l < q; l++)
- {
- #pragma omp parallel for /*shared(A, B, C) private(j, k)*/ num_threads(numThreads)
- for (i = 0; i < Dimension; i++)
- {
- for (j = 0; j < Dimension; j++)
- {
- for (k = 0; k < Dimension; k++)
- {
- C[i][j] += A[i][k] * B[k][j];
- }
- }
- }
- }
- int t2 = clock();
- /*for (i = 0; i < Dimension; i++)
- {
- for (j = 0; j < Dimension; j++)
- cout << C[i][j] << " ";
- cout << endl;
- }*/
- cout << "Total " << ((float)(t2 - t1)) / CLOCKS_PER_SEC << " sec." << endl;
- cout << "Norm is " << normOfMtx(C, Dimension) << endl;
- system("pause");
- for (int q = 0; q < Dimension; q++)
- delete[] C[q];
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- cout << "Перемножение матриц" << endl << "Введите размерность квадратной матрицы" << endl;
- int Dimension;
- cin >> Dimension;
- cout << "Введите количество повторов для умножения" << endl;
- long q;
- cin >> q;
- srand(time(nullptr));
- long long i, j, k, l;
- double** A = new double*[Dimension];
- double** B = new double*[Dimension];
- for (i = 0; i < Dimension; i++)
- {
- A[i] = new double[Dimension];
- B[i] = new double[Dimension];
- }
- #pragma omp parallel for shared(A, B) private(i, j) num_threads(4)
- for (i = 0; i < Dimension; i++)
- {
- //cout << "[";
- for (j = 0; j < Dimension; j++)
- {
- A[i][j] = (rand() % 10 - 5) / 10.0;
- //cout << A[i][j] << " ";
- }
- //cout << "][";
- for (j = 0; j < Dimension; j++)
- {
- B[i][j] = (rand() % 10 - 5) / 10.0;
- //cout << " " << B[i][j];
- }
- //cout << "]" << endl;
- }
- //------------------------------------------—
- multiplyVer1(A, B, Dimension, 4, q);
- multiplyVer2(A, B, Dimension, 4, q);
- multiplyVer3(A, B, Dimension, 4, q);
- //------------------------------------------—
- for (int i = 0; i < Dimension; i++)
- {
- delete A[i];
- delete B[i];
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement