【问题标题】:Nested Parallel.For() loops speed and performance嵌套的 Parallel.For() 循环速度和性能
【发布时间】:2012-01-10 17:06:27
【问题描述】:

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

我的问题是用Parallel.For() 替换第二个 for (inside one)。它会增加速度吗?还是没有区别?还是会慢一些?

编辑:

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

【问题讨论】:

标签: c# parallel-processing


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这又取决于许多场景,

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

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

    如果迭代次数更多,你会得到一些改进。

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

    【讨论】:

      【解决方案3】:

      这在很大程度上取决于您在 for 和机器内部使用的数据和功能。我最近一直在搞乱parallel.for和parallel.foreach,发现它们让我的应用程序变得更慢......(在4核机器上,如果你有24核服务器可能是另一回事)

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

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

      您应该尝试使用外部和内部,但至少在我尝试过的应用程序中,它们都没有使应用程序更快。外部或内部无关紧要,我只是获得相同的执行时间甚至更糟。

      也许如果你也使用并发集合,你会获得更好的性能。但同样,不尝试就无法分辨。

      编辑:

      我刚刚在 MSDN 上找到了一个很好的链接,它被证明对提高 Parallel.foreach 性能非常有用(就我而言) http://msdn.microsoft.com/en-us/library/dd560853.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-17
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 2013-01-29
        相关资源
        最近更新 更多