2010-03-15 10 views
4

J'ai les deux matrices contenant seulement des matrices et chaque matrice a 500 lignes et colonnes. Ainsi, la matrice résultante doit être une matrice de tous les éléments ayant la valeur . Mais, je reçois res_mat [0] [0] = 5000. Même les autres éléments sont également 5000. Pourquoi?Utilisation de pthread pour effectuer une multiplication matricielle

#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; 
} 
+0

Fondamentalement, dans mon programme chaque thread calcule 50 lignes .. Et je passe la valeur des lignes à calculer lors de l'appel de fonction pthread_create() –

Répondre

4

Je ne sais pas si cela est la cause de votre problème, mais:

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

est définitivement rompu. Vous passez dans l'adresse de j &j. Chaque thread recevra donc une valeur aléatoire 0 < = starting_row < = 9, quand il démarre réellement. Probablement préférable de simplement passer (void*)j et le sortir avec (int)j.

Vous n'initialisez également jamais res_mat, mais IIRC sera initialisé de toute façon.

EDIT: La raison pour laquelle la valeur de starting_row est aléatoire, est le j passe par tous les nombres compris entre 0 et 9 entre le fil en cours de démarrage, et étant rejoint. Ainsi, le thread sera démarré à un point aléatoire entre les deux, et ramassera la valeur de j à ce point.

+0

Pourquoi dans chaque thread la valeur de starting_row serait un aléatoire entre 0 et 9? –

+0

Actaully, ce que je pense est que TOUS LES FILS auront la même valeur de j .. Ai-je raison? –

+1

Non, car une fois qu'un thread est créé, vous ne savez pas quand ou dans quel ordre ils seront exécutés. Après un appel à pthread_create, quel thread est en cours d'exécution, le thread principal, ou celui qui vient d'être créé? donc vous pouvez avoir raison (c'est-à-dire que tous les threads sont créés et ensuite commencer l'exécution), mais c'est juste une possibilité – shodanex

3

Vous passez un pointeur sur j à la fonction de filetage. La valeur de j peut avoir changé lorsque le thread y accède. Passez juste (void *) j et changez la distribution dans la fonction de fil à starting_row = (int)t;.

+0

Alors, que dois-je réellement faire? Changer seulement & j -> (void *) j créera des fautes SEG. –

+0

Voir la mise à jour. – Henrik

+0

Merci. Je l'ai. Facile et court .. Cheers! –

Questions connexes