omp障碍正在阻塞

时间:2015-06-08 23:50:59

标签: openmp barrier

我有一个代码:

#include <stdio.h>
#include <omp.h>

static void func()
{
    char t[30];
    sprintf(t,"%d %d\n",omp_get_num_threads(),omp_get_thread_num());
    write(1,t,strlen(t));
    write(1,"checkpoint 1\n",13);
    #pragma omp barrier 
    write(1,"checkpoint 2\n",13);
    #pragma omp barrier
    write(1,"checkpoint 3\n",13);
    #pragma omp barrier
    write(1,"checkpoint 4\n",13);
}

int main()
{
    int i;
#pragma omp parallel for
    for(i=0;i<2;i++)
    {
       func();
    }
} 

和输出:

8 1
8 0
checkpoint 1
checkpoint 1
checkpoint 2
checkpoint 2
[here my program blocks].

如果我将2改为8,则可行。但我希望在我的for循环中有2个。

如何在循环之前不使用omp_set_num_threads(2)使我的代码正常工作? (当我把它放进去时它也有效)

1 个答案:

答案 0 :(得分:2)

障碍用于同步团队中的所有线程。所有到达的线程将被阻塞,直到所有线程都到达屏障。然后,只有这样,他们才能继续。

因此,为了让您的程序终止,所有线程在其生命中必须达到相同数量的障碍。如果一个线程比其他线程有更多的障碍,那么该线程永远不能通过它的额外障碍因为它将等待其他线程 - 这将永远不会到达那里因为它们没有那个额外的障碍。

你在函数func中有一个障碍,它在你的并行循环的每次迭代中执行一次。由于OpenMP将这些迭代分配给线程,因此并非所有迭代都可以接收相同数量的迭代(在您的情况下,对于每个线程,线程数为2时,它们会收到相同的数字 - 一次迭代,这就是你的程序终止的原因)。不等数量的障碍阻碍了你的计划。

确保仅在您知道所有线程将经常执行它的地方放置障碍。