我有一些代码需要知道我的特定机器上有多少实际内核可用,以及是否启用了超线程。
有没有办法在 C# 中做到这一点?
更新:这些机器是 XP 和 Vista 的混合体
更新:访问“Win32_Processor.NumberOfCores”或“Win32_Processor.NumberOfLogicalProcessors”会在其中一台机器(但不是全部)上引发异常(带有消息“未找到”的 ManagmentException)
我有一些代码需要知道我的特定机器上有多少实际内核可用,以及是否启用了超线程。
有没有办法在 C# 中做到这一点?
更新:这些机器是 XP 和 Vista 的混合体
更新:访问“Win32_Processor.NumberOfCores”或“Win32_Processor.NumberOfLogicalProcessors”会在其中一台机器(但不是全部)上引发异常(带有消息“未找到”的 ManagmentException)
在 Vista 和更高版本上,您可以通过 PInvoke 使用 GetLogicalProcessorInformation 来获取逻辑处理器单元的数量。
在 Windows XP 上,无法通过 C# 可靠地将超线程与其他多处理器/内核配置区分开来。有人发布的 WMI 解决方案将多核处理器归类为超线程。
在 Vista 之前,唯一可靠的方法是检查处理器的 CPUID。要使用它,您可以创建一个可以从托管代码调用的本机 DLL。以下英特尔代码示例将是一个很好的起点。
System.Environment.ProcessorCount 将告诉您运行代码的机器上有多少个内核。
检查 Environment.ProcessorCount 属性,它会返回一个整数,至于超线程,我不确定。
StackOverflow 问题 188503有你需要的信息...
引用该问题的最佳答案:
System.Environment.ProcessorCount
返回逻辑处理器的数量(参见MSDN)
要区分超线程和单独的内核,听起来好像您需要一点 WMI。
GetLogicalProcessorInformation足以满足 HT 方面的需求,但遗憾的是它仅在 XP SP3、64 位 XP/Vista/Server 2003 中可用(我相信在 vista 前略有损坏)
Joe Duffy将其封装在 c# 中,但尚未发布源代码,尽管 Mark Russinovich 已经发布了他用它创建的工具 (Coreinfo),您可能可以反编译它以查看代码。