2017-08-13 46 views
-2

我有兩個嵌套的Parallel.ForEach循環,對並行度沒有限制。我的理解是,對於使用此設置的大多數情況,更多內核=更快的運行時間。但是,在兩臺不同的機器上運行,一臺採用4核4線程,2.8GHz CPU,另一臺採用6核12線程3.3GHz CPU。該程序需要相同的時間長度運行:約5小時。Parallel.ForEach沒有提供更多的內核加速

我無法通過Google搜索找到任何東西(雖然並不完全確定除了這個問題的標題之外要搜索什麼),這將解釋爲什麼會這樣。

我注意到,根據visual studio診斷工具,程序在更快的CPU機器上使用的系統內存少得多,爲35MB而160MB,CPU使用垃圾收集器的頻率更高。不知道爲什麼這些會是這種情況,或者如果他們在運行時間有什麼影響?

+0

這實際上完全取決於在並行中運行的代碼,例如,如果它正在遠程服務器上等待,更多的線程不會幫助您。 – Skami

+0

@Skami它全部使用本地數據運行,不會在外部等待。它基本上只是運行大量不同的起點和終點的dijkstra算法。 – Jack

+0

@Jack它不一定是外部的,如果您在每次試用期間從磁盤重新加載數據,可能會導致相同的問題。除非您向我們展示並行運行的代碼,否則我們無法確定。 –

回答

3

如果CPU綁定,帶有Parallel.ForEach的額外內核僅對您有幫助。這兩臺機器運行速度相同的原因是限制您可以運行的速度是而不是 CPU。您可能正在等待一些I/O操作,或者CPU的大塊工作正在同步部分中完成,例如在lock塊(無法確切地說沒有看到您的代碼)。

您需要通過添加更多內核來獲得您的代碼CPU才能看到任何改進,爲此,您需要確定代碼花費大部分時間通過分析進行的實際操作,然後執行所需的任何操作來加速(例如,如果是磁盤I/O,將數據文件移動到更快的驅動器可能會有所幫助),或者如果問題是由鎖定引起的,則允許該部分以非同步方式運行(例如切換到線程安全來自System.Collections.Concurrent的集合可能允許您刪除鎖定語句)。

+0

如果您發現我的答案沒有用,請告訴我以何種方式,以便我可以澄清您需要澄清的任何部分。 –

+0

(+1)從我這裏解釋。關於負面投票...不幸的是,一些downvoters沒有提出任何關於他們downvote的論點或推理,這絕對不會對任何人有幫助 – Christos