Parallel.ForEach 没有提供更多内核的加速[关闭]

Posted

技术标签:

【中文标题】Parallel.ForEach 没有提供更多内核的加速[关闭]【英文标题】:Parallel.ForEach provides no speed up with more cores [closed] 【发布时间】:2018-01-21 15:10:01 【问题描述】:

我有两个嵌套的 Parallel.ForEach 循环,它们对并行度没有限制。据我了解,在大多数情况下,使用此设置更多的内核 = 更快的运行时间。但是,在两台不同的机器上运行,一台具有 4 核 4 线程,2.8GHz CPU,另一台具有 6 核 12 线程 3.3GHz CPU。该程序的运行时间相同:约 5 小时。

我在谷歌上找不到任何东西(虽然,除了这个问题的标题之外,我不完全确定要搜索什么。)这可以解释为什么会这样。

我确实注意到程序在更快的 CPU 机器上使用的系统内存要少得多,35MB 与 160MB 相比,根据 Visual Studio 诊断工具,更快的 CPU 更频繁地使用垃圾收集器。不知道为什么会出现这种情况或它们对运行时有什么影响?

【问题讨论】:

这真的完全取决于并行运行的代码,例如,如果它在远程服务器上等待,更多的线程不会帮助你。 @Skami 这一切都使用本地数据运行,不等待任何外部数据。它本质上只是运行许多具有不同起点和终点的 dijkstra 算法。 @Jack 它不必是外部的,如果您在每次试验之间从磁盘重新加载数据,可能会导致相同的问题。除非您向我们展示并行运行的代码,否则我们真的无法确定。 @ScottChamberlain 在并行部分运行之前,所有数据都加载到 RAM 中。实际代码是我没有源代码的库的一部分,所以我想我只能保持原样。 见here。当然你需要 Range Partitioner。 【参考方案1】:

带有Parallel.ForEach 的额外内核仅在您受 CPU 限制时才能帮助您。两台机器运行速度相同的原因是限制您运行速度的原因是 CPU。您可能正在等待某些 I/O 操作或 CPU 的大块工作正在同步部分中完成,例如在 lock 块中(如果没有看到您的代码就无法确定)。

您需要通过添加更多内核使您的代码 CPU 绑定以查看任何改进,为此您需要通过分析确定代码花费最多时间执行的实际操作,然后执行加速该部分所需的任何操作up(例如,如果是磁盘 I/O,将数据文件移动到更快的驱动器可能会有所帮助),或者如果问题是由锁定引起的(例如切换到线程安全集合),则允许该部分以非同步方式运行来自System.Collections.Concurrent 可能允许您删除锁定语句)。

【讨论】:

如果您发现我的回答没有用,请告诉我用什么方式,以便我澄清您需要澄清的任何部分。 (+1) 我的解释。关于反对票......不幸的是,一些反对票的人没有就他们的反对票提出任何论据或推理,这绝对对任何人都没有帮助

以上是关于Parallel.ForEach 没有提供更多内核的加速[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 parallel.ForEach 循环中获取线程 ID

何时使用 Parallel.ForEach,何时使用 PLINQ

如何限制 Parallel.ForEach?

在 Parallel.foreach 中等待 [重复]

Parallel.Foreach的全部知识要点

何时使用 Parallel.ForEach,何时使用 PLINQ