Search code examples
c++openmp

OMP for loop condition not a simple relational comparison


I have this program that isn't compiling due to error: condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i', referring to for (size_t i = 2; i * i <= n; i++). How can I modify and fix it without affecting performance? Is this an issue due to having an old OpenMP version? (Because I remember having a different issue before on another computer with an older version that is resolved now.)

#include <iostream>
#include <cstdio>

int main(int argc, char **argv)
{
    if (argc != 2)
        return EXIT_FAILURE;
    size_t n;
    if (sscanf(argv[1], "%zu", &n) == 0)
        return EXIT_FAILURE;
    auto *prime = new size_t[n + 1];
    for (size_t i = 2; i <= n; i++)
        prime[i] = i;
    #pragma omp parallel for
    for (size_t i = 2; i * i <= n; i++)
        for (size_t j = i * i; j <= n; j += i)
            prime[j] = 0;
    size_t N = 0;
    for (size_t i = 2; i <= n; i++)
        if (prime[i] != 0)
            N++;
    std::cout << N << '\n';
}

Solution

  • Loop after the #pragma omp parallel for have to be a canonical form to be confirming. In your case the problem is with the test expression, which should be one of the following:

    var relational-op b
    b relational-op var
    

    So, you have to use what was suggested by @Yakk: calculate the sqrt of n and compare it to i:

    const size_t max_i=sqrt(n);
    #pragma omp parallel for
      for (size_t i = 2; i <= max_i; i++)
      ....