9

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

当我在具有 4 个内核(2*2)的本地系统中运行代码时,它使用了所有 4 个内核。

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

我试过设置 MaxDegreeOfParallism,但无济于事。

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

下面是示例代码。

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

 // heavy math computations using matrices
});
4

2 回答 2

1

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

来自MSDN

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

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

于 2015-10-19T09:41:18.187 回答
1

来自MSDN

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

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

于 2015-08-24T17:41:31.187 回答