Besides calling omp_get_num_threads()
outside of the parallel region in your case, calling omp_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 variable OMP_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 of OMP_NUM_THREADS
) or for any consequent parallel region (after a call to omp_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 calling omp_set_dynamic(0)
or by setting the environment variable OMP_DYNAMIC
to false
.
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()
:
omp_set_dynamic(0); // Explicitly disable dynamic teams omp_set_num_threads(4); // Use 4 threads for all consecutive parallel regions #pragma omp parallel ... { ... 4 threads used here ... }
or with the num_threads
OpenMP clause:
omp_set_dynamic(0); // Explicitly disable dynamic teams // Spawn 4 threads for this parallel region only #pragma omp parallel ... num_threads(4) { ... 4 threads used here ... }