Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <chrono>
  5. #include <omp.h>
  6.  
  7. using namespace std;
  8.  
  9.  
  10. int** A, ** B, ** C, m, n, p, o, i, j, k, s;
  11. static int kol1A, kol2A, kol1B, kol2B;
  12. //pobierac wymiary macierzy a nie gotowa macierz podawać
  13. void ladowanie()
  14. {
  15. #pragma omp parallel sections
  16.     {
  17. #pragma omp section
  18.         {
  19.             fstream plikA;
  20.             plikA.open("macierzA.txt", ios::in);
  21.             plikA >> kol1A >> kol2A;
  22.             m = kol1A;
  23.             n = kol2A;
  24.             A = new int* [m];
  25.             for (i = 0; i < n; i++) A[i] = new int[n];
  26.  
  27.             for (i = 0; i < m; i++)
  28.                 for (j = 0; j < n; j++) plikA >> A[i][j];
  29.             plikA.close();
  30.         }
  31.  
  32. #pragma omp section
  33.         {
  34.             fstream plikB;
  35.             plikB.open("macierzB.txt", ios::in);
  36.             plikB >> kol1B >> kol2B;
  37.             p = kol2B;
  38.             o = kol1B;
  39.             B = new int* [o];
  40.             for (i = 0; i < p; i++) B[i] = new int[p];
  41.  
  42.             for (i = 0; i < n; i++)
  43.                 for (j = 0; j < p; j++) plikB >> B[i][j];
  44.             plikB.close();
  45.         }
  46.     }
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.     // tworzenie macierzy
  56.  
  57.     //A = new int* [m];
  58.     //B = new int* [n];
  59.     C = new int* [m];
  60.     if (m == p)
  61.     {
  62.         for (i = 0; i < m; i++)
  63.         {
  64.             //A[i] = new int[n];
  65.             C[i] = new int[p];
  66.  
  67.         }
  68.     }
  69.     else
  70.         {
  71.             cout << endl << "Liczba kolumn macierzy 1 nie zgadza sie z liczba wierszy macierzy 2" << endl;
  72.         }
  73.  
  74.    
  75.  
  76.         //char tab[1][2];
  77.         //pobiera wartości macierzy A i B z plików .txt
  78.  
  79.  
  80.         //for (i = 0; i < n; i++) B[i] = new int[p];
  81.  
  82.         // odczytujemy dane dla macierzy A
  83.  
  84.  
  85.  
  86.  
  87.         // odczytujemy dane dla macierzy B
  88.  
  89.  
  90.  
  91.  
  92.    
  93. }
  94.  
  95.  
  96. // dodac czas, przed i za parallel
  97. int main()
  98. {
  99.  
  100.     // mnożymy macierz A przez B
  101.     cout << "Macierz C =" << endl;
  102.     auto poczatek = chrono::high_resolution_clock::now();
  103.     for (i = 0; i < m; i++)
  104.         for (j = 0; j < p; j++)
  105.         {
  106.             s = 0;
  107.             for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
  108.             C[i][j] = s;
  109.         }
  110.     auto koniec = chrono::high_resolution_clock::now();
  111.     chrono::duration<double> elapsed = koniec - poczatek;
  112.     cout << "czas wykonania bez pragmy: " << elapsed.count() << "s\n";
  113.  
  114.  
  115.  
  116.     double start, stop;
  117.     start = omp_get_wtime();
  118. #pragma omp parallel for schedule (dynamic, 200) shared(A, C, B) private(i, j, k)
  119.     for (i = 0; i < m; i++)
  120.         for (j = 0; j < p; j++)
  121.         {
  122.             s = 0;
  123.             for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
  124.             C[i][j] = s;
  125.         }
  126.  
  127.     stop = omp_get_wtime();
  128.  
  129.     cout << "pragma 1wszy for\n";
  130.     cout << ("%.3f\n", stop - start) << endl;
  131.  
  132.  
  133.  
  134.  
  135.     start = omp_get_wtime();
  136.  
  137.     for (i = 0; i < m; i++)
  138. #pragma omp parallel for shared(A, C, B, i) private(j, k)
  139.         for (j = 0; j < p; j++)
  140.         {
  141.             s = 0;
  142.             for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
  143.             C[i][j] = s;
  144.         }
  145.  
  146.     stop = omp_get_wtime();
  147.  
  148.     cout << "pragma 2gi for\n";
  149.     cout << ("%.3f\n", stop - start) << endl;
  150.  
  151.  
  152.  
  153.     start = omp_get_wtime();
  154.  
  155.     for (i = 0; i < m; i++)
  156.         for (j = 0; j < p; j++)
  157.         {
  158.             s = 0;
  159. #pragma omp parallel for shared(A, C, B, i,j) private(k)
  160.             for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
  161.             C[i][j] = s;
  162.         }
  163.  
  164.     stop = omp_get_wtime();
  165.     cout << "pragma 3ci for\n";
  166.     cout << ("%.3f\n", stop - start) << endl;
  167.  
  168.  
  169.     // zapis wyniku macierzy C
  170.  
  171.     for (i = 0; i < m; i++)
  172.     {
  173.         for (j = 0; j < p; j++)
  174.         {
  175.  
  176.             plikC << setw(6) << C[i][j];
  177.         }
  178.  
  179.     }
  180.  
  181.     // zwolnienie pamięci
  182.  
  183.     for (i = 0; i < m; i++)
  184.     {
  185.         delete[] A[i];
  186.         delete[] B[i];
  187.         delete[] C[i];
  188.     }
  189.  
  190.     for (i = 0; i < n; i++)
  191.         delete[] A;
  192.     delete[] B;
  193.     delete[] C;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement