From cc8bb92b4e0553dafd3f04f73bcab504dd535951 Mon Sep 17 00:00:00 2001 From: Mathieu Faverge <mathieu.faverge@inria.fr> Date: Mon, 7 Nov 2016 19:25:28 +0100 Subject: [PATCH] duplicate the loop to avoid if at each iteration --- z_spm_expand.c | 93 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/z_spm_expand.c b/z_spm_expand.c index 7f77e5a8..d9d982de 100644 --- a/z_spm_expand.c +++ b/z_spm_expand.c @@ -24,7 +24,7 @@ pastix_spm_t * z_spmExpand(const pastix_spm_t *spm) { pastix_spm_t *newspm; - pastix_int_t i, j, k, ii, jj, dofi, dofj, col, row, baseval, cpt; + pastix_int_t i, j, k, ii, jj, dof, dofi, dofj, col, row, baseval, cpt; pastix_int_t *newcol, *newrow, *oldcol, *oldrow, *dofs; #if !defined(PRECISION_p) pastix_complex64_t *newval, *oldval; @@ -64,54 +64,79 @@ z_spmExpand(const pastix_spm_t *spm) /** * Loop on col */ - for(i=0; i<spm->n; i++) - { - if ( spm->dof > 0 ) { - col = spm->dof * i; - dofi = spm->dof; + if ( spm->dof > 0 ) { + col = 0; + dof = spm->dof; + + for(i=0; i<spm->n; i++, col+=dof) + { + for(ii=0; ii<dof; ii++, newcol++) + { + /** + * Loop on rows + */ + for(k=oldcol[i]; k<oldcol[i+1]; k++, row+=dof) + { + j = oldrow[k-baseval]-baseval; + + for(jj=0; jj<dof; jj++, newrow++) + { + (*newcol)++; + (*newrow) = row + jj + baseval; + +#if !defined(PRECISION_p) + if ( (spm->mtxtype != PastixGeneral) && + (row + jj < col + ii) ) + { + (*newval) = oldval[ cpt ]; + newval++; + } + cpt++; +#endif + } + } + (*newcol) += baseval; + } } - else { + } + else { + for(i=0; i<spm->n; i++) + { col = dofs[i]; dofi = dofs[i+1] - dofs[i]; - } - for(ii=0; ii<dofi; ii++, newcol++) - { - /** - * Loop on rows - */ - for(k=oldcol[i]; k<oldcol[i+1]; k++) + for(ii=0; ii<dofi; ii++, newcol++) { - j = oldrow[k-baseval]-baseval; - if ( spm->dof > 0 ) { - row = spm->dof * j; - dofj = spm->dof; - } - else { + /** + * Loop on rows + */ + for(k=oldcol[i]; k<oldcol[i+1]; k++) + { + j = oldrow[k-baseval]-baseval; row = dofs[j]; dofj = dofs[j+1] - dofs[j]; - } - for(jj=0; jj<dofj; jj++, newrow++) - { - (*newcol)++; - (*newrow) = row + jj + baseval; + for(jj=0; jj<dofj; jj++, newrow++) + { + (*newcol)++; + (*newrow) = row + jj + baseval; #if !defined(PRECISION_p) - if ( (spm->mtxtype != PastixGeneral) && - (row + jj < col + ii) ) - { - (*newval) = oldval[ cpt ]; - newval++; - } - cpt++; + if ( (spm->mtxtype != PastixGeneral) && + (row + jj < col + ii) ) + { + (*newval) = oldval[ cpt ]; + newval++; + } + cpt++; #endif + } } + (*newcol) += baseval; } - (*newcol) += baseval; } } - break; + break; case PastixCSR: case PastixIJV: free( newspm ); -- GitLab