如何在程序中设置OpenMP线程的数量?

时间:2014-12-05 15:46:25

标签: c++ c linux multithreading openmp

运行程序
$ OMP_NUM_TRHEADS=4 ./a.out

将活动的OpenMP线程数限制为4,htop证明了这一点。但是,如果不是在OMP_NUM_THREADS中绑定Bash环境变量,而是调用

setenv("OMP_NUM_THREADS", "4", 1);

来自main,在调用任何启用OpenMP的函数之前,这似乎没有效果。

为什么会这样?如果可能的话,如何在程序中设置OpenMP线程的数量?

1 个答案:

答案 0 :(得分:3)

有两种方法 1 可以用来设置程序中的线程数:

选项#1

在打开并行区域的指令中使用num_threads子句:

#pragma omp parallel num_threads(number_of_threads)

选项#2

在并行区域开始之前使用omp_set_num_threads API函数

#include <omp.h>

// ...
omp_set_num_threads(number_of_threads);
#pragma omp parallel

注意:两个选项都优先于OMP_NUM_THREADS环境变量,但num_threads子句优先于omp_set_num_threads

  

为什么setenv没有任何效果?

OpenMP specification(强调我的):

  

第4章

     

环境变量

     

[...]程序启动后对环境变量的修改,即使由程序本身修改,也会被OpenMP实现忽略。但是,通过使用适当的指令子句或OpenMP API例程,可以在执行OpenMP程序期间修改某些ICV的设置。 [...]


1)还有第三个运行时选项允许通过将其重置为1来改变执行并行区域的线程数(仅限主线程) )或来自num_threads子句或omp_set_num_threads调用的数字,这是该子句所属的指令中的if子句。