#include #include #include #include #include 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 elapsed_seconds; time_point 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 elapsed_seconds; time_point 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 elapsed_seconds; std::vector v; int rozmiar_paczki = SIZE / LICZBA_WATKOW; time_point 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 elapsed_seconds; std::vector v; int rozmiar_paczki = SIZE / LICZBA_WATKOW; time_point 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; }