如何从程序中设置 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 到另一个的关系
如何在线性布局中设置视图,使其适合从开始到结束的屏幕,并在一行中包含一定数量的元素?