2016-03-19 21 views
1

嗨我正在閱讀本網站http://www.viva64.com/en/a/0054/和點號17,它表示下面的代碼沒有屏障是錯誤的。爲什麼?我在http://bisqwit.iki.fi/story/howto/openmp/#BarrierDirectiveAndTheNowaitClause處讀到,在每個並行塊的末尾有一個隱式屏障,並且在每個段的結尾處,對於單個語句,除非使用nowait指令。OpenMP隱式屏障

struct MyType 
{ 
    ~MyType(); 
}; 
MyType threaded_var; 
#pragma omp threadprivate(threaded_var) 
int main() 
{ 
    #pragma omp parallel 
    { 
      ... 
      #pragma omp barrier // code is wrong without barrier. 
    }  
} 

有人向我解釋請。謝謝

+1

據我明白[有一個IMPL平行區域末端的icit障礙](https://computing.llnl.gov/tutorials/openMP/#ParallelRegion)。假設這是真的,我認爲點號17在鏈接中是錯誤的。 –

+0

剛剛檢查了OpenMP 4.5規範,它說:「在並行結構的末尾有一個隱式屏障。」 –

+0

該規範規定:「根據靜態變量如何在基本語言中處理,但在程序中未指定的位置處,釋放threadprivate變量的所有副本的存儲空間。」 –

回答

0

鏈接的網頁是錯誤的關於這一點。在並行部分的末尾實際上存在一個隱含的障礙。

由於該網站似乎有一個Windows對焦和MS僅支持OpenMP標準2.0,它可能是值得注意的是,隱式屏障只在當前標準4.5是不是還要在2.0版本:

在並行構造的完成,在隊 線程在一個隱式同步屏障,[...]

http://www.openmp.org/mp-documents/cspec20.pdf