
This term is part of the glossary of the open catalog of best practice rules for performance that is automatically detected and reported by Codee.
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;
…
}

Building performance into the code from day one with Codee