omp 关键部分之后是否有隐式障碍

Is there an implicit Barrier after omp critical section

本文关键字:是否 键部 之后 omp      更新时间:2023-10-16

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之间是否存在任何性能差异

关键部分没有障碍,无论是在开头还是在结尾。关键部分本身就是一个同步构造,可防止多个线程同时访问相同的数据。如果您希望在退出并行区域之前获得正确的全局最小值,则需要在关键部分之后添加额外的屏障。如前所述,平行区域在末端有一个隐含的障碍。

如果有大量迭代,使用 nowait 将获得性能优势。