Skip to main content

OpenMP canonical form

OpenMP pragmas can be applied only to loops in OpenMP canonical form. For a loop to be in a canonical form, it must have the following properties:

  • It must be a for loop.

  • The iterator variable is of int, pointer, or iterator type.

  • The iterator variable remains unmodified throughout the body of the iteration.

  • The iterator variable changes only within the for clause and the change is iteration invariant.

  • The limit on the iterator variable is an iteration invariant.

  • The body of the iteration does not transfer control outside itself.

Example of loops not in canonical form:

// Not a for loop
while(*p != 0) {
p++;
}

// Modifies the iterator variable in the loop body
for (int i = 0; i < n; i++) {
if (b[i] == 0) {
i++;
} else {
// ...
}
}

// Iterator variable changes unpredictably
for (int i = 0; i < n; i+= inc) {
// ...
if (b[i] == 0) {
inc = 1;
} else {
inc = 2;
}
}

// The limit on the iterator variable changes
for (int i = 0; i < n; i++) {
// ...
if (b[i] == 0) {
n++;
}
}

// Transfer of control outside of the loop
for (int i = 0; i < n; i++) {
if (b[i] ==0) break;
// ...
}