#include
#include
#include
#include
using namespace std;
using namespace std::chrono;
#define
int main() {
int
#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()
{
double start, stop;
int** A = new int* [SIZE];
int** B = new int* [SIZE];
int** C = new int* [SIZE];
int** BT = new int* [SIZE];
start = omp_get_wtime();
for (int i =
A[i] = new int[SIZE];
for (int i = 0;i <
{
B[i] = new int[SIZE];
for (int i = 0;i < SIZE;i++)
C[i] = new int[SIZE];
for (int i = 0;i < SIZE;i++)
BT[i] = new int[SIZE];
for (int i = 0;i < SIZE;i++) { //tworzenie A
for (int j =
A[i][j] = rand() % 10;
}
for (int i = 0;i < SIZE;i++) { //tworzenie B
for (int j = 0;j <
{
B[i][j] = rand() % 10;
}
for (int i = 0;i < SIZE;i++) { //transponowanie
for (int j = 0;j < SIZE;j++)
BT[i][j] = B[j][i];
}
for (int i = 0;i < SIZE;i++) { //tworzenie C
for (int j = 0;j < SIZE;j++)
C[i][j] =
}
for(int i = 0;i < SIZE;i++) { //mnozenie A i B
for (int j = 0;j < SIZE;j++) {
for (int k = 0;k < SIZE;k++)
C[i][j] += A[i][k] * BT[j][k];
}
}
{
srand(10);
for (int 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
time_point
pomnoz_macierze(0,SIZE);
elapsed_seconds = system_clock::now() - begin;
cout
std::cout << "Czas wykonania: " <<
}
void sekwencyjnie_transpon()
{
transponowanie();
duration
time_point
pomnoz_macierze_transpon(0,SIZE);
elapsed_seconds = system_clock::now() - begin;
cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
}
void watki()
{
duration
std::vector
int rozmiar_paczki = SIZE / LICZBA_WATKOW;
time_point
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
std::vector
int rozmiar_paczki = SIZE / LICZBA_WATKOW;
time_point
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;
}