2011-10-03 74 views
3

我在寫一個並行合併排序程序。我使用fork()來執行並行處理。我試着運行2個並行進程,4個進程,8個進程等等。然後我發現使用2個進程運行的程序需要最少的時間完成,即最高的性能。我認爲這是合理的,因爲我的CPU是Core 2 Duo。對於4,8,16,32個過程,它的表現似乎有穩定的下降,但在此之後,表現波動(似乎沒有模式)。有人可以解釋嗎?並行進程的數量將如何影響CPU的性能?

根據這個模式,我有一種感覺,當程序中使用的進程數等於我的CPU的核心數時,我的程序可以具有最高的性能。但我百分之百肯定。有人可以驗證我嗎?或者告訴我實際上影響並行程序性能的因素。

在此先感謝!

回答

1

使用2個內核,任何數量大於2的進程都必須共享處理器時間。您將從流程切換中招致開銷,並且您將永遠不會有同時執行兩個以上的進程。只有兩個進程在兩個內核上不間斷地運行會更好。

至於爲什麼當你遇到大量進程時你看到性能波動,我不得不猜測你的操作系統在進程之間花費更多時間切換任務,而不是實際執行排序工作。切換任務所需的時間是操作系統調度程序的工件,單個任務使用的內存量,緩存,交換空間的潛在使用等等。

如果要最大化並行進程的性能,同時運行的進程數量應該等於處理器數量乘以每個處理器上的內核數量。在你的情況下,兩個。如果你的核心處於閒置狀態而沒有做任何事情,那麼你的進程就會處於空閒狀態,等待處理器內核的時間。

+0

嗨,現在就明白了。我可以問你爲什麼隨着流程數量的增加,它不會呈現速度下降的趨勢。 – Newbie

1

3個進程應該是從來沒有比Core 2 Duo上的2個進程更快。

此外,只有分叉是有道理的,如果你正在做的CPU昂貴的任務:

分路到打印信息Hello world!兩次是無稽之談。分叉本身會消耗更多的CPU時間。

分叉以排序具有1,000,000個元素的數組(如果使用正確的排序算法)將大約減少一半的執行時間。

+0

我明白了。我能理解爲什麼2過程是最快的。但隨着流程數量的增加,性能會下降。 (我不是後來下降的趨勢) – Newbie

+0

是的,它會的。分叉本身消耗CPU時間。也許這更好地解釋了它:[多線程和性能](http://www.mouldy.org/multithreading-and-performance) – Dennis