以
运行程序$ OMP_NUM_TRHEADS=4 ./a.out
将活动的OpenMP线程数限制为4,htop
证明了这一点。但是,如果不是在OMP_NUM_THREADS
中绑定Bash
环境变量,而是调用
setenv("OMP_NUM_THREADS", "4", 1);
来自main
,在调用任何启用OpenMP的函数之前,这似乎没有效果。
为什么会这样?如果可能的话,如何在程序中设置OpenMP线程的数量?
答案 0 :(得分:3)
有两种方法 1 可以用来设置程序中的线程数:
在打开并行区域的指令中使用num_threads
子句:
#pragma omp parallel num_threads(number_of_threads)
在并行区域开始之前使用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
子句。