嵌套的Parallel.For()循环速度和性能

时间:2012-01-10 17:06:28

标签: c# parallel-processing

我有一个嵌套的for循环。 我用Parallel.For()替换了第一个For,并且计算速度提高了。

我的问题是用Parallel.For()替换第二个(在一个内部)。它会提高速度吗?还是没有区别?还是会慢一点?

修改:

由于核心不是无限制的(通常有2到8个核心),因此内部循环并行运行。因此,如果我使用Parallel.For()更改内部,则它会并行运行。但我不确定它如何改变性能和速度。

3 个答案:

答案 0 :(得分:15)

来自"Patterns of parallel programming".NET parallel computing team书中的“太细粒度,太粗粒度”小节,“反模式”部分:

  

答案是通过表现找到最佳平衡   测试。如果比较并行化的开销很小   对于正在完成的工作,尽可能并行化:在这种情况下,   这意味着并行化两个循环。如果是开销的话   并行化内部循环会降低大多数的性能   系统,在这样做之前要三思而后行,因为这样做可能是最好的   并行化外循环。

看看那个小节,它是自包含的并列光线跟踪应用程序的详细示例。并且它建议扁平化循环以获得更好的并行度也可能对你有所帮助。

答案 1 :(得分:3)

这又取决于很多场景,

  1. cpu可以运行的并行线程数。
  2. 迭代次数。
  3. 如果您的CPU是单核处理器,您将无法获得任何好处。

    如果迭代次数更多,您将获得一些改进。

    如果只有几次迭代,它会很慢,因为它涉及额外的过载。

答案 2 :(得分:1)

这很大程度上取决于您在for和机器中使用的数据和功能。我最近搞乱了parallel.for和parallel.foreach,并发现他们使我的应用程序更慢......(在4核机器上,可能如果你有24核心服务器是另一个故事)

我认为管理线程意味着过多的开销......

甚至MS在他们的文档上(这是关于它的msdn关于它http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19222的很长的pdf)承认它不会使应用程序运行得更快。你必须每次都尝试,如果它有效,那就太好了,如果运气不好的话。

你应该尝试使用外部和内部,但至少在我尝试过的应用程序中,没有一个能让应用更快。外部或内部并不重要,我只是得到相同的执行时间甚至更糟。

也许如果你也使用Concurrent集合,你会获得更好的性能。但是,再一次,没有尝试就没有办法说出来。

编辑:

我刚刚在MSDN上找到一个很好的链接,证明在我的情况下非常有用,可以提高Parallel.foreach性能 http://msdn.microsoft.com/en-us/library/dd560853.aspx