Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 280
  • Last Modified:

loop merging

hello everybody
     i have got a question for u , its very simple, can u suggest me different ways to merge the loop in the below programm. i want to elinimate the       z[320] or do indexing with three loops given



const double* C = Coefficients;  \*constant coeff*/
int i,j;
float   X[320];
double   Z[320];
double   realAccu;
for ( i=0; i<320; i++ )
{
    Z[i] = X[i] * C[2*i];
}
      
      /* create array Y */
      for ( i=0; i<64; i++ ) {
            realAccu = 0.0;
      }
            for ( j=0; j<5; j++ ) {
                  realAccu = realAccu + Z[i + j * 64];
            
            Y[i] = realAccu;
      }



0
san_ys
Asked:
san_ys
1 Solution
 
avizitCommented:
for ( i=0; i<64; i++ ) {
          realAccu = 0.0;
}

the above is unnecessary you are just assigning 0.0 to realAccu 64 times
you can just replace the above for loop with

realAccu = 0.0
0
 
sunnycoderCommented:
Hi san_ys,

Your requirements are not very clear. Arrays Z and X are uninitialized when you use them. As Abhijit pointed out, one of the loops is redundant.

>i want to elinimate the       z[320] or do indexing with three loops given
You mean you wish to eliminate array Z from calculations or the just the loop which initializes Z (the initialization might be incorrect since X is uninitialized). Also, I am not sure what you mean by "do indexing with three loops given"
0
 
stefan73Commented:
Hi san_ys,
It looks like the loop scopes are not correct. You probably meant to have the last two loops nested, like:

     /* create array Y */
     for ( i=0; i<64; i++ ) {
          realAccu = 0.0;
          for ( j=0; j<5; j++ )
               realAccu = realAccu + Z[i + j * 64];
         
          Y[i] = realAccu;
     }

The inner loop should be eliminated (loop unrolling) by the compiler, but you can also do that manually:

     /* create array Y */
     for ( i=0; i<64; i++ ) {
          Y[i] = Z[i] + Z[64+i] + Z[128+i] + Z[192+i] + Z[256+i];
     }

...that's a matter of personal preference. If you feel that the algorithm is expressed more clearly with two nested loops, fine. A good compiler should create identical code in both cases.

You can also eliminate the creation of your Z array - its values are only used once. That's probably done best with a macro:

#define Z(i) (X[i] * C[2*(i)])

Then you can write

     /* create array Y */
     for ( i=0; i<64; i++ ) {
          Y[i] = Z(i) + Z(64+i) + Z(128+i) + Z(192+i) + Z(256+i);
     }
...ending up with a single loop.

Did you initialize the X array with some values?


Cheers!

Stefan
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now