I am writing a parallel program using OpenMP in C++.
I want to control the number of threads in the program using omp_set_num_threads()
, but it does not work.
#include <iostream>
#include <omp.h>
#include "mpi.h"
using namespace std;
int myrank;
int groupsize;
double sum;
double t1,t2;
int n = 10000000;
int main(int argc, char *argv[])
{
MPI_Init( &argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
MPI_Comm_size(MPI_COMM_WORLD,&groupsize);
omp_set_num_threads(4);
sum = 0;
#pragma omp for reduction(+:sum)
for (int i = 0; i < n; i++)
sum+= i/(n/10);
cout<<"sum="<<sum<<endl;
cout<<"threads="<<omp_get_num_threads()<<endl;
MPI_Finalize();
return 0;
}
The program outputs:
sum = 4.5e+007
threads=1
How to control the number of threads?
Try setting your num_threads inside your omp parallel code, it worked for me. This will give output as 4
The
omp_get_num_threads()
function returns the number of threads that are currently in the team executing the parallel region from which it is called. You are calling it outside of the parallel region, which is why it returns1
.According to the GCC manual for omp_get_num_threads:
So this:
Should be changed to something like:
The code I use follows Hristo's advice of disabling dynamic teams, too.
Besides calling
omp_get_num_threads()
outside of the parallel region in your case, callingomp_set_num_threads()
still doesn't guarantee that the OpenMP runtime will use exactly the specified number of threads.omp_set_num_threads()
is used to override the value of the environment variableOMP_NUM_THREADS
and they both control the upper limit of the size of the thread team that OpenMP would spawn for all parallel regions (in the case ofOMP_NUM_THREADS
) or for any consequent parallel region (after a call toomp_set_num_threads()
). There is something called dynamic teams that could still pick smaller number of threads if the run-time system deems it more appropriate. You can disable dynamic teams by callingomp_set_dynamic(0)
or by setting the environment variableOMP_DYNAMIC
tofalse
.To enforce a given number of threads you should disable dynamic teams and specify the desired number of threads with either
omp_set_num_threads()
:or with the
num_threads
OpenMP clause:I was facing the same problem . Solution is given below
Right click on Source Program > Properties > Configuration Properties > C/C++ > Language > Now change Open MP support flag to Yes....
You will get the desired result.