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

Alg*_*ser 3 c# parallel-processing parallel.for

使用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 位

Lua*_*aan 5

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

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

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

MSDN 文档中也对Environment.ProcessorCount进行了描述:

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