为什么openMP会在一段时间内挂在屏障上?

时间:2017-05-16 12:57:37

标签: multithreading openmp

我已获得以下代码:

    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循环。目前还不知道之前会执行多少循环,但保证所有线程都具有相同的迭代次数。

1 个答案:

答案 0 :(得分:1)

尽管您尝试与屏障同步,但A]]]]上的竞争条件确实很容易导致迭代次数不等:

working_threads

要修复特定代码,您还必须在while-condition-check和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] 之间添加障碍。

working_threads = 0

请注意,代码并不是最惯用或最优雅的解决方案。根据您的具体工作共享问题,可能有更好的方法。此外,您必须确保#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 } } 仅由单个线程编写 - 或在编写时使用原子。