我有一个代码:
#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) 的情况下使我的代码正常工作? (当我放这个时它也有效)
最佳答案
屏障用于同步团队中的所有线程。所有到达的线程都将被阻塞,直到所有线程都到达屏障。然后,也只有这样,他们才能继续下去。
因此,为了让程序终止,所有线程在其生命周期中都必须达到相同数量的屏障。如果一个线程比其他线程具有更多的屏障,则该线程永远无法通过其额外的屏障,因为它将等待其他线程 - 而其他线程永远不会到达那里,因为它们没有额外的屏障。
函数 func
中有一个屏障,该函数在并行循环的每次迭代中都会执行一次。由于由 OpenMP 将这些迭代分配给线程,因此并非所有线程都可能收到相同数量的迭代(在您的情况下,对于线程数 2,它们确实收到相同的数量 - 每个线程一次迭代,这就是您的程序的原因然后终止)。数量不等的障碍会阻碍您的程序。
确保仅在您知道所有线程执行频率相同的地方放置屏障。
关于openmp - omp 障碍被阻挡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30720861/