Programmation parallèle
kenson72000
Messages postés
5
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
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
- Brancher deux ampli en parallèle - Forum Enceintes / HiFi
- Programmation envoi sms - Guide
- Programmation casio vr-200 - Forum Autres périphériques et appareils
- Programmation binaire - Guide
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
Statut
Membre
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é.