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 :
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é...
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); }
Voilà, je pige pas trop d'où vient le problèmeMatrice 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
Merci pour vos lumières
Sorry
Partager