openmp - omp 障碍被阻挡

标签 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) 的情况下使我的代码正常工作? (当我放这个时它也有效)

最佳答案

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

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

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

确保仅在您知道所有线程执行频率相同的地方放置屏障。

关于openmp - omp 障碍被阻挡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30720861/

相关文章:

c++ - OMP - 线程数多于处理器数?

multithreading - 测量多线程应用程序的带宽

memory - NDIS 自旋锁是否充当 DMA 的内存屏障?

arm - ARM中障碍(DSB,DMB,ISB)的实际使用案例

c++ - 并行内的 set_num_threads 不起作用

c++ - 使用 g++ 编译 OpenMP 时未知编译指示

operating-system - 修改为 "Implementing an N process barrier using semaphores"

multithreading - 如何使用 posix 信号量实现屏障?

r - R 和 RcppArmadillo 中的 OpenMP 支持

go - 如何等待多个 goroutine 完成?