Search code examples
openmp

OpenMP actual number of threads


The below code is based on the video tutorials by Tim Mattson on YouTube. I would like to find out the number of threads I actually receive when calling parallel (it is possible that I have requested 256 threads but only ended up with 8). The usual omp_get_num_threads() does not work with the below (if I wanted to create a code block I get an expected a for loop following OpenMP 'directive' directive error):

    void pi_with_omp() {
    int i;
    double x, pi, sum = 0.0;
    double start_time, run_time;

    step = 1.0 / (double)num_steps;

    omp_set_num_threads(NUM_THREADS);
    start_time = omp_get_wtime();


    #pragma omp parallel for reduction(+:sum) private(x)
        for (i = 0; i < num_steps; i++) {
            x = (i + 0.5) * step;
            sum += 4.0 / (1.0 + x * x);
        }

    pi = step * sum;
    run_time = omp_get_wtime() - start_time;
    printf("\n pi with %ld steps is %lf in %lf seconds", num_steps, pi, run_time); 
    }

The only way I have found is to rewrite the above pragma and dissect it into two like the following:

    int nthreads;
    #pragma omp parallel
    {
        double x;
        int id, nthrds;
        id = omp_get_thread_num();
        nthrds = omp_get_num_threads();
        if (id == 0) nthreads = nthrds;
        #pragma omp for reduction(+:sum)
            for (i = 0; i < num_steps; i++) {
                x = (i + 0.5) * step;
                sum = sum + 4.0 / (1.0 + x * x);
            }
     }

Which does the job but is not pretty. Has anyone got a better solution?


Solution

  • You can simplify your code, but you will still need to separate the parallel and the for.

    int nthreads;
    #pragma omp parallel 
    {  
    #pragma omp single nowait
        nthreads = omp_get_num_threads();
    #pragma omp for reduction(+:sum)
        for (i = 0; i < num_steps; i++) {
            double x = (i + 0.5) * step;
            sum = sum + 4.0 / (1.0 + x * x);
        }
    }