【问题标题】:Do two different pragma for-s have a barrier between them两个不同的 pragma for-s 之间是否有障碍
【发布时间】:2018-04-21 20:38:54
【问题描述】:

有 8 个城市。我们对每个城市的不同统计数据进行计算。

我需要知道在 for 循环结束时是否存在障碍,以便在完成所有其他之前城市的统计数据后开始下一组计算。

一定是这样,因为每次计算都依赖于前一次计算。

#pragma omp for
for (int i = 0; i < count; ++i)
{
    // calculate stats about population
}

// is there a barrier in here?
// Or do I need an explicit barrier
// #pragma omp barrier

#pragma omp for
for (int i = 0; i < count; ++i)
{
    // calculate stats about cars 
}

// is there a barrier in here?

#pragma omp for
for (int i = 0; i < count; ++i)
{
    // calculate stats about weather 
}

// ...same idea

【问题讨论】:

  • 假设你的意思是#pragma omp parallel for,是的,在循环结束时有一个隐含的障碍来等待所有线程完成。只有一个线程会继续执行流程,直到下一个#pragma ...
  • 所以我不需要在每个 for 循环之后设置一个明确的屏障?好的。您应该将其发布为答案。

标签: c openmp barrier


【解决方案1】:

是的,如果您使用#pragma omp parallel for,您将在循环结束时有一个隐式屏障,等待所有线程完成后再继续执行。

不需要放置明确的pragma omp barrier

根据OpenMP 4.0 Complete Specifications(1.3第10行):

遇到的线程正在执行的任务的任务区域 被挂起,新团队的每个成员都执行其隐含的 任务。 并行结束时存在隐式障碍 构造。

【讨论】:

    【解决方案2】:

    Aziz 的答案正确但不完整。

    #pragma omp for
    

    没有parallel 仍然很好。

    OpenMP 中的任何工作共享构造(包括循环构造omp for)在末尾都有一个隐式屏障。这可以通过nowait 子句禁用。

    没有必要使用omp parallel for,由于增加了线程管理开销,这也是不可取的。

    【讨论】:

    • 我知道上面的代码在#pragma omp parallel 子句中。但是,感谢nowait 子句。
    • 是的,我明白您的代码是within 一个并行结构。请注意,Aziz 的回答明确地仅指 #pragma omp parallel for - 这不是您使用的。但是你也可以只使用omp for...
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2021-06-08
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多