pthread实现多线程矩阵乘法

发布时间 2023-10-01 17:48:18作者: 祥瑞哈哈哈

#include <pthread.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"pthreadVC2.lib")
#define rowCount 1300
#define mediumCount 1500
#define columnCount 5000
#define n_threads 8
int **a = new int*[rowCount];
int **b = new int*[mediumCount];
int **c = new int*[rowCount];
void *mult_thread(void *t)
{//t表示当前行数,row表示延申之后的。
/*This function calculates 50 ROWS of the matrix*/


int starting_row;
starting_row = ** (int **)t;


int row = int(rowCount / n_threads) ;


if (starting_row == (n_threads - 1))
{
//printf("%d,%d",row, rowCount);
starting_row = starting_row * row;
row = rowCount - (n_threads-1)*row;}
else
{ starting_row = starting_row * row; }

int i, j, k;
for (i = starting_row; i < starting_row + row; i++)
for (j = 0; j < columnCount; j++)
for (k = 0; k < mediumCount; k++)
c[i][j] += (a[i][k] * b[k][j]);
return 0;

}

int main() {
for (int i = 0; i < rowCount; i++)
{
a[i] = new int[mediumCount];
}
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < mediumCount; j++)
{
a[i][j] = i+j;
//printf("%d ",a[i][j]);

}
//printf("\n");
}
for (int i = 0; i < mediumCount; i++)
{
b[i] = new int[columnCount];

}
for (int i = 0; i < mediumCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
b[i][j] = i + j;
//printf("%d ", b[i][j]);
}
//printf("\n ");
}
for (int i = 0; i < rowCount; i++)
{
c[i] = new int[columnCount];
}
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
c[i][j] = 0;
}
//printf("\n ");
}
pthread_t p[n_threads];
int * w[n_threads];
int cun[n_threads];
clock_t start, end;
start = clock();
for (int j = 0; j < n_threads; j++)
{
cun[j] = j;
w[j] = &cun[j];
//pthread_create(&p[ji], NULL, mult_thread, &ji);
if (pthread_create(&p[j], NULL, mult_thread, &w[j]))
printf("Pthread Create Fails");

}


for (int j = 0; j < n_threads; j++)
{
pthread_join(p[j], NULL);
}
end = clock();
cout << "time = " << double(end - start) / CLOCKS_PER_SEC << "s" << endl;
/*for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
printf("%d ", c[i][j]);
}
printf("\n ");
}
*/
return 0;}