12

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

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

版本一

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

4

2 回答 2

14

关键部分没有障碍,无论是在起点还是终点。临界区是一个独立的同步结构,它可以防止多个线程同时访问相同的数据。如果您想在退出并行区域之前获得正确的全局最小值,则需要在临界区之后设置一个额外的障碍。正如已经说过的,平行区域的末端有一个隐含的障碍。

于 2012-05-04T10:46:00.893 回答
0

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

于 2012-05-07T08:08:56.073 回答