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

Max*_*axB 5 c c++ linux multithreading openmp

运行程序为

$ OMP_NUM_TRHEADS=4 ./a.out
Run Code Online (Sandbox Code Playgroud)

将激活的OpenMP线程数限制为4,如所示htop。但是,如果不是将OMP_NUM_THREADS环境变量绑定到中Bash,则调用

setenv("OMP_NUM_THREADS", "4", 1);
Run Code Online (Sandbox Code Playgroud)

main调用任何启用OpenMP的功能开始之前,这似乎没有任何效果。

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

Pio*_*cki 7

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

选项1

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

#pragma omp parallel num_threads(number_of_threads)
Run Code Online (Sandbox Code Playgroud)

选项#2

并行区域开始之前使用omp_set_num_threadsAPI 函数:

#include <omp.h>

// ...
omp_set_num_threads(number_of_threads);
#pragma omp parallel
Run Code Online (Sandbox Code Playgroud)

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

为什么 setenv 没有任何效果?

这在OpenMP 规范(重点是我的)中有介绍:

第 4 章

环境变量

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


1)还有第三个运行时选项,它允许改变执行并行区域的线程数,然后将其重置为1(仅限主线程)或 fromnum_threads子句或omp_set_num_threads调用的数量,这是if指令中的子句条款属于。