Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include <omp.h>
  2. #include <iostream>
  3. #include <ctime>
  4. #include <locale>
  5. #include <cstdlib>
  6. using namespace std;
  7.  
  8. double normOfMtx(double** C, int Dimension)
  9. {
  10.     double sum = 0;
  11.     for (int i = 0; i < Dimension; i++)
  12.         for (int j = 0; j < Dimension; j++)
  13.             sum += C[i][j] * C[i][j];
  14.     return sqrt(sum);
  15. }
  16.  
  17. void multiplyVer1(double **A, double **B, int Dimension, int numThreads, long q)
  18. {
  19.     int i, j, k;
  20.     double** C = new double*[Dimension];
  21.     for (i = 0; i < Dimension; i++)
  22.     {
  23.         C[i] = new double[Dimension];
  24.         for (j = 0; j < Dimension; j++)
  25.             C[i][j] = 0;
  26.     }
  27.     double s = 0;
  28.     int t1 = clock();
  29.  
  30. for (int l = 0; l < q; l++)
  31. {
  32. #pragma omp parallel for num_threads(numThreads)
  33.         for (i = 0; i < Dimension; i++)
  34.         {
  35.             #pragma omp parallel for num_threads(numThreads)
  36.             for (j = 0; j < Dimension; j++)
  37.             {
  38.                 for (k = 0; k < Dimension; k++)
  39.                 {
  40.                     /*s += A[i][k] * B[k][j];*/
  41.                     C[i][j] += A[i][k] * B[k][j];
  42.                 }
  43.                 /*C[i][j] = s;
  44.                 s = 0;*/
  45.             }
  46.         }
  47. }
  48.     int t2 = clock();
  49.     /*for (i = 0; i < Dimension; i++)
  50.     {
  51.         for (j = 0; j < Dimension; j++)
  52.             cout << C[i][j] << " ";
  53.         cout << endl;
  54.     }*/
  55.     cout << "Total " << ((float)(t2 - t1)) / CLOCKS_PER_SEC << " sec." << endl;
  56.     cout << "Norm is " << normOfMtx(C, Dimension) << endl;
  57.     system("pause");
  58.     for (int q = 0; q < Dimension; q++)
  59.         delete[] C[q];
  60. }
  61.  
  62. void multiplyVer2(double **A, double **B, int Dimension, int numThreads, long q)
  63. {
  64.     int i, j, k;
  65.     double** C = new double*[Dimension];
  66.     for (i = 0; i < Dimension; i++)
  67.     {
  68.         C[i] = new double[Dimension];
  69.         for (j = 0; j < Dimension; j++)
  70.             C[i][j] = 0;
  71.     }
  72.     double s;
  73.     int t1 = clock();
  74. for (int l = 0; l < q; l++)
  75. {
  76.     for (i = 0; i < Dimension; i++)
  77.     {
  78. #pragma omp parallel for /*shared(A, B, C)*private(j, k)*/ num_threads(numThreads)
  79.         for (j = 0; j < Dimension; j++)
  80.         {
  81.             for (k = 0; k < Dimension; k++)
  82.             {
  83.                 C[i][j] += A[i][k] * B[k][j];
  84.             }
  85.         }
  86.     }
  87. }
  88.     int t2 = clock();
  89.     /*for (i = 0; i < Dimension; i++)
  90.     {
  91.         for (j = 0; j < Dimension; j++)
  92.             cout << C[i][j] << " ";
  93.         cout << endl;
  94.     }*/
  95.     cout << "Total " << ((float)(t2 - t1)) / CLOCKS_PER_SEC << " sec." << endl;
  96.     cout << "Norm is " << normOfMtx(C, Dimension) << endl;
  97.     system("pause");
  98.     for (int q = 0; q < Dimension; q++)
  99.         delete[] C[q];
  100. }
  101.  
  102. void multiplyVer3(double **A, double **B, int Dimension, int numThreads, long q)
  103. {
  104.     int i, j, k;
  105.     double** C = new double*[Dimension];
  106.     for (i = 0; i < Dimension; i++)
  107.     {
  108.         C[i] = new double[Dimension];
  109.         for (j = 0; j < Dimension; j++)
  110.             C[i][j] = 0;
  111.     }
  112.     double s;
  113.     int t1 = clock();
  114. for (int l = 0; l < q; l++)
  115. {
  116. #pragma omp parallel for /*shared(A, B, C) private(j, k)*/ num_threads(numThreads)
  117.     for (i = 0; i < Dimension; i++)
  118.     {
  119.         for (j = 0; j < Dimension; j++)
  120.         {
  121.             for (k = 0; k < Dimension; k++)
  122.             {
  123.                 C[i][j] += A[i][k] * B[k][j];
  124.             }
  125.         }
  126.     }
  127. }
  128.     int t2 = clock();
  129.     /*for (i = 0; i < Dimension; i++)
  130.     {
  131.         for (j = 0; j < Dimension; j++)
  132.             cout << C[i][j] << " ";
  133.         cout << endl;
  134.     }*/
  135.     cout << "Total " << ((float)(t2 - t1)) / CLOCKS_PER_SEC << " sec." << endl;
  136.     cout << "Norm is " << normOfMtx(C, Dimension) << endl;
  137.     system("pause");
  138.     for (int q = 0; q < Dimension; q++)
  139.         delete[] C[q];
  140. }
  141.  
  142. int main()
  143. {
  144.     setlocale(LC_ALL, "Russian");
  145.     cout << "Перемножение матриц" << endl << "Введите размерность квадратной матрицы" << endl;
  146.     int Dimension;
  147.     cin >> Dimension;
  148.     cout << "Введите количество повторов для умножения" << endl;
  149.     long q;
  150.     cin >> q;
  151.     srand(time(nullptr));
  152.  
  153.     long long i, j, k, l;
  154.     double** A = new double*[Dimension];
  155.     double** B = new double*[Dimension];
  156.     for (i = 0; i < Dimension; i++)
  157.     {
  158.         A[i] = new double[Dimension];
  159.         B[i] = new double[Dimension];
  160.     }
  161.  
  162. #pragma omp parallel for shared(A, B) private(i, j) num_threads(4)
  163.     for (i = 0; i < Dimension; i++)
  164.     {
  165.         //cout << "[";
  166.         for (j = 0; j < Dimension; j++)
  167.         {
  168.             A[i][j] = (rand() % 10 - 5) / 10.0;
  169.             //cout << A[i][j] << " ";
  170.         }
  171.         //cout << "][";
  172.         for (j = 0; j < Dimension; j++)
  173.         {
  174.             B[i][j] = (rand() % 10 - 5) / 10.0;
  175.             //cout << " " << B[i][j];
  176.         }
  177.         //cout << "]" << endl;
  178.     }
  179.  
  180.     //------------------------------------------—
  181.     multiplyVer1(A, B, Dimension, 4, q);
  182.     multiplyVer2(A, B, Dimension, 4, q);
  183.     multiplyVer3(A, B, Dimension, 4, q);
  184.     //------------------------------------------—
  185.     for (int i = 0; i < Dimension; i++)
  186.     {
  187.         delete A[i];
  188.         delete B[i];
  189.     }
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement