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

ved*_*eda 9 c++ openmp

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

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

VERSION-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)
   }
}
Run Code Online (Sandbox Code Playgroud)

VERSION-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)
Run Code Online (Sandbox Code Playgroud)

对于版本1和版本2,我会得到相同的结果吗?

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

编辑: 对不起,如果示例很差..另外,我想知道版本1和版本-2之间是否会有任何性能差异

Hri*_*iev 13

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