Content deleted Content added
cleanup templates |
m Task 70: Update syntaxhighlight tags - remove use of deprecated <source> tags |
||
Line 10:
A well behaved loop is normally of the form:
<
for ( i = 0; i < MAX; i++ )
a[i] = b[i] + 5;
</syntaxhighlight>
Because the increment is unitary and constant, it's very easy to see that, if both ''a'' and ''b'' are bigger than MAX, this loop will never access memory outside the allocated range.
Line 23:
A simple example, where it doesn't start at the beginning and increments by more than one:
<
// Example 1
for ( i = 7; i < MAX; i+=3 )
a[i] = b[i] + 5;
</syntaxhighlight>
A more complicated example, with an additional exit condition:
<
// Example 2
for ( i = 7; i < MAX || i > MIN; i+=3 )
a[i] = b[i] + 5;
</syntaxhighlight>
Loops can also have non-predictable behavior during compilation time, where the exit condition depends on the contents of the data being modified:
<
// Example 3
for ( i = 7; i < MAX && a[i]; i+=3 )
a[i] = b[i] + 5;
</syntaxhighlight>
Or even dynamic calculations by means of function calls:
<
// Example 4
for ( i = start(); i < max(); i+=increment() )
a[i] = b[i] + 5;
</syntaxhighlight>
Reverse loops are also very simple, and can be easily normalized:
<
// Example 5
for ( i = MAX; i > 0; i-- )
a[i] = b[i] + 5;
</syntaxhighlight>
===Converting to a normalized loop===
Line 65:
If the non-normalized doesn't have dynamic behaviour, it's normally very easy to transform it to a normalized one. For instance, the first example (Example 1) above can easily be converted to:
<
// Example 1 -> normalized
for ( i = 0; i < (MAX-7)/3; i++ )
a[i*3+7] = b[i*3+7] + 5;
</syntaxhighlight>
While the third example can be partially normalized to allow some parallelization, but still lack the ability to know the loop span (how many iterations there will be), making it harder to vectorize by using multi-media hardware.
Line 77:
The reverse loop (Example 5) is also easy to normalize:
<
// Example 5 -> normalized
for ( i = 0; i < MAX; i++ )
a[MAX-i] = b[MAX-i] + 5;
</syntaxhighlight>
Note that the access is still backwards. In this case, it makes no sense to leave it backwards (as there is no [[data dependence]]), but where dependences exist, caution must be taken to revert the access as well, as it could disrupt the order of assignments.
|