Skip to content

Latest commit

 

History

History
59 lines (46 loc) · 1.16 KB

OpenMP-canonical-form.md

File metadata and controls

59 lines (46 loc) · 1.16 KB

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;
  // ...
}