Probleme de segmentation
biba
-
biba -
biba -
Bonjour,
lors de l'execution d'un programme c compilé avec gcc, j'obtiendrai un message d'erreur de segmentation lorsque je le lance à partir du pas >à 3.
~$ ./testlu 10 5
Segmentation fault
avec 10 est la taille maximale de la matrice et 5 pas d'incrementation.
Someone can help me please!
lors de l'execution d'un programme c compilé avec gcc, j'obtiendrai un message d'erreur de segmentation lorsque je le lance à partir du pas >à 3.
~$ ./testlu 10 5
Segmentation fault
avec 10 est la taille maximale de la matrice et 5 pas d'incrementation.
Someone can help me please!
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#include <time.h>
#include<valgrind/callgrind.h>
int main(int argc,char** argv)
{
float *a,*l,*u,somme=0,*b/*ax=b*/,*z/* lz=b et z=ux */, *x;
int i, j,k,dim,n,inc;
double nsec,rap,ordre;
struct timespec start, end;
/*La taille maximale de la matrice et pas d'incrementation*/
n=atoi(argv[1]);
inc=atoi(argv[2]);
for(dim=0; dim<=n; dim=dim+inc)
{
/*allocation des trois matrices */
a=(float*)malloc(dim*dim*sizeof(float));
l=(float*)malloc(dim*dim*sizeof(float));
u=(float*)malloc(dim*dim*sizeof(float));
b=(float*)malloc(dim*sizeof(float));
/*Allocation du vecteur z et x */
z=(float*)malloc(dim*sizeof(float));
x=(float*)malloc(dim*sizeof(float));
/*initialisation de la matrice a */
#pragma omp parallel for private(i,j)
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
a[i*dim+j]=i*j-1;
/* Initialisation du vecteur b */
#pragma omp parallel for private(i)
for(i=0;i<dim;i++)
b[i]=i-15;
CALLGRIND_ZERO_STATS;
//lecture du temps début
clock_gettime(CLOCK_THREAD_CPUTIME_ID,&start);
/*détermination des matrices l et u */
u[0]=a[0]; /* le premier élément de u est le même que celui de a */
#pragma omp parallel
{
#pragma omp parallel for
for(j=1;j<dim;j++)
{
u[j]=a[j]; /*les éléments de la première ligne de u sont les mêmes que ceux de a */
l[dim*j]=a[dim*j]/a[0]; /*les éléments de la première colonne de l */
}
}
/* calcul des autres éléments de l et u */
#pragma omp prallel
{
#pragma omp prallel for
for(i=1;i<dim-1;i++)
{ somme=0;
for(k=0;k<i;k++)
somme+=l[dim*i+k]*u[dim*k+i];
u[dim*i+i]=a[dim*i+i]-somme;/*la diagonale de u */
for(j=i;j<dim;j++) /* les autres éléments de u et de l */
{ somme=0;
for(k=0;k<i;k++)
somme+=l[dim*i+k]*u[dim*k+j];
u[dim*i+j]=a[dim*i+j]-somme;
somme=0;
for(k=0;k<i;k++)
somme+=l[dim*j+k]*u[k*dim+i];
l[dim*j+i]=(a[dim*j+i]-somme)/u[dim*i+i];
}
}
}
/* calcul du dernier élément de u */
somme=0;
#pragma omp parallel for reduction(+:somme)
for(k=0;k<dim-1;k++)
somme+=l[dim*(dim-1)+k]*u[(dim*k)+dim-1];
u[dim*dim-1]=a[dim*dim-1]-somme;
/* les éléments nuls et égaux à 1 dans l */
#pragma omp parallel
for(i=0;i<dim;i++)
l[dim*i+i]=1;
/* affichage des trois matrices */
/*
printf("\nLa matrice a est: \n");
for(i=0;i<dim;i++)
{ printf("\n");
for(j=0;j<dim;j++)
{ printf(" | ");
printf("%f",a[dim*i+j]);
printf(" ");
}
printf(" |");
printf("\n");
}
printf("\n");
printf("\nLa matrice l est:\n ");
for(i=0;i<dim;i++)
{ printf("\n");
for(j=0;j<dim;j++)
{ printf(" | ");
printf("%f",l[dim*i+j]);
printf(" ");
}
printf(" |");
printf("\n");
}
printf("\nLa matrice u est:\n ");
for(i=0;i<dim;i++)
{ printf("\n");
for(j=0;j<dim;j++)
{printf(" | ");
printf("%f",u[dim*i+j]);
printf(" ");
}
printf(" |");
printf("\n");
}
*/
/* résolution du système linéaire*/
/*Determination des éléments de z */
z[0]=b[0];
#pragma omp parallel
{
#pragma omp parallel for private (j,somme)
for(i=1;i<dim;i++)
{ somme=0;
for(j=0;j<i;j++)
somme+=l[dim*i+j]*z[j];
z[i]=b[i]-somme;
}
}
/* Determination du vecteur x avec ux=z */
x[dim-1]=z[dim-1]/u[dim*dim-1];
#pragma omp parallel for private(j,somme)
for(i=dim-2;i>=0;i--)
{ somme=0;
for(j=i;j<dim;j++)
somme+=u[dim*i+j]*x[j];
x[i]=(z[i]-somme)/u[dim*i+i];
}
CALLGRIND_DUMP_STATS;
// lecture du temps d'arrêt
clock_gettime(CLOCK_THREAD_CPUTIME_ID,&end);
// calcul de l'intervalle
nsec =(end.tv_sec * 1000000000 + end.tv_nsec) - (start.tv_sec * 1000000000 + start.tv_nsec) ;
/* Affichage du vecteur x */
/* printf(" ------\n");
for(i=0;i<dim;i++)
{ printf("| %f |\n",x[i]);
printf(" ------\n");
}
*/
/* liberer la memoire */
free(a);
free(b);
free(l);
free(u);
ordre=dim*dim*dim;
rap=nsec/ordre;
/* affiche le temp d'execution */
printf("dimension ordre temp rapport\n");
printf("%d %f %f %f\n",dim,ordre,nsec,rap);
}
return(0);
}