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

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

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

编辑:

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

从“太细粒度,太粗粒度”小节, .NET并行计算团队的 “并行编程模式”一书中的“反模式”部分:

答案是通过性能测试找到最佳平衡点。 如果与正在进行的工作相比,并行化的开销最小,则尽可能并行化:在这种情况下,这将意味着并行化两个循环。 如果并行化内部循环的开销会降低大多数系统的性能,那么在这样做之前要三思而后行,因为它最好只能并行化外部循环。

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

它又取决于许多场景,

  1. 你的cpu可以运行的并行线程数。
  2. 迭代次数。

如果您的CPU是单核处理器,您将无法获得任何好处。

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

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

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

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

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

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

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

编辑:

我刚刚在MSDN上找到一个很好的链接,certificate在我的情况下非常有用(改善我的情况)以改进Parallel.foreach性能http://msdn.microsoft.com/en-us/library/dd560853.aspx