- #include <iostream>
- #include <vector>
- #include <thread>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- using namespace std::chrono;
- #define SIZE 2000 //1000 i 2000
- #define LICZBA_WATKOW 4 //1, 2 i 4
- int A[SIZE][SIZE];
- int B[SIZE][SIZE];
- int Bt[SIZE][SIZE];
- int C[SIZE][SIZE];
- void wyzeruj()
- {
- for (int i = 0; i < SIZE; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- C[i][j] = 0;
- }
- }
- }
- void losowe_wartosci()
- {
- srand(10);
- for (int i = 0; i < SIZE; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- A[i][j] = rand() % 10;
- B[i][j] = rand() % 10;
- }
- }
- }
- void transponowanie()
- {
- for (int i = 0; i < SIZE; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- Bt[i][j] = B[j][i];
- }
- }
- }
- void pomnoz_macierze(int start, int stop)
- {
- for (int i = start; i < stop; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- for (int k = 0; k < SIZE; k++)
- {
- C[i][j] += A[i][k] * B[k][j];
- }
- }
- }
- }
- void pomnoz_macierze_transpon(int start, int stop)
- {
- for (int i = start; i < stop; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- for (int k = 0; k < SIZE; k++)
- {
- C[i][j] += A[i][k] * Bt[j][k]; //[j][k] bo transponowane
- }
- }
- }
- }
- void sekwencyjnie()
- {
- duration<double> elapsed_seconds;
- time_point<system_clock> begin = system_clock::now();
- pomnoz_macierze(0,SIZE);
- elapsed_seconds = system_clock::now() - begin;
- cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
- }
- void sekwencyjnie_transpon()
- {
- transponowanie();
- duration<double> elapsed_seconds;
- time_point<system_clock> begin = system_clock::now();
- pomnoz_macierze_transpon(0,SIZE);
- elapsed_seconds = system_clock::now() - begin;
- cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
- }
- void watki()
- {
- duration<double> elapsed_seconds;
- std::vector<std::thread*> v;
- int rozmiar_paczki = SIZE / LICZBA_WATKOW;
- time_point<system_clock> begin = system_clock::now();
- for (int i = 0; i < LICZBA_WATKOW; i++)
- {
- if (i == LICZBA_WATKOW - 1) //ostatni watek
- {
- v.push_back(new std::thread{ pomnoz_macierze, i * rozmiar_paczki, SIZE });
- }
- else
- {
- v.push_back(new std::thread{ pomnoz_macierze, i * rozmiar_paczki, i * rozmiar_paczki + rozmiar_paczki });
- }
- }
- for (int i = 0; i < LICZBA_WATKOW; i++)
- {
- v[i]->join();
- delete v[i];
- }
- elapsed_seconds = system_clock::now() - begin;
- cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
- }
- void watki_transpon()
- {
- transponowanie();
- duration<double> elapsed_seconds;
- std::vector<std::thread*> v;
- int rozmiar_paczki = SIZE / LICZBA_WATKOW;
- time_point<system_clock> begin = system_clock::now();
- for (int i = 0; i < LICZBA_WATKOW; i++)
- {
- if (i == LICZBA_WATKOW - 1) //ostatni watek
- {
- v.push_back(new std::thread{ pomnoz_macierze_transpon, i * rozmiar_paczki, SIZE });
- }
- else
- {
- v.push_back(new std::thread{ pomnoz_macierze_transpon, i * rozmiar_paczki, i * rozmiar_paczki + rozmiar_paczki });
- }
- }
- for (int i = 0; i < LICZBA_WATKOW; i++)
- {
- v[i]->join();
- delete v[i];
- }
- elapsed_seconds = system_clock::now() - begin;
- cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
- }
- void wyswietl()
- {
- std::cout << "Macierz C:" << std::endl;
- for (int i = 0; i < 5; i++)
- {
- for (int j = 0; j < 5; j++)
- {
- std::cout << C[i][j] << "\t";
- }
- std::cout << std::endl;
- }
- }
- int main()
- {
- losowe_wartosci();
- wyzeruj();
- //sekwencyjnie();
- //sekwencyjnie_transpon();
- //watki();
- watki_transpon();
- wyswietl();
- return 0;
- }