Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Parallel.ForEach不提供更多内核的加速_C#_Multithreading_Performance_Parallel Processing - Fatal编程技术网

C# Parallel.ForEach不提供更多内核的加速

C# Parallel.ForEach不提供更多内核的加速,c#,multithreading,performance,parallel-processing,C#,Multithreading,Performance,Parallel Processing,我有两个嵌套的Parallel.ForEach循环,它们对并行度没有限制。我的理解是,在大多数情况下,使用这种设置,更多的内核=更快的运行时间。但是,在两台不同的机器上运行,一台是4核4线程、2.8GHz CPU,另一台是6核12线程、3.3GHz CPU。程序的运行时间与此相同:~5小时 我在谷歌上找不到任何东西(虽然,除了这个问题的标题之外,我不完全确定要搜索什么)。这就解释了为什么可能会这样 我确实注意到,程序在更快的CPU机器上使用的系统内存要少得多,35MB比160MB,根据visua

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

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


我确实注意到,程序在更快的CPU机器上使用的系统内存要少得多,35MB比160MB,根据visual studio诊断工具,更快的CPU使用垃圾收集器的频率要高得多。不确定为什么会出现这两种情况,或者如果它们对运行时有什么影响?

具有
并行的额外内核。ForEach
仅在CPU受限的情况下对您有所帮助。两台机器运行相同速度的原因是限制您运行速度的因素是而不是CPU。您可能正在等待某个I/O操作,或者在一个同步的部分中正在完成一大块CPU工作,例如在
块中(如果不看到您的代码,就不能确定)


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

这实际上完全取决于并行程序中运行的代码,例如,如果它在远程服务器上等待,更多的线程将无法帮助您。@Skami它使用本地数据运行,不等待任何外部数据。它基本上只是在不同的起点和终点上运行大量的dijkstra算法。@Jack如果您在每次试验之间从磁盘重新加载数据,可能会导致相同的问题,那么它不必是外部的。除非您向我们展示正在并行运行的代码,否则我们真的无法确定。@ScottChamberlain在并行部分运行之前,所有数据都加载到RAM中。实际代码是我没有源代码的库的一部分,所以我想我只能保持原样。请参阅。当然,你需要范围分割。如果你发现我的答案没有用,请让我知道,以何种方式,我可以澄清你需要澄清的任何部分。(+1)从我的解释。关于反对票……不幸的是,一些反对票的选民没有就他们的反对票提出任何论点或理由,这对任何人都毫无帮助