3

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

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

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

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

附加 3:Windows 10 专业版 64 位

4

1 回答 1

4

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

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

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

请参阅Thread_UseAllCpuGroups处理器组以供参考。

这在Environment.ProcessorCount的 MSDN 文档中也有描述:

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

于 2016-04-18T14:56:56.547 回答