Hello, I'm trying to write a program that calculates up to a 1024 x 1024 matrix using multi-threading. For example, I need to run a 1024 x 1024 using 256, 64, 16 or 4 threads. Or I need to run a 64 x 64 matrix using 16 or 4 threads. All the Matrices are square. I thought I coded my program correctly, however I get a segmentation fault when I use a 720 x 720 matrix or higher, heres the code.
Any help would be appreciated, thanks in advance.
Code:
#include <iostream>
#include <stdio.h>
#include <pthread.h>
using namespace std;
const int DIM = 720; //works up to 719, crashes at 720
const int num_of_thr = 4;
int matrix_A[DIM][DIM];
int matrix_B[DIM][DIM];
int c[DIM][DIM];
struct v
{
int i;
int j;
};
//worker thread
void* matrix_multi(void* data)
{
for(int i = 0; i < DIM; i++)
{
for(int j = 0; j < DIM; j++)
{
c[i][j] = 0;
for(int k = 0; k < DIM; k++)
{
c[i][j] += matrix_A[i][k] * matrix_B[k][j];
}
}
}
pthread_exit(0);
}
int main()
{
pthread_t thr_id[DIM][DIM];
pthread_attr_t thr_attr;
pthread_attr_init(&thr_attr);
//Filling the Matrices
for(int i = 0; i < DIM; i++)
{
for(int j = 0; j < DIM; j++)
{
matrix_A[i][j]= i + j;
matrix_B[i][j] = i + 3;
}
}
//create the threads
for(int i = 0; i < num_of_thr/2; i++)
{
for(int j = 0; j < num_of_thr/2; j++)
{
struct v *data = (struct v *) malloc(sizeof(struct v));
data->i = i;
data->j = j;
pthread_create(&thr_id[i][j],NULL,matrix_multi, &data);
}
}
//joining the threads
for(int i = 0; i < num_of_thr/2; i++)
{
for(int j = 0; j < num_of_thr/2; j++)
{
pthread_join(thr_id[i][j],NULL);
}
}
return 0;
}
Comment