temps de calculs très bizarre
Bonjour, je me suis fait une structure Matrix comme suit
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
typedef struct t_mat
{
unsigned int nl; // nombre de lignes
unsigned int nc; // nombre de colonnes
double ** data;
} Matrix;
Matrix * CreateMatrix(unsigned int nl_,unsigned int nc_,double val)
{
/* memory allocation */
Matrix * m=malloc(sizeof(*m));
if(m==NULL)
{
MEMERROR;
exit(EXIT_FAILURE);
}
/* an empty matrix is defined by nl==0, nc==0 and data==NULL */
if(nl_==0)
if(nc_!=0)
{
fprintf (stderr,"%s %d : Error : nc_ must be equal to 0\n",__FILE__,__LINE__);
exit(EXIT_FAILURE);
}
if(nc_==0)
if(nl_!=0)
{
fprintf (stderr,"%s %d : Error : nl_ must be equal to 0\n",__FILE__,__LINE__);
exit(EXIT_FAILURE);
}
if(nl_==0)
{
m->nl=0;
m->nc=0;
m->data=NULL;
}
else
{
m->nl=nl_;
m->nc=nc_;
m->data=malloc(nl_*sizeof(realtype *));
if(m->data==NULL)
{
MEMERROR;
exit(EXIT_FAILURE);
}
unsigned int i,j;
for(i=0;i<nl_;i++)
{
m->data[i]=malloc(nc_*sizeof(realtype));
if(m->data[i]==NULL)
{
MEMERROR;
exit(EXIT_FAILURE);
}
for(j=0;j<nc_;j++) /* matrix initialisation */
m->data[i][j]=val;
}
}
return m;
}
void DestroyMatrix(Matrix ** m)
{
(*m)->nc=0;
(*m)->nl=0;
/* free memory */
unsigned int i;
for(i=0;i<(*m)->nc;i++)
{
if((*m)->data[i]!=NULL)
{
free((*m)->data[i]);
(*m)->data[i]=NULL;
}
}
free((*m)->data); (*m)->data=NULL;
free(*m); *m=NULL;
} |
Je me donne 3 matrices 1000*1000 (mat1, mat2 et mat3) remplies uniquement de 1. Lorsque j'effectue l'opération mat1*mat2 le temps d'exécution fait 0.62 s mais lorsque je fais mat3=mat1*mat2 le temps d'exécution passe à 16.79 s. Ca me paraît très bizarre... Savez-vous pourquoi ?
Voici le code pour faire mat1*mat2
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
int main(int argc,char * argv[])
{
Matrix * mat1=CreateMatrix(1000,1000,1);
Matrix * mat2=CreateMatrix(1000,1000,1);
double somme;
unsigned i,jj;
for(i=0;i<1000;++i)
{
for(jj=0;jj<1000;jj++)
{
somme=0.;
for(k=0;k<1000;++k)
somme+=mat1->data[i][k]*mat2->data[k][jj];
}
}
DestroyMatrix(&mat1);
DestroyMatrix(&mat2);
return 0;
} |
et voici le code pour faire mat3=mat1*mat2
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
int main(int argc,char * argv[])
{
Matrix * mat1=CreateMatrix(1000,1000,1);
Matrix * mat2=CreateMatrix(1000,1000,1);
Matrix * mat3=CreateMatrix(1000,1000,1);
double somme;
unsigned i,jj;
for(i=0;i<1000;++i)
{
for(jj=0;jj<1000;jj++)
{
somme=0.;
for(k=0;k<1000;++k)
somme+=mat1->data[i][k]*mat2->data[k][jj];
mat3->data[i][jj]=somme;
}
}
DestroyMatrix(&mat1);
DestroyMatrix(&mat2);
DestroyMatrix(&mat3);
return 0;
} |
Merci.