两个不同的pragma for-s在它们之间有一个障碍

时间:2017-11-09 00:15:51

标签: c openmp barrier

有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

2 个答案:

答案 0 :(得分:2)

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

不需要来发布明确的pragma omp barrier

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

  

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

答案 1 :(得分:2)

阿齐兹的回答是正确但不完整。

#pragma omp for

没有parallel仍然完全正常。

OpenMP中的任何工作共享构造(包括循环构造omp for)在最后都有一个隐含障碍。可以使用nowait子句禁用此功能。

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