cDEC$ IVDEP
The IVDEP directive assists the compiler's dependence analysis. It
can only be applied to iterative DO loops. This directive can also
be specified as INIT_DEP_FWD (INITialize DEPendences ForWarD).
The IVDEP directive takes the following form:
cDEC$ IVDEP
c Is one of the following: C (or c), !, or *.
The IVDEP directive is an assertion to the compiler's optimizer
about the order of memory references inside a DO loop.
The IVDEP directive tells the compiler to begin dependence analysis
by assuming all dependences occur in the same forward direction as
their appearance in the normal scalar execution order. This
contrasts with normal compiler behavior, which is for the
dependence analysis to make no initial assumptions about the
direction of a dependence.
The IVDEP directive must precede the DO statement for each DO loop
it affects. No source code lines, other than the following, can be
placed between the IVDEP directive statement and the DO statement:
o An UNROLL directive
o Placeholder lines
o Comment lines
o Blank lines
The IVDEP directive is applied to a DO loop in which the user knows
that dependences are in lexical order. For example, if two memory
references in the loop touch the same memory location and one of
them modifies the memory location, then the first reference to
touch the location has to be the one that appears earlier lexically
in the program source code. This assumes that the right-hand side
of an assignment statement is "earlier" than the left-hand side.
The IVDEP directive informs the compiler that the program would
behave correctly if the statements were executed in certain orders
other than the sequential execution order, such as executing the
first statement or block to completion for all iterations, then the
next statement or block for all iterations, and so forth. The
optimizer can use this information, along with whatever else it can
prove about the dependences, to choose other execution orders.
Examples:
In the following example, the IVDEP directive provides more
information about the dependences within the loop, which may enable
loop transformations to occur:
!DEC$ IVDEP
DO I=1, N
A(INDARR(I)) = A(INDARR(I)) + B(I)
END DO
In this case, the scalar execution order follows:
1. Retrieve INDARR(I).
2. Use the result from step 1 to retrieve A(INDARR(I)).
3. Retrieve B(I).
4. Add the results from steps 2 and 3.
5. Store the results from step 4 into the location indicated by
A(INDARR(I)) from step 1.
IVDEP directs the compiler to initially assume that when steps 1
and 5 access a common memory location, step 1 always accesses the
location first because step 1 occurs earlier in the execution
sequence. This approach lets the compiler reorder instructions, as
long as it chooses an instruction schedule that maintains the
relative order of the array references.