Programmation parallèle

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

  • Votes
  • Date
  • Date décroissante
  1. 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.
    1. 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.
  2. Contributeur
    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é.