2

我有一些代码需要知道我的特定机器上有多少实际内核可用,以及是否启用了超线程。

有没有办法在 C# 中做到这一点?

更新:这些机器是 XP 和 Vista 的混合体

更新:访问“Win32_Processor.NumberOfCores”或“Win32_Processor.NumberOfLogicalProcessors”会在其中一台机器(但不是全部)上引发异常(带有消息“未找到”的 ManagmentException)

4

6 回答 6

3

在 Vista 和更高版本上,您可以通过 PInvoke 使用 GetLogicalProcessorInformation 来获取逻辑处理器单元的数量。

在 Windows XP 上,无法通过 C# 可靠地将超线程与其他多处理器/内核配置区分开来。有人发布的 WMI 解决方案将多核处理器归类为超线程。

在 Vista 之前,唯一可靠的方法是检查处理器的 CPUID。要使用它,您可以创建一个可以从托管代码调用的本机 DLL。以下英特尔代码示例将是一个很好的起点。

于 2009-02-12T20:22:54.983 回答
2

至少对第一个问题的简单回答:Environment.ProcessorCount应该返回机器上的内核数。

编辑是一种检查是否启用超线程的非基于 WMI 的方法(并不是说它一定更好)。另见这篇文章。

于 2009-02-12T20:20:28.670 回答
1

System.Environment.ProcessorCount 将告诉您运行代码的机器上有多少个内核。

于 2009-02-12T20:18:37.600 回答
1

检查 Environment.ProcessorCount 属性,它会返回一个整数,至于超线程,我不确定。

于 2009-02-12T20:19:14.790 回答
0

StackOverflow 问题 188503有你需要的信息...

引用该问题的最佳答案:

System.Environment.ProcessorCount

返回逻辑处理器的数量(参见MSDN

要区分超线程和单独的内核,听起来好像您需要一点 WMI。

于 2009-02-12T20:24:06.307 回答
0

GetLogicalProcessorInformation足以满足 HT 方面的需求,但遗憾的是它仅在 XP SP3、64 位 XP/Vista/Server 2003 中可用(我相信在 vista 前略有损坏)

Joe Duffy将其封装在 c# 中,但尚未发布源代码,尽管 Mark Russinovich 已经发布了他用它创建的工具 (Coreinfo),您可能可以反编译它以查看代码。

于 2009-02-12T20:49:17.010 回答