dominique gorissen
dominique gorissen

Reputation: 31

warning #2901: [omp] OpenMP is not active; all OpenMP directives will be ignored

I'm currently trying to use OpenMP for parallel computing. I've written the following basic code. However it returns the following warning:

warning #2901: [omp] OpenMP is not active; all OpenMP directives will be ignored.

Changing the number of threads does not change the required running time since omp.h is ignored for some reason which is unclear to me.

Can someone help me out?

#include <stdio.h>
#include <omp.h>
#include <math.h>

int main(void)
{
    double ts;
    double something;
    clock_t begin = clock();

    #pragma omp parallel num_threads(4)
    #pragma omp parallel for

    for (int i = 0; i<pow(10,7);i++)
    {
        something=sqrt(123456);
    }

    clock_t end = clock();
    ts = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("Time elpased is %f seconds", ts);
}

Upvotes: 3

Views: 451

Answers (2)

dreamcrash
dreamcrash

Reputation: 51643

Aside from the obvious having to compile with -fopenmp flag your code has some problem worth pointing out, namely:

To measure time use omp_get_wtime() instead of clock() (it will give you the number of clock ticks accumulated across all threads).

The other problem is:

#pragma omp parallel num_threads(4)
#pragma omp parallel for

for (int i = 0; i<pow(10,7);i++)
{
    something=sqrt(123456);
}

the iterations of the loop are not being assigned to threads as you wanted. Because you have added again the clause parallel to #pragma omp for, and assuming that you have nested parallelism disabled, which by default it is, each of the threads created in the outer parallel region will execute "sequentially" the code within that region. Consequently, for a n = 6 (i.e., pow(10,7) = 6) and number of threads = 4, you would have the following block of code:

for (int i=0; i<n; i++) {
   something=sqrt(123456);
}

being executed 6 x 4 = 24 times (i.e., the total number of loop iterations multiple by the total number of threads). For a more in depth explanation check this SO Thread about a similar issue. Nevertheless, the image below provides a visualization of the essential:

enter image description here

To fix this adapt your code to the following:

#pragma omp parallel for num_threads(4)
for (int i = 0; i<pow(10,7);i++)
{
    something=sqrt(123456);
}

Upvotes: 2

永劫回帰
永劫回帰

Reputation: 692

In order to get OpenMP support you need to explicitly tell your compiler.

  • g++, gcc and clang need the option -fopenmp
  • mvsc needs the option /openmp (more info here if you use visual studio)

Upvotes: 4

Related Questions