2012-05-04 31 views
8

一个隐含的屏障是有后OMP临界区是否有后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) 
    } 
} 

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) 

我会得到两个版本1和版本2相同的结果?

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

编辑:如果不好意思的例子是非常差..还有,我想知道是否会有版本1和版本2之间的性能差异

+0

这可能不是最好的例子,因为离开平行区域时会有障碍。但很好的问题。 +1 – Mysticial

+0

在您发布的设计示例中,v2比v1没有性能优势,但在现实世界中可能会有。 –

回答

11

关键部分没有障碍,不论是在开始还是在结尾。关键部分是一个独立的同步结构,可以防止多个线程同时访问相同的数据。如果您希望在退出并行区域之前拥有正确的全局最小值,那么在临界区之后需要额外的屏障。正如已经说过的那样,平行区域最后有一个隐含的障碍。

0

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