好的,所以我在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个核心。
答案 0 :(得分:6)
感谢您的协助,但我发现了问题。正如我所料,这是由于AMD的设计。他们正在使用一种名为MCM(我认为是多芯片模块)的新架构,导致Windows无法正确识别核心数量。我发布这个作为解决方案,万一其他人遇到它。一位工作同事指导我使用http://support.microsoft.com/kb/2711085
提供的修补程序答案 1 :(得分:3)
在Windows 7 / Windows Server 2008 R2 之前,逻辑处理器的最大数量限制为CPU寄存器的大小:32位操作系统为32位,64位为64位系统。这是因为在单个寄存器大小的值上进行原子操作很容易。
为了与假定处理器数量永远不会超过32的32位应用程序兼容,SYSTEM_INFO
返回的dwNumberOfProcessors
结构GetSystemInfo
结构的上限为32。 -bit进程可以调用GetNativeSystemInfo
来获取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个逻辑处理器,并且始终只有一个组。)如果要查找实际的核心数及其排列,则必须调用{{ 1}}。
我找不到任何明确说明的信息,但我希望GetActiveProcessorCount
出于同样的原因被限制,并且32位进程的上限为32。
Windows Server 2008 R2真的是用词不当。这意味着与Windows Server 2008相比,Windows核心的变化微乎其微,而事实并非如此。