有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
答案 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
,由于线程管理开销增加,这也是不可取的。