2010-05-28 70 views
1

我想通過使用並行擴展來使我的計算應用程序更快。我是新來的,所以我剛剛用Parallel.ForEach替換了主要的foreach循環。但計算變得更加緩慢。降低並行擴展性能的常見原因是什麼?並行擴展緩慢工作的原因

感謝

+1

真的沒有足夠的信息來回答你的問題。你需要提供一個具體的例子。 – 2013-01-04 23:20:19

回答

1

您只通過在滿足若干條件平行得到改善。首先,你爲什麼會期望速度提高?

您可以預期性能會提高的情況是

  1. 如果您有順序操作等待資源,使TCP連接到服務器並下載數據,這可能會更快地並行執行。
  2. 如果您有多個處理器/內核,則可以更快地在內核上執行每個任務,而不是使用100%的內核,而不是其他任何內核。

如果您有一個核心和很多小操作,上下文切換和分配管理並行線程所需資源的額外工作可能會超過優勢。

如果您描述您的具體情況,我們可以嘗試推測爲什麼它在您的示例中速度較慢。

實際上並行計算的維基百科條目有這方面的一些好的信息,請http://en.wikipedia.org/wiki/Parallel_computing

你要特別注意Amdahl定律。

+0

總之,我有一個對象列表,並嘗試計算每個對象的一些屬性值。對象是孤立的,沒有公共變量可以計算。有一個靜態類用於存儲常量,但其字段不可變。 英特爾酷睿i7用於計算。所有內核都有90-100%的忙碌。但是它的工作速度比一個內核繁忙時的單線程計算慢。 – darja 2010-05-28 09:10:20

+0

我假設計算是非常基本的。因此,爲每個線程分配資源的開銷超過了從並行執行中獲得的價值。 列表中有多少個物體? 解決此問題的經典方法是減少將大量線程創建爲最佳值的開銷。你的I7可能會有8個核心,所以你可以自己做分工。 – Cobusve 2010-05-28 11:26:16

+0

試試這個: 1.製作一個方法來計算對象列表中的屬性,而不是單個對象。 2.編寫一些代碼,將您的對象組分成8個列表。 3.現在使用並行擴展啓動8個並行進程,每個進程都在列表上執行計算。 如果您對此進行分析,您可以準確衡量將數據集分爲8個列表所需的額外工作量以及迭代每個列表的開銷。 如果這種開銷低於使用所有核心的性能收益,那麼這會提高你的性能,否則你只是增加努力(時間) – Cobusve 2010-05-28 11:27:23