omp临界区之后是否存在隐式屏障?

12

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


那可能不是最好的例子,因为当你离开并行区域时会有一个障碍。但无论如何,这是一个好问题。+1 - Mysticial
在你发布的人为示例中,v2与v1相比没有性能优势,但在现实世界中可能会有。 - Mahmoud Al-Qudsi
2个回答

15

关键区域的开头和结尾都没有屏障。关键区域本身就是一种同步构造,可以防止多个线程同时访问相同的数据。如果您想在退出并行区域之前获得正确的全局最小值,则需要在关键区域后添加额外的屏障。正如已经提到的那样,并行区域在结尾处有一个隐式屏障。


0
如果有大量的迭代,使用nowait可以获得更好的性能优势。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接