首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMP omp_get_num_threads() V.S. omp_get_max_threads()

OpenMP omp_get_num_threads() V.S. omp_get_max_threads()
EN

Stack Overflow用户
提问于 2019-12-21 09:14:48
回答 1查看 2.6K关注 0票数 2

我不理解omp_get_num_threads()和omp_get_max_threads()之间的区别。我复制演示代码如下所示。

代码语言:javascript
复制
    omp_set_nested(1);
    omp_set_max_active_levels(10);
    omp_set_dynamic(0);
    omp_set_num_threads(2);
    #pragma omp parallel 
    {
        omp_set_num_threads(3);

        #pragma omp parallel
        {
            omp_set_num_threads(4);
            #pragma omp single
            {
                std::cout << omp_get_max_active_levels() << " " << omp_get_num_threads() << " " 
                << omp_get_max_threads() << std::endl;
            }
        }

        #pragma omp barrier
        #pragma omp single 
        {
            std::cout << omp_get_max_active_levels() << " " << omp_get_num_threads() << " " 
                << omp_get_max_threads() << std::endl;
        }
    }

然后我得到了以下输出。

代码语言:javascript
复制
10 3 4
10 3 4
10 3 4
10 3 3

我已经检查了正式文件,但我仍然对此感到困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-22 03:26:07

来自文件:

omp_get_num_threads

-- omp_get_num_threads例程返回执行例程区域绑定到的parallel区域的团队中的线程数。如果从程序的顺序部分调用,则此例程返回1。

omp_get_max_threads

omp_get_max_threads返回的值是当前任务的nthreads ICV的第一个元素的值。如果在此例程执行返回后遇到没有num_threads子句的并行区域,则该值也是可用于组成一个新团队的线程数的上限。

下图说明了线程的流程。您的输出可能不正确,我不能用clang+libomp或gcc+libGOMP复制它。

如果没有同时指定线程数,omp_get_max_threads总是返回新的parallel构造可以创建的线程数。当在内部并行区域在omp_set_num_threads上设置4时,可以创建的新的不同线程的最大数量为4,但在该区域3中正在使用。对于外部平行区域,最大值为3,2在使用中。

在串行代码中,在任何实用程序中,线程数为1,但如果不通过omp_set_num_threadsOMP_NUM_THREADS环境变量更改,则最大线程数是系统的默认值(通常是内核数)。

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

https://stackoverflow.com/questions/59434959

复制
相关文章

相似问题

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