我有三個嵌套循環,但只有最內部是可並行化的。外部和中間循環停止條件取決於最內部循環完成的計算,因此我無法更改順序。使用openmp並行化內部循環
我已經在最內層循環之前使用了一個OPENMP pragma指令,但兩個線程的性能比一個最差。我想這是因爲線程正在外循環的每次迭代中創建。
有沒有什麼辦法可以在外層循環之外創建線程,而只是在最內層的循環中使用呢?
在此先感謝
我有三個嵌套循環,但只有最內部是可並行化的。外部和中間循環停止條件取決於最內部循環完成的計算,因此我無法更改順序。使用openmp並行化內部循環
我已經在最內層循環之前使用了一個OPENMP pragma指令,但兩個線程的性能比一個最差。我想這是因爲線程正在外循環的每次迭代中創建。
有沒有什麼辦法可以在外層循環之外創建線程,而只是在最內層的循環中使用呢?
在此先感謝
不幸的是,目前的多核計算機系統對於這種細粒度的內環並行性並不好。這不是因爲線程創建/分叉問題。正如Itjax指出的那樣,幾乎所有的OpenMP實現都利用線程池,即它們預先創建了一些線程,並且線程被暫停。所以,實際上沒有創建線程的開銷。
然而,這種並行內部循環的問題有以下兩個頂置:
因此,應該儘量減少線程分配/加入的實際數量。您可以通過增加每個調用的內部循環的工作量來減少這種開銷。這可以通過一些代碼更改來完成,例如循環展開。
OpenMP的應該是使用線程池,所以每次你執行你的循環時間,你將不會被重建線程。但嚴格來說,這可能取決於您使用的OpenMP實現(我知道GNU編譯器使用了一個池)。我建議你尋找其他常見問題,例如虛假分享。
感謝您的所有意見。我會再次查看我的代碼。任何人都可以爲多線程代碼提供一個很好的免費探查器/代碼分析器嗎? – Hernan 2011-02-07 11:04:21
請向我們展示代碼或甚至更好的顯示問題的簡單示例。 – 2011-02-05 13:14:40