Skip to content

Why is the != operator not allowed with OpenMP?

An answer to this question on Stack Overflow.

Question

I was trying to compile the following code:

#pragma omp parallel shared (j)
{
   #pragma omp for schedule(dynamic)
   for(i = 0; i != j; i++)
   {
      // do something
   }
}

but I got the following error: error: invalid controlling predicate.

The OpenMP standard states that for parallel for constructor it "only" allows one of the following operators: <, <=, > >=.

I do not understand the rationale for not allowing i != j. I could understand, in the case of the static schedule, since the compiler needs to pre-compute the number of iterations assigned to each thread. But I can't understand why this limitation in such case for example. Any clues?


EDIT: even if I make for(i = 0; i != 100; i++), although I could just have put "<" or "<=" .

Answer

If I were to see the statement

for(i = 0; i != j; i++)

used instead of the statement

for(i = 0; i < j; i++)

I would be left wondering why the programmer had made that choice, never mind that it can mean the same thing. It may be that OpenMP is making a hard syntactic choice in order to force a certain clarity of code.

Here's code which raises challenges for the use of != and may help explain why it isn't allowed.

#include <cstdio>
int main(){
    int j=10;
   #pragma omp parallel for
   for(int i = 0; i < j; i++){
    printf("%d\n",i++);
   }
}

notice that i is incremented in both the for statement as well as within the loop itself leading to the possibility (but not the guarantee) of an infinite loop.

If the predicate is < then the loop's behavior can still be well-defined in a parallel context without the compiler having to check within the loop for changes to i and determining how those changes will affect the loop's bounds.

If the predicate is != then the loop's behavior is no longer well-defined and it may be infinite in extent, preventing easy parallel subdivision.