Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <fstream>
- #include <chrono>
- #include <omp.h>
- using namespace std;
- int** A, ** B, ** C, m, n, p, o, i, j, k, s;
- static int kol1A, kol2A, kol1B, kol2B;
- //pobierac wymiary macierzy a nie gotowa macierz podawać
- void ladowanie()
- {
- #pragma omp parallel sections
- {
- #pragma omp section
- {
- fstream plikA;
- plikA.open("macierzA.txt", ios::in);
- plikA >> kol1A >> kol2A;
- m = kol1A;
- n = kol2A;
- A = new int* [m];
- for (i = 0; i < n; i++) A[i] = new int[n];
- for (i = 0; i < m; i++)
- for (j = 0; j < n; j++) plikA >> A[i][j];
- plikA.close();
- }
- #pragma omp section
- {
- fstream plikB;
- plikB.open("macierzB.txt", ios::in);
- plikB >> kol1B >> kol2B;
- p = kol2B;
- o = kol1B;
- B = new int* [o];
- for (i = 0; i < p; i++) B[i] = new int[p];
- for (i = 0; i < n; i++)
- for (j = 0; j < p; j++) plikB >> B[i][j];
- plikB.close();
- }
- }
- // tworzenie macierzy
- //A = new int* [m];
- //B = new int* [n];
- C = new int* [m];
- if (m == p)
- {
- for (i = 0; i < m; i++)
- {
- //A[i] = new int[n];
- C[i] = new int[p];
- }
- }
- else
- {
- cout << endl << "Liczba kolumn macierzy 1 nie zgadza sie z liczba wierszy macierzy 2" << endl;
- }
- //char tab[1][2];
- //pobiera wartości macierzy A i B z plików .txt
- //for (i = 0; i < n; i++) B[i] = new int[p];
- // odczytujemy dane dla macierzy A
- // odczytujemy dane dla macierzy B
- }
- // dodac czas, przed i za parallel
- int main()
- {
- // mnożymy macierz A przez B
- cout << "Macierz C =" << endl;
- auto poczatek = chrono::high_resolution_clock::now();
- for (i = 0; i < m; i++)
- for (j = 0; j < p; j++)
- {
- s = 0;
- for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
- C[i][j] = s;
- }
- auto koniec = chrono::high_resolution_clock::now();
- chrono::duration<double> elapsed = koniec - poczatek;
- cout << "czas wykonania bez pragmy: " << elapsed.count() << "s\n";
- double start, stop;
- start = omp_get_wtime();
- #pragma omp parallel for schedule (dynamic, 200) shared(A, C, B) private(i, j, k)
- for (i = 0; i < m; i++)
- for (j = 0; j < p; j++)
- {
- s = 0;
- for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
- C[i][j] = s;
- }
- stop = omp_get_wtime();
- cout << "pragma 1wszy for\n";
- cout << ("%.3f\n", stop - start) << endl;
- start = omp_get_wtime();
- for (i = 0; i < m; i++)
- #pragma omp parallel for shared(A, C, B, i) private(j, k)
- for (j = 0; j < p; j++)
- {
- s = 0;
- for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
- C[i][j] = s;
- }
- stop = omp_get_wtime();
- cout << "pragma 2gi for\n";
- cout << ("%.3f\n", stop - start) << endl;
- start = omp_get_wtime();
- for (i = 0; i < m; i++)
- for (j = 0; j < p; j++)
- {
- s = 0;
- #pragma omp parallel for shared(A, C, B, i,j) private(k)
- for (k = 0; k < n; k++) s += A[i][k] * B[k][j];
- C[i][j] = s;
- }
- stop = omp_get_wtime();
- cout << "pragma 3ci for\n";
- cout << ("%.3f\n", stop - start) << endl;
- // zapis wyniku macierzy C
- for (i = 0; i < m; i++)
- {
- for (j = 0; j < p; j++)
- {
- plikC << setw(6) << C[i][j];
- }
- }
- // zwolnienie pamięci
- for (i = 0; i < m; i++)
- {
- delete[] A[i];
- delete[] B[i];
- delete[] C[i];
- }
- for (i = 0; i < n; i++)
- delete[] A;
- delete[] B;
- delete[] C;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement