#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
time_point
pomnoz_macierze(0,SIZE);
elapsed_seconds = system_clock::now() - begin;
cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
}
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 a1 = 2000;
int a2 = 2000;
int b1 = 2000;
int b2 = 2000;
double start, stop;
start = omp_get_wtime();
int **A = new int *[a1];
int **B = new int *[a2];
int **C = new int *[a1];
int **BT = new int *[a2];
for (int i = 0;i < a1;i++) A[i] = new int[b1];
for (int i = 0;i < a2;i++) B[i] = new int[b2];
for (int i = 0;i < a1;i++) C[i] = new int[b2];
for (int i = 0;i < a2;i++) BT[i] = new int[b1];
for (int i = 0;i < a1;i++)
for (int j = 0;j < b1;j++)
A[i][j] = 1;
for (int i = 0;i < a2;i++)
for (int j = 0;j < b2;j++)
B[i][j] = 1;
for (int i = 0;i < a2;i++)
for (int j = 0;j < b1;j++)
BT[i][j] = B[j][i];
for (int i = 0;i < a1;i++)
for (int j = 0;j < b2;j++)
C[i][j] = 0;
//#pragma omp parallel for num_threads(1)
for(int k = 0;k < a1;k++)
for (int i = 0;i < a2;i++)
for (int j = 0;j < b1;j++)
C[k][i] += A[k][j] * BT[i][j];
stop = omp_get_wtime();
std::cout << "A:" << a1 << "x" << b1 << " B:" << a2 << "x" << b2 <
losowe_wartosci();
wyzeruj();
//sekwencyjnie();
//sekwencyjnie_transpon();
//watki();
watki_transpon();
wyswietl();
return 0;
}