Using pthread to do matrix multiplication

I have two matrices containing only ones, and each array has 500 rows and columns . So, the resulting matrix should be a matrix of all elements with a value of 500 . But I get res_mat [0] [0] = 5000 . Even other items are also 5000. Why ?

#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<stdlib.h> #define ROWS 500 #define COLUMNS 500 #define N_THREADS 10 int mat1[ROWS][COLUMNS],mat2[ROWS][COLUMNS],res_mat[ROWS][COLUMNS]; void *mult_thread(void *t) { /*This function calculates 50 ROWS of the matrix*/ int starting_row; starting_row = *((int *)t); starting_row = 50 * starting_row; int i,j,k; for (i = starting_row;i<starting_row+50;i++) for (j=0;j<COLUMNS;j++) for (k=0;k<ROWS;k++) res_mat[i][j] += (mat1[i][k] * mat2[k][j]); return; } void fill_matrix(int mat[ROWS][COLUMNS]) { int i,j; for(i=0;i<ROWS;i++) for(j=0;j<COLUMNS;j++) mat[i][j] = 1; } int main() { int n_threads = 10; //10 threads created bcos we have 500 rows and one thread calculates 50 rows int j=0; pthread_t p[n_threads]; fill_matrix(mat1); fill_matrix(mat2); for (j=0;j<10;j++) pthread_create(&p[j],NULL,mult_thread,&j); for (j=0;j<10;j++) pthread_join(p[j],NULL); printf("%d\n",res_mat[0][0]); return 0; } 
+4
source share
2 answers

I do not know if this is the cause of your problem, but:

  pthread_create(&p[j],NULL,mult_thread,&j); 

definitely broken. You go to j &j . Therefore, each thread receives a random value 0 <= start_row <= 9 when it really starts. It's probably best to just go to (void*)j and get it with (int)j .

You also never initialize res_mat , but in any case it will be initialized.

EDIT: The reason the starting_row value is random is because j goes through all the numbers between 0 and 9 between the running thread and connects. Thus, the thread will be launched at some random point between the two, and at that moment the value j will be obtained.

+4
source

You pass a pointer to j stream function. The value of j can change when a thread accesses it. Just pass (void *) j and change the cast in the stream function to starting_row = (int)t; .

+3
source

Source: https://habr.com/ru/post/1304125/


All Articles