【发布时间】: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的新芯片设计有关。有一个可用的修补程序。随着这些芯片进入流通,这可能会出现更多。