#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <math.h>
using namespace std;
pthread_mutex_t mutex;
int **mas;
int *vect;
int *result;
struct Data
{
int st;
int _end;
int m;
};
void *colMult(int st, int _end, int n) // по столбцам
{
for (int i = st; i < _end; i++)
{
for(int j = 0; j < n; j++)
{
pthread_mutex_lock(&mutex);
result[j] += mas[j][i] * vect[i];
pthread_mutex_unlock(&mutex);
}
}
}
void rowMult(int st, int _end, int m) // по строкам
{
for (int j = st; j < _end; j++)
{
for(int i = 0; i < m; i++)
{
pthread_mutex_lock(&mutex);
result[j] += mas[j][i] * vect[i];
pthread_mutex_unlock(&mutex);
}
}
}
void *rowFunc(void *lpParam)
{
struct Data dt = *((struct Data *)lpParam);
rowMult(dt.st, dt._end, dt.m);
}
void *colFunc(void *lpParam)
{
struct Data dt = *((struct Data *)lpParam);
colMult(dt.st, dt._end, dt.m);
}
int main()
{
setlocale(LC_ALL, "Russian");
pthread_mutex_init(&mutex, NULL);
const int p = 3;
const int n = 4, m = 2;
mas = new int*[n];
pthread_t *th = new pthread_t[p];
for (int i = 0; i < n; i++)
mas[i] = new int[m];
cout << "Матрица: " << endl;
srand(time(NULL));
result = new int[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
mas[i][j] = rand()%10;
cout << mas[i][j] << " ";
}
cout << endl;
result[i] = 0;
}
cout << endl;
cout << "Вектор: " << endl;
vect = new int[m];
srand(time(NULL));
for (int j = 0; j < m; j++)
{
vect[j] = rand()%10;
cout << vect[j] << " ";
}
cout << endl;
Data *dt = new Data[p];
long t = clock();
cout << endl << "Разбиение по строкам:" << endl;
for (int i = 0; i < p; i++)
{
dt[i].m = m;
dt[i].st = i * round(n/p);
dt[i]._end = (i == (p - 1)) ? (i * round(n/p) + round(n/p) + n % p) : (i * round(n/p) + round(n/p));
pthread_create(&th[i], NULL, rowFunc, &dt[i]);
}
cout << "Результат: ";
for (int i = 0; i < p; i++)
{
pthread_join(th[i], NULL);
}
t = clock() - t;
for (int i = 0; i < n; i++)
{
cout << result[i] << " ";
result[i] = 0;
}
cout << endl << "Время выполнения: " << t << " ms" << endl;
t = clock();
cout << endl << "Разбиение по столбцам:" << endl;
for (int i = 0; i < p; i++)
{
dt[i].m = n;
dt[i].st = i * round(m/p);
dt[i]._end = (i == (p - 1)) ? (i * round(m/p) + round(m/p) + m % p) : (i * round(m/p) + round(m/p));
pthread_create(&th[i], NULL, colFunc, &dt[i]);
}
cout << "Результат: ";
for (int i = 0; i < p; i++)
{
pthread_join(th[i], NULL);
}
t = clock() - t;
for (int i = 0; i < n; i++)
{
cout << result[i] << " ";
}
cout << endl << "Время выполнения: " << t << " ms" << endl;
for (int i = 0; i < n; i++)
delete[] mas[i];
delete []mas;
delete []dt;
delete []result;
delete []vect;
delete []th;
return 0;
}