Bonjour,

Je commence les POSIX Threads.
Je dois realiser un produit matriciel, R = A * B, chaque R(i,j) devant être calculé par une thread differente.

J'ai donc fait ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
#include <pthread.h>
#include <stdio.h>
 
#define LIN 3
#define COL 3
 
void *thread_func(void *);
 
int A[LIN][COL];
int B[LIN][COL];
int R[LIN][COL];
 
int main(){
  pthread_t thread[LIN][COL];
  int i,j;
  int ind[2];
 
  /* initialisation des matrices */
  for ( i=0; i<LIN; i++ ){
    for ( j=0; j<COL; j++ ){
      A[i][j] = i + j;
      B[i][j] = i * j;
      R[i][j] = 0;
    }
  }
  /* matrice A */
  printf("Matrice A :\n");
  for ( i=0; i<LIN; i++ ){
    for ( j=0; j<COL; j++ ){
      printf("%d ",A[i][j]);
    }
    printf("\n");
  }
  printf("\n");
  /* matrice B */
  printf("Matrice B :\n");
  for ( i=0; i<LIN; i++ ){
    for ( j=0; j<COL; j++ ){
      printf("%d ",B[i][j]);
    }
    printf("\n");
  }
  printf("\n");
  /* calcul */
  for ( i=0; i<LIN; i++ ){
    for ( j=0; j<COL; j++ ){
      ind[0] = i;
      ind[1] = j;
      pthread_create(&thread[i][j], NULL, &thread_func,ind);
    }
  }
  /* On attend la fin de toutes les threads */
  for ( i=0; i<LIN; i++ ){
    for ( j=0; j<COL; j++ ){
      pthread_join(thread[i][j], NULL);
    }
  }
  /* matrice R */
  printf("\nMatrice R = A * B :\n");
  for ( i=0; i<LIN; i++ ){
    for ( j=0; j<COL; j++ ){
      printf("%d ",R[i][j]);
    }
    printf("\n");
  }
  printf("\n");
  return 0;
}
 
void *thread_func(void *args){
  int* ind = (int *)args;
  int l = ind[0];
  int c = ind[1];
  int i;
 
  for ( i=0; i<LIN; i++ ){
    R[l][c] += (A[l][i] * B[i][c]);
  }
  printf("Cette thread a calcule R[%d][%d] = %d\n",l,c,R[l][c]);
  pthread_exit(0);
}
Mais ça ne fonctionne pas, il y a un problème apparemment au passage de ind car c'est toujours R[2][2] qui est calculé...

Matrice A :
0 1 2
1 2 3
2 3 4

Matrice B :
0 0 0
0 1 2
0 2 4

Cette thread a calcule R[2][2] = 22
Cette thread a calcule R[2][2] = 44
Cette thread a calcule R[2][2] = 66
Cette thread a calcule R[2][2] = 88
Cette thread a calcule R[2][2] = 110
Cette thread a calcule R[2][2] = 132
Cette thread a calcule R[2][2] = 154
Cette thread a calcule R[2][2] = 176
Cette thread a calcule R[2][2] = 198

Matrice R = A * B :
0 0 0
0 0 0
0 0 198
Voilà, je pige pas trop d'où vient le problème

Merci pour vos lumières
Sorry