首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么openMP会在一段时间内停留在障碍上呢?

为什么openMP会在一段时间内停留在障碍上呢?
EN

Stack Overflow用户
提问于 2017-05-16 12:57:37
回答 1查看 427关注 0票数 0

我有以下代码:

代码语言:javascript
复制
    int working_threads=1;
#pragma omp parallel
    {   
        int my_num=omp_get_thread_num()+1;
        int idle=false;
        while(working_threads>0) {
            if(my_num==1)
                working_threads=0;
#pragma omp barrier                                                                                                                       
        }   
    }

如果我运行它,它不时挂在屏障上。线程越多,这种情况就越有可能发生。我试着用printf调试它,似乎有时并不是所有的线程都被执行,因此屏障将永远等待它们。这种情况发生在第一次迭代中,显然第二次迭代永远不会运行。

这是一段无效的代码吗?如果是的话,我怎样才能改变它呢?我需要并行运行一个while循环。以前不知道将执行多少个循环,但是可以保证所有线程都有相同的迭代次数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-16 13:10:41

尽管您试图与屏障同步,但在working_threads上确实存在一个竞赛条件,很容易导致不相等的迭代量:

代码语言:javascript
复制
thread 0                             | thread 1
...                                  | ...
while (working_threads > 0) [==true] | ...
    if (my_num == 1) [==true]        | ...
        working_threads = 0          | ...
                                     | while (working_threads > 0) [==false]
    [hangs waiting for barrier]      | [hangs trying to exit from parallel]

要修复特定的代码,还必须在while条件检查和working_threads = 0之间添加一个屏障。

代码语言:javascript
复制
#pragma omp parallel
    {   
        int my_num=omp_get_thread_num()+1;
        int idle=false;
        while(working_threads>0) {
#pragma omp barrier      
            if(my_num==1)
                working_threads=0;
#pragma omp barrier                                                                                                                       
        }   
    }

请注意,代码并不是最惯用或最优雅的解决方案。根据您的具体工作分担问题,可能有更好的方法。另外,您必须确保worker_threads只由单个线程编写--或者在编写时使用atomics。

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

https://stackoverflow.com/questions/44002149

复制
相关文章

相似问题

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