【问题标题】:How can I set the number of OpenMP threads from within the program?如何从程序中设置 OpenMP 线程的数量?
【发布时间】: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 线程的数量?

【问题讨论】:

    标签: c++ c linux multithreading 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 将解决此问题。
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多