首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >num_threads与omp_set_num_threads与OMP_NUM_THREADS的区别

num_threads与omp_set_num_threads与OMP_NUM_THREADS的区别
EN

Stack Overflow用户
提问于 2014-04-02 14:01:33
回答 2查看 34.6K关注 0票数 19

对于如何指定代码并行部分中的线程数,我感到非常困惑。我知道我可以用:

  1. 环境变量OMP_NUM_THREADS
  2. 函数omp_set_num_threads(int)
  3. num_threads(int) in #pragma omp parallel for num_threads(NB_OF_THREADS)

到目前为止,我收集到的前两件事是相当的。但是第三个呢?有谁能提供一个更详细的说明差异,我找不到任何信息在互联网上的差异,1/2和3。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-02 15:34:16

OMP_NUM_THREADSomp_set_num_threads()不是等价的。环境变量仅用于设置n线程的初始值-var ICV (内部控制变量),该变量控制团队中的最大线程数。omp_set_num_threads()可用于在任何时间(当然是在任何并行区域之外)更改nthreads的值,并影响所有后续的并行区域。因此,将一个值(例如n )设置为OMP_NUM_THREADS相当于在遇到第一个并行区域之前调用omp_set_num_threads(n)

OpenMP规范中非常清楚地描述了确定并行区域中线程数量的算法,该算法可在OpenMP网站上自由获得:

如果存在a num_threads子句,则为num_threads 则让 ThreadsRequested作为num_threads子句表达式的值; else让 ThreadsRequested =nthreads的第一个元素的值;

在ICV覆盖规范的一部分中列出了不同方式设置nthreads的优先级:

num_threads子句和omp_set_num_threads()覆盖OMP_NUM_THREADS环境变量的值和nthreads ICV的第一个元素的初始值。

翻译成人类语言,即:

  • OMP_NUM_THREADS (如果存在的话)最初指定线程数;
  • omp_set_num_threads()的调用覆盖OMP_NUM_THREADS的值;
  • num_threads子句的存在覆盖了其他两个值。

实际使用的线程数量还受启用动态团队大小(通过OMP_DYNAMIC和/或omp_set_dynamic()设置dyn ICV )、线程限制-var(可通过OMP_THREAD_LIMIT设置)以及是否启用嵌套并行(OMP_NESTED / omp_set_nested())的影响。

票数 37
EN

Stack Overflow用户

发布于 2014-04-02 14:35:02

把它想象成“范围”。选项3 (num_threads)只为当前线程组设置线程数。其他选项是全局/状态设置。我通常不设置线程数,而是使用缺省值。当我改变线程的数量时,通常只在特殊情况下,所以我使用选项3,以便下次使用并行团队时,它回到全局(默认)设置。请看下面的代码。使用选项3之后,下一个线程组将返回到最后一个全局设置。

代码语言:javascript
复制
#include <stdio.h>
#include <omp.h>

int main() {
    #pragma omp parallel
    {
        #pragma omp single
        {
            printf("%d\n", omp_get_num_threads());
        }
    }
    omp_set_num_threads(8);
    #pragma omp parallel
    {
        #pragma omp single
        {
            printf("%d\n", omp_get_num_threads());
        }
    }

    #pragma omp parallel num_threads(2)
    {
        #pragma omp single
        {
            printf("%d\n", omp_get_num_threads());
        }
    }

    #pragma omp parallel
    {
        #pragma omp single
        {
            printf("%d\n", omp_get_num_threads());
        }
    }       
}

4 8 2 8

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22813923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档