2011-02-05 192 views
4

我有三個嵌套循環,但只有最內部是可並行化的。外部和中間循環停止條件取決於最內部循環完成的計算,因此我無法更改順序。使用openmp並行化內部循環

我已經在最內層循環之前使用了一個OPENMP pragma指令,但兩個線程的性能比一個最差。我想這是因爲線程正在外循環的每次迭代中創建。

有沒有什麼辦法可以在外層循環之外創建線程,而只是在最內層的循環中使用呢?

在此先感謝

+2

請向我們展示代碼或甚至更好的顯示問題的簡單示例。 – 2011-02-05 13:14:40

回答

4

不幸的是,目前的多核計算機系統對於這種細粒度的內環並行性並不好。這不是因爲線程創建/分叉問題。正如Itjax指出的那樣,幾乎所有的OpenMP實現都利用線程池,即它們預先創建了一些線程,並且線程被暫停。所以,實際上沒有創建線程的開銷。

然而,這種並行內部循環的問題有以下兩個頂置:

  • 調度工作/任務線程:即使我們並不需要物理創建線程,至少要分配工作(=創建邏輯任務)到主要需要同步的線程。
  • 加入線程:在一個團隊中的所有線程之後,應聯接這些線程(除非nowait使用OpenMP指令)。這通常作爲障礙操作來實施,這也是非常密集的同步。

因此,應該儘量減少線程分配/加入的實際數量。您可以通過增加每個調用的內部循環的工作量來減少這種開銷。這可以通過一些代碼更改來完成,例如循環展開。

4

OpenMP的應該是使用線程池,所以每次你執行你的循環時間,你將不會被重建線程。但嚴格來說,這可能取決於您使用的OpenMP實現(我知道GNU編譯器使用了一個池)。我建議你尋找其他常見問題,例如虛假分享。

+0

感謝您的所有意見。我會再次查看我的代碼。任何人都可以爲多線程代碼提供一個很好的免費探查器/代碼分析器嗎? – Hernan 2011-02-07 11:04:21