Parallel.For not utilising all cores

2019-02-21 21:04发布

I'm doing heavy mathematical computations using Math.Net Numerics parallely inside Parallel.For block.

When I run code in my local system with 4 cores(2*2), it's using all 4 cores.

But when I run same code in our dev server with 8 cores(4*2), it's using only 4 cores.

I've tried setting MaxDegreeOfParallism,but couldn't help.

Any idea why all cores are not being utilised.

Below is sample code.

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

 // heavy math computations using matrices
});

2条回答
Deceive 欺骗
2楼-- · 2019-02-21 21:44

Parallelization is done runtime, based on the current conditions and a lots of other circumstances. You cannot force .NET to use all the cores (in managed code at least).

From MSDN:

"Conversely, by default, the Parallel.ForEach and Parallel.For methods can use a variable number of tasks. That's why, for example, the ParallelOptions class has a MaxDegreeOfParallelism property instead of a "MinDegreeOfParallelism" property. The idea is that the system can use fewer threads than requested to process a loop. The .NET thread pool adapts dynamically to changing workloads by allowing the number of worker threads for parallel tasks to change over time. At run time, the system observes whether increasing the number of threads improves or degrades overall throughput and adjusts the number of worker threads accordingly.

Be careful if you use parallel loops with individual steps that take several seconds or more. This can occur with I/O-bound workloads as well as lengthy calculations. If the loops take a long time, you may experience an unbounded growth of worker threads due to a heuristic for preventing thread starvation that's used by the .NET ThreadPool class's thread injection logic. "

查看更多
可以哭但决不认输i
3楼-- · 2019-02-21 21:53

From MSDN

By default, For and ForEach will utilize however many threads the underlying scheduler provides, so changing MaxDegreeOfParallelism from the default only limits how many concurrent tasks will be used.

The way I read the documentation: if the underlying scheduler only offers a single thread, then setting MaxDegreeOfParallelism > 1 will still result in a single thread.

查看更多
登录 后发表回答