2015-08-24 61 views
6

我在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 
}); 
+1

您的服务器是否有支持超线程的8个内核或4个内核? – vcsjones

+0

@vcsjones:4个CPU,每个CPU有2个内核,因此总共4 * 2 = 8个内核 – malkam

+0

您是否使用本地提供程序? Math.NET Numerics本身并行化(至少部分) - 如果您更喜欢在顶部进行自己的并行化,请考虑通过调用Control.UseSingleThread()来禁用Math.NET的并行化;使用Intel的ChristophRüegg的 –

回答

0

MSDN

默认情况下,和foreach将利用然而,许多线程的基本调度程序提供,所以从默认的改变MaxDegreeOfParallelism唯一的限制很多并发任务将被如何使用。

我阅读文档的方式:如果底层的调度程序只提供一个单独的线程,然后设置MaxDegreeOfParallelism > 1仍然会导致在单个线程。

+0

已经创建了多个线程/任务,但是当8个内核可用时,它们只能在4个内核上运行。 – malkam

+0

池的调度程序和运行时/ TPL实际上决定哪些线程在何时何地运行。如果运行时仅调度到4个逻辑内核,那么无论已创建的线程数是多少,这都是并行运行的数量。 – theB

1

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

MSDN

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

如果使用并行循环,需要几秒或更长时间的单个步骤,请小心。这可能会发生在I/O限制的工作负载以及冗长的计算中。如果循环需要很长时间,由于.NET ThreadPool类的线程注入逻辑使用的启发式防止线程匮乏,您可能会遇到无限增长的工作线程。 “

相关问题