Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set number of threads using omp_set_num_threads() to 2, but omp_get_num_threads() returns 1

Tags:

I have the following C/C++ code using OpenMP:

    int nProcessors=omp_get_max_threads();     if(argv[4]!=NULL){         printf("argv[4]: %s\n",argv[4]);         nProcessors=atoi(argv[4]);         printf("nProcessors: %d\n",nProcessors);     }     omp_set_num_threads(nProcessors);     printf("omp_get_num_threads(): %d\n",omp_get_num_threads());     exit(0); 

As you can see, I'm trying to set the number of processors to use based on an argument passed on the command line.

However, I'm getting the following output:

argv[4]: 2   //OK nProcessors: 2   //OK omp_get_num_threads(): 1   //WTF?! 

Why isn't omp_get_num_threads() returning 2?!!!


As has been pointed out, I'm calling omp_get_num_threads() in a serial region, hence the function returns 1.

However, I have the following parallel code:

#pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected)     for(i=0;i<fileLen-CHUNKSIZE;i++){         tid=omp_get_thread_num();         printf("%d\n",tid);         int nThreads=omp_get_num_threads();         printf("%d\n",nThreads); ... 

which outputs:

0   //tid 1   //nThreads - this should be 2! 0 1 0 1 0 1 ... 
like image 944
Eamorr Avatar asked Jan 23 '12 09:01

Eamorr


1 Answers

The omp_get_num_threads() call returns 1 in the serial section of the code. See Link

So you need to have parallel code to get the correct value, here how your code should look like:

#include <iostream> #include <omp.h>  int main (int argc, const char * argv[]) {     int nProcessors = omp_get_max_threads();      std::cout<<nProcessors<<std::endl;      omp_set_num_threads(nProcessors);      std::cout<<omp_get_num_threads()<<std::endl;  #pragma omp parallel for      for(int i = 0; i < 5; i++){         int tid = omp_get_thread_num();         std::cout<<tid<<"\t tid"<<std::endl;         int nThreads = omp_get_num_threads();         std::cout<<nThreads<<"\t nThreads"<<std::endl;     }      exit(0); } 

This code produces:

2

1 0    tid 2    nThreads 0    tid 2    nThreads 0    tid 2    nThreads 1    tid 2    nThreads 1    tid 2    nThreads 

It seems that you have either open mp not enabled or your loop is not in the form that can be parallized by openmp

like image 128
tune2fs Avatar answered Jan 02 '23 14:01

tune2fs