| OPENMP API Specification: "Version 5.2 -- GIT rev 95b2e3a44"

4.4.2  OpenMP Loop-Iteration Spaces and Vectors

A loop-associated directive controls some number of the outermost loops of an associated loop nest, called the associated loops, in accordance with its specified clauses. These associated loops and their loop iteration variables form an OpenMP loop-iteration space. OpenMP loop-iteration vectors allow other directives to refer to points in that loop-iteration space.

A loop transformation construct that appears inside a loop nest is replaced according to its semantics before any loop can be associated with a loop-associated directive that is applied to the loop nest. The depth of the loop nest is determined according to the loops in the loop nest, after any such replacements have taken place. A loop counts towards the depth of the loop nest if it is a base language loop statement or generated loop and it matches loop-nest while applying the production rules for canonical loop nest form to the loop nest.

The canonical loop nest form allows the iteration count of all associated loops to be computed before executing the outermost loop.

For any associated loop, the iteration count is computed as follows:

The behavior is unspecified if any intermediate result required to compute the iteration count cannot be represented in the type determined above.

No synchronization is implied during the evaluation of the lb, ub, incr or range-expr expressions. Whether, in what order, or how many times any side effects within the lb, ub, incr, or range-expr expressions occur is unspecified.

Let the number of loops associated with a construct be n. The OpenMP loop-iteration space is the n-dimensional space defined by the values of vari, 1  i  n, the iteration variables of the associated loops, with i = 1 referring to the outermost loop of the loop nest. An OpenMP loop-iteration vector, which may be used as an argument of OpenMP directives and clauses, then has the form:

var1 [± offset1], var2 [± offset2],, varn [± offsetn]

where offseti is a compile-time constant non-negative OpenMP integer expression that facilitates identification of relative points in the loop-iteration space.

The iterations of some number of associated loops can be collapsed into one larger iteration space that is called the logical iteration space. The particular integer type used to compute the iteration count for the collapsed loop is implementation defined, but its bit precision must be at least that of the widest type that the implementation would use for the iteration count of each loop if it was the only associated loop. OpenMP defines a special loop-iteration vector, omp_cur_iteration, for which offseti = 0 i. This loop-iteration vector enables identification of relative points in the logical iteration space as:

omp_cur_iteration [± logical_offset]

where logical_offset is a compile-time constant non-negative OpenMP integer expression.

For directives that result in the execution of a collapsed logical iteration space, the number of times that any intervening code between any two loops of the same logical iteration space will be executed is unspecified but will be the same for all intervening code at the same depth, at least once per iteration of the loop that encloses the intervening code and at most once per logical iteration. If the iteration count of any loop is zero and that loop does not enclose the intervening code, the behavior is unspecified.