2012-05-04 33 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獲得性能優勢。