2012-06-26 150 views
0

我有一個C++代碼,包含許多在8線程計算機上與openMP並行的for-loops。openMP的並行化效率

但是單線程執行的速度比並行8線程快。我被告知,如果for循環的負載增加並行化將變得有效。

這裏的負載我是指例如循環的最大迭代次數。事情是我沒有機會比較大量數據的單線程和8線程並行代碼。

我應該使用並行代碼嗎?並行效率是否會隨着for-loops的負載而增加?

+1

您的問題太寬泛,不適合SO。考慮縮小它並提供一些代碼示例。 –

回答

2

OpenMP的規範用例是高迭代計數循環迭代的線程組之間的分配,條件是循環迭代沒有直接或間接的依賴關係。

通過考慮問題可以發現我的意思是直接依賴關係循環迭代執行順序是否會影響結果?。例如,如果迭代N + 1使用迭代N的結果,那麼就有這樣的依賴關係,以相反順序運行循環迭代將改變例程的輸出。

間接依賴關係我的意思主要是data races,其中線程必須協調對共享數據的訪問,特別是他們必須確保寫入共享變量以正確的順序進行。

在很多情況下,您可以重新設計一個依賴於循環來消除這些依賴關係。

如果你有一個沒有這種依賴的高迭代計數循環,那麼你有一個用OpenMP加速的候選者。下面是的擊打:

  • 有一些平行開銷的開始和每一個這樣的環的端部的計算,如果循環計數不夠高這種開銷可能超過,部分或全部,的加速並行運行迭代。確定這是否影響您的代碼的唯一方法是測試和測量。
  • 循環迭代之間的依賴關係比我已經概述的更加微妙。根據您的系統體系結構和循環內的計算,您可能(並未意識到)對您的線程進行編程,以爭奪對緩存或I/O資源的訪問權限或任何其他資源。在最壞的情況下,這可能導致線程數量增加,從而導致執行速度下降。
  • 您必須確保每個OpenMP線程都由硬件備份,而不是由超線程代表的僞硬件備份。每個OpenMP線程一個核心,超線程就是這個領域的蛇油。
  • 我希望有其他的但是放在這裏,也許別人會幫助。

現在回到你的問題:

  • 我應該使用並行的代碼嗎?測試和測量。
  • 並行效率是否會隨着for-loop的負載而增加?大約,但爲了您的硬件上的代碼,測試和測量。

最後,如果不在不同情況下組合測量運行時間並瞭解您所做的測量結果是什麼,那麼您就無法成爲一名嚴肅的並行計算工作者。如果您無法比較大量數據的順序執行和並行執行,您必須對它們進行測量以獲取適量的數據,並在處理大量數據時對行爲進行預測之前瞭解所學的課程。