Programmation parallèle
kenson72000
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour, à vous tous maître du C. Je viens cette fois avec un problème en programmation parallèle j'aimerai parlléliser la multiplication de 2 matrices carrées d'ordre 5 avec 25 threads mais à la compilation un message s'affiche <<erreur de segmentation>>. NB: je compile sur Linux avec gcc.
Voici le code proprement dit:
Voici le code proprement dit:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> #include <signal.h> #include <memory.h> #include <pthread.h> #define N 5 #define M 10 void* multiplication_Mat ( void *arg );// Multiplication des matrices void imprime ( int matrice[N][N] ) ; int A[N][N] , B[N][N ] ;// Matrices int C[N][N] ;// C=A*B int fila ; // La file des 2 matrices pthread_t thr[N] ;// Vecteurs threads void main(void) { int j , k , semilla ; // Initialisation des matrices semilla = time (NULL ) ; srand ( semilla) ; for ( j =1 ; j <=N ; j ++) for ( k = 1 ; k<=N ; k++) { A[j][k] = rand()%(M) ; //nombre aléatoire entre 0 et 10 B[j][k] = rand()%(M) ; } imprime(A); printf("\n"); imprime(B); printf("\n"); //initialisation de C for ( j = 1 ; j <=N ; j ++) for ( k = 1 ; k<=N ; k++) { C[j][k] = 0 ; } for ( j=1 ; j <=N*N ; j ++) { printf ( " Thread numero %d\n " , j ) ; pthread_create (&thr[j] , NULL , multiplication_Mat , (void*)j);//calcul des C[i][j] par les processus p1,p2,p3,P4... } for ( j = 1 ; j<=N*N ; j++) { printf ( " Attendre thread %d\n ", j ) ; pthread_join ( thr[j] , NULL) ;//mise en attente du processus père } imprime(C);printf("\n");//affichage de C } void imprime ( int matrice[N][N] ) { int j , k ; for( j=1 ; j <=N; j ++) { printf ( "\n " ) ; for ( k=1; k<=N; k++) printf( "%d\t" , matrice[j][k] ) ; } } void* multiplication_Mat(void* i) { int k,j ; k=(int)i ;//chaque processeur à pour identifiant le i passé en paramètre for ( j=1 ; j<=N ; j++) {C[(k+1)/2][(k-1)%2 + 1] = A[(k+1)/2][j]*B[j][(k+1)%2] + C[(k+1)/2][(k-1)%2+1];}//le processeur d'identifiant k calcul c[i][j] }
A voir également:
- Programmation parallèle
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation vb - Télécharger - Langages
- Programmation binaire - Guide
- Brancher deux ampli en parallèle - Forum Enceintes / HiFi
2 réponses
Salut,
Je n'ai pas de compilateur sous la main. Mais c'est pas plutôt à l'exécution (et non à la compilaton) que tu obtiens ton erreur de segmentation ?
Si c'est le cas, lance ton programme avec gdb ($gdb ./ton_programme). Puis appuye sur "r" (run) pour le lancer. Une fois que le programme se termine à cause de l'erreur de segmentation, tape "bt" (backtrace) pour voir quel appel de fonction à causée l'erreur.
Je n'ai pas de compilateur sous la main. Mais c'est pas plutôt à l'exécution (et non à la compilaton) que tu obtiens ton erreur de segmentation ?
Si c'est le cas, lance ton programme avec gdb ($gdb ./ton_programme). Puis appuye sur "r" (run) pour le lancer. Une fois que le programme se termine à cause de l'erreur de segmentation, tape "bt" (backtrace) pour voir quel appel de fonction à causée l'erreur.
kenson72000
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
merçi H4RDW4RE. tu as raison en fait c'est plutôt à l'éxecution que le message sur la segmentation s'affiche; le problème n'est pas le compilateur en effet, le problème est dans le code et je ne sais pas où. j'ai le même code qui marche bien avec 5 processus dont chacun calcul une seule ligne de la matrice mais avec 25 processus pour chaque élément de la matrice il y a problème de segmentation. je ne sais pas si je pourrai trouver le compilateur dont tu parle pour linux(Ubuntu 12.04).j'éssaierai tout de même. Merci une fois de plus.
Bonjour,
J'ai pas tout lu, mais déjà une erreur saute aux yeux.
for ( j =1 ; j <=N ; j ++)
Attention, les tableaux commencent à 0 et non à 1.
Donc lorsque j=N, tu auras des erreurs de segmentation.
J'ai pas cherché à lire plus loin.
De plus, ce n'est pas void main(void) mais int main(void) qu'il faut mettre.
Et main() se finit par return 0; pour dire que tout s'est bien déroulé.
J'ai pas tout lu, mais déjà une erreur saute aux yeux.
for ( j =1 ; j <=N ; j ++)
Attention, les tableaux commencent à 0 et non à 1.
Donc lorsque j=N, tu auras des erreurs de segmentation.
J'ai pas cherché à lire plus loin.
De plus, ce n'est pas void main(void) mais int main(void) qu'il faut mettre.
Et main() se finit par return 0; pour dire que tout s'est bien déroulé.