Mit pthread ausführen-matrix-Multiplikation
Habe ich die beiden Matrizen mit nur Einsen und jedes array hat 500 Zeilen und Spalten. So, die resultierende matrix eine matrix in der alle Elemente mit dem Wert 500. Aber, ich bin immer res_mat[0][0]=5000. Auch andere Elemente sind auch 5000. Warum?
#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;
}
- Im Grunde, in meinem Programm jeder thread berechnet 50 Zeilen.. Und ich übergeben Sie den Wert der Zeilen, die berechnet werden, während dabei die Funktion rufen Sie pthread_create()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, ob dies die Ursache für Ihr problem, aber:
ist definitiv gebrochen. Sie sind auf der Durchreise Adresse von j
&j
. Also jeder thread bekommt einen zufälligen Wert 0 <= starting_row <= 9, wenn es tatsächlich beginnt. Wahrscheinlich besser, nur pass in(void*)j
- und bekommen es mit(int)j
.Du bist auch nie Initialisierung
res_mat
, aber IIRC bekommt er initialisiert sowieso.BEARBEITEN:
Der Grund, dass der Wert der
starting_row
zufällig ist, ist diej
geht durch alle zahlen zwischen 0 und 9 zwischen der thread gestartet wird, und es wird verbunden.So wird der thread gestartet werden, der zu einem zufälligen Zeitpunkt zwischen den beiden, und holt den Wert der
j
an diesem Punkt.Übergeben Sie einen Zeiger auf j, um die thread-Funktion. Der Wert von j kann sich geändert haben, wenn der thread zugreift. Nur pass (void *)j und ändern Sie die Besetzung in der thread-Funktion zu
starting_row = (int)t;
.