Programmation parallèle

Fermé
kenson72000 Messages postés 5 Date d'inscription lundi 21 janvier 2013 Statut Membre Dernière intervention 11 février 2013 - 11 févr. 2013 à 19:55
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 11 févr. 2013 à 23:03
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:

#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] 
	 
   
} 
 




2 réponses

Utilisateur anonyme
11 févr. 2013 à 20:02
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.
0
kenson72000 Messages postés 5 Date d'inscription lundi 21 janvier 2013 Statut Membre Dernière intervention 11 février 2013
11 févr. 2013 à 20:37
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
11 févr. 2013 à 23:03
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é.
0