C#parallel.for循环完全使用CPU1的核心而不是CPU2

时间:2016-04-18 14:44:48

标签: c# parallel-processing parallel.for

使用parallel.for的C#方法完全使用10核cpu中的所有核心(在双Xeon 64GB RAM windows 10工作站上),但不使用第二个cpu上的任何其他可用的10个物理核心。即使进程的亲和性(在任务管理器中)表明所有核心都可用。有什么想法/方法让这个过程使用所有可用的核心?我确实看到从标准编码到并行的大规模性能改进。在这种情况下;放弃速度再提高100%似乎很可惜。感谢。

重要观察:查看任务管理器,很明显该进程使用的核心分布在两个Xeon CPU上。 IOW,它占用了每个CPU大约一半的内核。

附加信息:Environment.ProcessorCount = 32.即使系统有20个物理内核,因此有40个逻辑内核。显然,该过程不会使用所有这32个核心。它使用最多20个FWIW,在单核i7-3770上,该过程按预期工作,使用接近100%的8个逻辑核心。

附加2:Luaan建议的配置更改不会影响可用处理器的数量:仍然是32。

附加3:Windows 10 Pro 64位

1 个答案:

答案 0 :(得分:4)

我猜这里 - 你的两个CPU在两个不同的处理器组中。默认情况下,.NET仅使用一个处理器组。

扩展此支持所需的最低配置是:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

请参阅Thread_UseAllCpuGroupsProcessor Groups以供参考。

这也在Environment.ProcessorCount的MSDN文档中进行了描述:

  

如果当前计算机包含多个处理器组,则此属性返回可供公共语言运行库(CLR)使用的逻辑处理器数。