#include <iostream>
#include <pthread.h>
#include <random>
#include <sys/time.h>
using namespace std;
struct ThreadData
{
int **arr;
int startRow, endRow, n;
int *sums;
};
void* calculate_summ(void *arg)
{
ThreadData* data = (ThreadData*)arg;
for(int i = data->startRow; i < data->endRow; i++)
{
data->sums[i] = 0;
for(int j = 0; j < data->n; j++)
{
if(data->arr[i][j] > 0)
{
data->sums[i] += data->arr[i][j];
}
}
}
return NULL;
}
struct timeval tv1;
void time_start()
{
struct timezone tz;
gettimeofday(&tv1, &tz);
}
long time_stop()
{
struct timeval tv2, dtv;
struct timezone tz;
gettimeofday(&tv2, &tz);
dtv.tv_sec= tv2.tv_sec -tv1.tv_sec;
dtv.tv_usec=tv2.tv_usec-tv1.tv_usec;
if(dtv.tv_usec<0)
{
dtv.tv_sec--;
dtv.tv_usec+=1000000;
}
return dtv.tv_sec*1000000+dtv.tv_usec;
}
int main()
{
srand(time(0));
int n = 100, m = 100, k = 2;
int** arr = new int*[n];
for(int i = 0; i < n; i++)
{
arr[i] = new int[m];
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
arr[i][j] = rand()%15-5;
}
}
/*
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
*/
int thread_num = n/k, ostatok = n%k, sums[n];
time_start();
pthread_t* threads = new pthread_t[thread_num];
ThreadData* threadData = new ThreadData[thread_num];
for(int i = 0; i < thread_num; i++)
{
threadData[i].n = n;
threadData[i].startRow = i*k;
threadData[i].endRow = threadData[i].startRow + k;
threadData[i].arr = arr;
threadData[i].sums = sums;
pthread_create(&threads[i], NULL, calculate_summ, (void*)&threadData[i]);
}
for(int i = 0; i < ostatok; i++) {
threadData[i].endRow += 1;
}
for(int i = 0; i < thread_num; i++)
{
pthread_join(threads[i], NULL);
}
/*
cout << "sums: ";
for(int i = 0; i < n; i++)
{
cout << sums[i] << " ";
}
*/
cout << "\nPARAL_GROUP: Time: " << time_stop() << endl;
for(int i = 0; i < n; i++)
{
delete[] arr[i];
}
delete[] arr;
delete[] threads;
delete[] threadData;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBUaHJlYWREYXRhCnsKICBpbnQgKiphcnI7CiAgaW50IHN0YXJ0Um93LCBlbmRSb3csIG47CiAgaW50ICpzdW1zOwp9OwoKdm9pZCogY2FsY3VsYXRlX3N1bW0odm9pZCAqYXJnKQp7CiAgVGhyZWFkRGF0YSogZGF0YSA9IChUaHJlYWREYXRhKilhcmc7CiAgCiAgZm9yKGludCBpID0gZGF0YS0+c3RhcnRSb3c7IGkgPCBkYXRhLT5lbmRSb3c7IGkrKykKICB7CiAgICBkYXRhLT5zdW1zW2ldID0gMDsKICAgIGZvcihpbnQgaiA9IDA7IGogPCBkYXRhLT5uOyBqKyspCiAgICB7CiAgICAgIGlmKGRhdGEtPmFycltpXVtqXSA+IDApCiAgICAgIHsKICAgICAgICBkYXRhLT5zdW1zW2ldICs9IGRhdGEtPmFycltpXVtqXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gTlVMTDsKfQoKc3RydWN0IHRpbWV2YWwgdHYxOwp2b2lkIHRpbWVfc3RhcnQoKQp7CiAgc3RydWN0IHRpbWV6b25lIHR6OwogIGdldHRpbWVvZmRheSgmdHYxLCAmdHopOwp9Cgpsb25nIHRpbWVfc3RvcCgpCnsKICBzdHJ1Y3QgdGltZXZhbCB0djIsIGR0djsKICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAgZ2V0dGltZW9mZGF5KCZ0djIsICZ0eik7CiAgZHR2LnR2X3NlYz0gdHYyLnR2X3NlYyAtdHYxLnR2X3NlYzsKICBkdHYudHZfdXNlYz10djIudHZfdXNlYy10djEudHZfdXNlYzsKICBpZihkdHYudHZfdXNlYzwwKSAKICB7CiAgICAgZHR2LnR2X3NlYy0tOwogICAgIGR0di50dl91c2VjKz0xMDAwMDAwOwogIH0KICByZXR1cm4gZHR2LnR2X3NlYyoxMDAwMDAwK2R0di50dl91c2VjOwp9CgppbnQgbWFpbigpCnsKICBzcmFuZCh0aW1lKDApKTsKICAKICBpbnQgbiA9IDEwMCwgbSA9IDEwMCwgayA9IDI7CiAgCiAgaW50KiogYXJyID0gbmV3IGludCpbbl07CiAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKICB7CiAgICBhcnJbaV0gPSBuZXcgaW50W21dOwogIH0KICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogIHsKICAgIGZvcihpbnQgaiA9IDA7IGogPCBtOyBqKyspCiAgICB7CiAgICAgIGFycltpXVtqXSA9IHJhbmQoKSUxNS01OwogICAgfQogIH0KICAvKgogIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgewogICAgZm9yKGludCBqID0gMDsgaiA8IG07IGorKykKICAgIHsKICAgICAgY291dCA8PCBhcnJbaV1bal0gPDwgIiAiOwogICAgfQogICAgY291dCA8PCBlbmRsOwogIH0KICAqLwogIGludCB0aHJlYWRfbnVtID0gbi9rLCBvc3RhdG9rID0gbiVrLCBzdW1zW25dOwogIAogIHRpbWVfc3RhcnQoKTsKICAKICBwdGhyZWFkX3QqIHRocmVhZHMgPSBuZXcgcHRocmVhZF90W3RocmVhZF9udW1dOwogIFRocmVhZERhdGEqIHRocmVhZERhdGEgPSBuZXcgVGhyZWFkRGF0YVt0aHJlYWRfbnVtXTsKICAKICBmb3IoaW50IGkgPSAwOyBpIDwgdGhyZWFkX251bTsgaSsrKQogIHsKICAgIHRocmVhZERhdGFbaV0ubiA9IG47CiAgICB0aHJlYWREYXRhW2ldLnN0YXJ0Um93ID0gaSprOwogICAgdGhyZWFkRGF0YVtpXS5lbmRSb3cgPSB0aHJlYWREYXRhW2ldLnN0YXJ0Um93ICsgazsKICAgIHRocmVhZERhdGFbaV0uYXJyID0gYXJyOwogICAgdGhyZWFkRGF0YVtpXS5zdW1zID0gc3VtczsKICAgIAogICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbaV0sIE5VTEwsIGNhbGN1bGF0ZV9zdW1tLCAodm9pZCopJnRocmVhZERhdGFbaV0pOwogIH0KICAKICBmb3IoaW50IGkgPSAwOyBpIDwgb3N0YXRvazsgaSsrKSB7CiAgIHRocmVhZERhdGFbaV0uZW5kUm93ICs9IDE7Cn0KICAKICBmb3IoaW50IGkgPSAwOyBpIDwgdGhyZWFkX251bTsgaSsrKQogIHsKICAgIHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKICB9CiAgLyoKICBjb3V0IDw8ICJzdW1zOiAiOwogIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgewogICAgY291dCA8PCBzdW1zW2ldIDw8ICIgIjsKICB9CiAgKi8KICBjb3V0IDw8ICJcblBBUkFMX0dST1VQOiBUaW1lOiAiIDw8IHRpbWVfc3RvcCgpIDw8IGVuZGw7CiAgCiAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKICB7CiAgICBkZWxldGVbXSBhcnJbaV07CiAgfQogIGRlbGV0ZVtdIGFycjsKICBkZWxldGVbXSB0aHJlYWRzOwogIGRlbGV0ZVtdIHRocmVhZERhdGE7Cn0K