2011-12-12 28 views
6

我有一個OpenMP與C++程序。並行區域內包含#pragma omp task的平行區域。現在,我想知道如何根據任何正在運行的線程滿足的條件來終止並行區域。如何有條件地終止OpenMP中的並行區域?

#pragma omp parallel 
{ 
#pragma omp task 
{ 
    //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region) 
} 

} 

回答

5

您不能過早終止並行構造。 OpenMP對此沒有構造,它指定並行區域可能只有一個出口點(所以沒有分支出該區域...)。

我認爲唯一(理智和便攜)的方法是有一個變量,指示工作是否完成,並讓線程定期檢查變量(使用原子指令和/或沖洗來確保正確的可見性) 。如果變量表示工作已經完成,線程可以跳過剩餘的工作(通過將剩餘的工作放在一個if體中,如果工作完成則不會分支)。

編寫特定於系統的代碼可能會掛起其他線程並將它們設置到塊的末尾(例如操作堆棧和指令...),但這似乎不太可取(這意味着它很可能非常脆弱)。

如果你想告訴我們更多關於你想要做什麼(以及爲什麼你需要這樣做),可能會更容易幫助你(例如,通過發佈不需要這樣做的設計) 。