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

Posted

技术标签:

【中文标题】如何从程序中设置 OpenMP 线程的数量?【英文标题】:How can I set the number of OpenMP threads from within the program? 【发布时间】:2014-12-05 15:46:25 【问题描述】:

运行程序

$ OMP_NUM_THREADS=4 ./a.out   

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

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

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

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

【问题讨论】:

【参考方案1】:

有两种方法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(强调我的)对此进行了介绍:

第四章

环境变量

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


1) 第三个运行时选项允许通过将其重置为1(仅限主线程)或到来自num_threads 子句或omp_set_num_threads 调用的号码,这是子句所属指令中的if 子句。

【讨论】:

谢谢!你知道为什么 setenv 没有任何效果吗? 嗨 Piotr Skotnicki,我一直在尝试应用这里提到的两种解决方案将 OpenMP 线程数设置为 1。当我设置环境变量 OMP_NUM_THREADS=1 时,程序被限制为一个线程.但是当我将上述解决方案添加到程序主函数的顶部时,我仍然会运行多个线程。有什么我做错了吗??。 啊,这是一个 OpenBlas 问题。设置 OMP_NUM_THREADS 也会设置 OPENBLAS_NUM_THREADS。如果问题在于 OpenBlas 生成多个线程而不是 OpenMP,那么使用 github.com/bgeneto/build-install-compile-openblas 再次构建 OpenBlas 将解决此问题。

以上是关于如何从程序中设置 OpenMP 线程的数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的 NSManagedObjectContext 中设置从一个 NSManageObject 到另一个的关系

如何在线性布局中设置视图,使其适合从开始到结束的屏幕,并在一行中包含一定数量的元素?

在 CLion 中设置 OpenMP 项目 MacOS Mojave

如何修复 OpenMP 程序的 gdb 运行中的线程数

python中设置线程池最大数量不管用

从库 C++ 中设置环境变量