2

我有一个代码:

#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 in for 更改为 8,它可以工作。但我想在我的 for 循环中有 2 个。

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

4

1 回答 1

3

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

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

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

确保仅在您知道所有线程将同样频繁地执行它的地方放置障碍。

于 2015-06-10T09:28:53.353 回答