Programmation parallèle
kenson72000
Messages postés
5
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 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]
}
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.-
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é.