2014-01-29 63 views
0

假設我有一個的OpenMP 2.0 for循環運行一些操作:如何在任務工作,同時剩餘線程完成工作

#pragma omp parallel for schedule(static) 
for (int i = 0; i < lim; ++i) 
{ 
    // do something thread-safe 
} 
threadSafeFunc(); 

unSafeFunc(); 

函子threadSafeFunc完全是線程安全的這樣,而不是連續運行它畢竟這些迭代完成後,我想要獲得第一個線程完成從OpenMP循環中分配的任務以開始處理它,然後讓所有線程在執行unSafeFunc之前等待。

我該怎麼做?

+0

@JerryCoffin我很驚訝地聽到。我原以爲這會是一個比較常見的用例。 – arman

+1

@JerryCoffin你能否激發前面的陳述?最新的標準似乎支持比簡單的循環結構更多的東西... – Massimiliano

+0

@Massimiliano:好的 - 我很高興收回我的陳述(並且看着你的答案,也很高興被證明是錯誤的)。 –

回答

3

這可能是您的特定問題的解決方案:

#pragma omp parallel 
{ // #1 
    #pragma omp for schedule(static) nowait 
    for (int i = 0; i < lim; ++i) // #2 
    { 
    // do something thread-safe 
    } // No implied barrier bue to the nowait clause 
    #pragma omp single 
    { // #3 
    threadSafeFunc(); 
    } // Implied barrier 
} // End of parallel region 
unSafeFunc(); 

的想法很簡單:你第一次在#1打開parallel區域。這裏面的並行區域要使用兩個工作共享構建體:

  1. #2
  2. 單個構建一個循環結構在#3

環路構建體(該standard的部分2.7.1)具有nowait子句刪除循環結尾處的隱式屏障。然後single構建體(部分2.7.3):

...指定相關聯的結構化塊僅由一個 線程在團隊執行(不一定是主線程),在 上下文它的隱含任務。在隊中,這 不執行塊的其他線程,等待一個隱含的屏障在 年底 ...

兩個結構的組合確保了在第一線整理其在循環中的工作將進入single構造並執行threadSafeFunc()。然後,所有線程將在隱含屏障處同步,並與master線程連接。此時只有master線程將繼續並執行unSafeFunc()

相關問題