【问题标题】:c# STILL returning wrong number of coresc# STILL 返回错误的核心数
【发布时间】:2012-07-23 00:53:20
【问题描述】:

好的,所以我在In C# GetEnvironmentVariable("NUMBER_OF_PROCESSORS") returns the wrong number 中发帖询问如何在 C# 中获得正确数量的内核。一些乐于助人的人向我提出了一些类似问题的问题,但我已经尝试过这些解决方案。然后我的问题被关闭,因为它与另一个问题相同,这是真的,但那里给出的解决方案不起作用。所以我正在打开另一个,希望有人能够帮助意识到其他解决方案不起作用。

那个问题是How to find the Number of CPU Cores via .NET/C#?,它使用 WMI 来尝试获取正确数量的内核。好吧,这是那里给出的代码的输出:

Number Of Cores: 32
Number Of Logical Processors: 32
Number Of Physical Processors: 4

根据我的最后一个问题,该机器是运行 Windows Server 2008 R2 HPC 版本的 64 核 AMD Opteron 6276(4x16 核)。

无论我做什么,Windows 似乎总是返回 32 个内核,即使有 64 个内核可用。我已经确认机器只使用了 32 个内核,如果我硬编码 64 个内核,那么机器会使用所有内核。我想知道 AMD CPU 的检测方式是否存在问题。

仅供参考,如果您还没有阅读最后一个问题,如果我在命令行中键入 echo %NUMBER_OF_PROCESSORS",它会返回 64。它不会在编程环境中执行此操作。

谢谢, 贾斯汀

更新:输出 PROCESSOR_ARCHITECTURE 从命令行返回 AMD64,但从程序返回 x86。该程序是在 64 位硬件上运行的 32 位程序。我被要求将其编译为 64 位,但它仍然显示 32 个内核。

【问题讨论】:

  • 不确定这是否是您的情况,但有些地方将超线程计算为内核数量的两倍,但其他地方则不然。
  • @sblom 特别是因为他的结果相差了两倍。
  • 是的,我认为这可能是正在发生的事情。 CPU 返回 64 个内核,但 Windows 认为它​​们包含超线程,因此数量减半。我已经检查了 BIOS,但没有超线程选项。也许我会检查 AMD CPU 并将计数加倍......
  • 如果你使用CPU-Z,你会看到什么?
  • @sblom 我知道当所有证据都指向另一个方向时很难相信,但我知道我在说什么。我确实有 64 个内核。无论如何,请看看我在下面发布的解决方案。我是正确的;这与AMD的新芯片设计有关。有一个可用的修补程序。随着这些芯片进入流通,这可能会出现更多。

标签: c# .net cpu multicore


【解决方案1】:

感谢您的帮助,但我找到了问题所在。正如我所料,这是由于 AMD 的设计。他们正在使用一种称为 MCM(我认为是多芯片模块)的新架构,这会导致 Windows 无法正确识别内核数量。我将其发布为解决方案,以防其他人遇到它。一位工作同事将我引导至http://support.microsoft.com/kb/2711085 上提供的修补程序

【讨论】:

  • 您的问题涉及 Windows Server 2008 R2,但该知识库文章是关于 Windows Server 2008 而非 R2。
【解决方案2】:

在 Windows 7/Windows Server 2008 R2 之前,逻辑处理器的最大数量被限制为 CPU 寄存器的大小:32 位操作系统为 32,64 位操作系统为 64系统。这是因为对单个寄存器大小的值进行原子操作很容易。

为了与假定处理器数量永远不会超过 32 的 32 位应用程序兼容,GetSystemInfo 返回的 SYSTEM_INFO 结构的 dwNumberOfProcessors 结构上限为 32。32 位进程可以调用 @ 987654324@ 获取 64 位视图。 .NET 的 Environment.ProcessorCount 属性调用 GetSystemInfo。

Windows 7/2008 R2 使用更新的内核,将支持的处理器内核数量从 64 个更改为 256 个,并取消了一些内核锁定。为了与旧应用程序兼容,Windows 7 引入了处理器组的概念。所有处理处理器掩码的旧 API 现在都在进程的 组 内的处理器上运行,而不是在所有处理器上运行。对于 64 个或更少的处理器,只有一组,但 Windows 7 最多支持 4 组。 Windows 8/Server 2012 支持 10 个。(32 位操作系统不能使用超过 32 个逻辑处理器,并且总是一组。)如果您想了解实际的内核数量及其排列,您必须致电 @987654327 @。

我找不到任何明确说明的信息,但我希望 NUMBER_OF_PROCESSORS 出于同样的原因被封顶,并且 32 位进程的环境上限为 32。

Windows Server 2008 R2 确实是用词不当。这意味着与 Windows Server 2008 相比,Windows 的核心变化很小,而事实并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2013-01-12
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多