2012-01-10 25 views
11

我有一個嵌套for循環。 我已經替換了第一個用於Parallel.For()並且計算速度增加了。嵌套的Parallel.For()循環速度和性能

我的問題是關於用Parallel.For()替換(在一個裏面)的第二個問題。它會提高速度嗎?還是沒有區別?或者它會變慢?

編輯:

因爲鐵芯不是無限的(通常有2至8個內核),則內循環運行並行。所以,如果我改變了Parallel.For()的內部,它再次平行運行。但我不確定它是如何改變性能和速度的。

+0

取決於內核的數量,但我懷疑你不會看到任何改進。儘管如此,請嘗試一下。 – Ryan 2012-01-10 17:07:12

+5

http://guyellisrocks.com/coding/nested-parallel-foreach/ ...我們可以告訴你一個簡單的基準測試不會呢? – 2012-01-10 17:10:13

回答

14

從「太精細,太粗粒度」款,「反模式」在"Patterns of parallel programming".NET parallel computing team部分:

答案是最好的平衡是通過績效 測試中發現。如果與正在進行的工作相比的並行化開銷很小,請儘可能並行化:在這種情況下, 這意味着要並行化兩個循環。如果 並行化內部循環的開銷會降低大多數系統的性能,請在這之前仔細考慮,因爲它可能最好只與 並行化外部循環。

看看這個小節,它是自包含並行光線追蹤應用程序的詳細示例。並且其建議展平環路有更好的並行度也許對你也有幫助。

1

這很大程度上取決於您在for和機器中使用的數據和功能。最近我一直在使用parallel.for和parallel.foreach,並發現他們讓我的應用程序更慢......(在4核心機器上,可能如果你有24核心服務器是另一回事)

我認爲管理線程意味着太多的開銷......

即使MS在他們的文檔(這裏是一個關於msdn的很長的pdf關於它http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19222)承認它並沒有使應用程序運行得更快。你必須每次嘗試,如果它有效,那很好,如果運氣不好的話。

你應該嘗試與外部的和內部的,但至少在我嘗試的應用程序,他們都沒有讓應用程序更快。外部或內部並不重要,我只是得到相同的執行時間,甚至更糟。

也許如果你使用Concurrent集合,你會獲得更好的性能。但是,沒有嘗試就沒有辦法說。

編輯:

我剛剛發現在MSDN一個很好的鏈接被證明是非常有用的(在我的情況),以提高性能Parallel.foreach http://msdn.microsoft.com/en-us/library/dd560853.aspx

3

這又取決於許多情況下,

  1. 您的cpu可以運行的並行線程數。
  2. 迭代次數。

如果你的CPU是單核處理器,你不會得到任何好處。

如果迭代次數更多,您將得到一些改進。

如果只有一些迭代,它會很慢,因爲它會引起額外的過載。