并行。不使用所有核心

时间:2015-08-24 17:29:53

标签: c# task-parallel-library mathdotnet mathnet parallel.for

我在Math.Net Numerics块内平行使用Parallel.For进行繁重的数学计算。

当我在本地系统中运行4核(2 * 2)的代码时,它使用全部4核。

但是当我在具有8个核心(4 * 2)的开发服务器中运行相同的代码时,它只使用4个核心。

我已尝试设置MaxDegreeOfParallism,但无法帮助。

知道为什么没有使用所有核心。

以下是示例代码。

Parallel.For(0,10000,(i)=>
{

 // heavy math computations using matrices
});

2 个答案:

答案 0 :(得分:1)

来自MSDN

  

默认情况下,For和ForEach将使用底层调度程序提供的许多线程,因此从默认值更改MaxDegreeOfParallelism仅限制将使用多少并发任务。

我阅读文档的方式:如果底层调度程序只提供单个线程,那么设置MaxDegreeOfParallelism > 1仍然会产生一个线程。

答案 1 :(得分:1)

并行化是基于当前条件和许多其他情况在运行时完成的。您不能强制.NET使用所有核心(至少在托管代码中)。

来自MSDN

"相反,默认情况下,Parallel.ForEach和Parallel.For方法可以使用可变数量的任务。这就是为什么,例如,ParallelOptions类具有MaxDegreeOfParallelism属性而不是" MinDegreeOfParallelism"属性。这个想法是系统可以使用比请求处理循环更少的线程。 .NET线程池通过允许并行任务的工作线程数随时间变化而动态适应不断变化的工作负载。在运行时,系统会观察增加线程数是否会改善或降低整体吞吐量并相应地调整工作线程数。

如果您使用具有几秒钟或更长时间的单个步骤的并行循环,请务必小心。这可能发生在I / O绑定工作负载以及冗长的计算中。如果循环花费很长时间,由于启发式防止.NET ThreadPool类的线程注入逻辑使用的线程饥饿,您可能会遇到工作线程的无限增长。 "