在omp临界区之后是否存在隐含的障碍

时间:2012-05-04 06:08:58

标签: c++ openmp

在omp关键部分之后是否存在隐含的omp障碍

例如,我可以将以下代码版本-1修改为版本-2。

版本-1

int min = 100;
#pragma omp parallel
{
   int localmin = min;

   #pragma omp for schedule(static)
   for(int i = 0; i < 1000; i++)
       localmin = std::min(localmin, arr[i]);

   #pragma omp critical
   {
      min = std::min(localmin, min)
   }
}

版本-2

int min = 100;
#pragma omp parallel
{
   int localmin = min;

   #pragma omp for schedule(static) nowait
   for(int i = 0; i < 1000; i++)
       localmin = std::min(localmin, arr[i]);

   #pragma omp critical
   {
      min = std::min(localmin, min)
   }
} // will I get the right "min" after this (because I have included nowait)

我是否会为版本1和版本2获得相同的结果?

omp关键区域后是否存在隐含障碍?

编辑:很抱歉,如果示例很差..另外,我想知道版本1和版本2之间是否存在任何性能差异

2 个答案:

答案 0 :(得分:13)

关键部分既没有障碍,也没有障碍,无论是在起点还是在终点。关键部分本身就是一个同步化构造,它可以防止多个线程同时访问相同的数据。如果您希望在退出并行区域之前拥有正确的全局最小值,则需要在临界区后添加一个额外的障碍。正如已经说过的那样,平行区域最后有一个隐含的障碍。

答案 1 :(得分:0)

如果存在大量迭代,您将通过使用nowait获得性能优势。