• Status: Solved
• Priority: Medium
• Security: Public
• Views: 295

# 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
1 Solution

Commented:
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

Commented:
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

Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.