如何判断我的程序运行的机器是否使用超线程? (C#)

时间:2009-02-12 20:15:05

标签: c# hyperthreading

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

有没有办法在C#中执行此操作?

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

更新:访问'Win32_Processor.NumberOfCores'或'Win32_Processor.NumberOfLogicalProcessors'会在其中一台机器上抛出异常(ManagmentException,并显示“Not Found”消息)

6 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

编辑Here是一种基于非WMI的方法,用于检查是否启用了超线程(并非必须更好)。另请参阅this文章。

答案 2 :(得分:1)

System.Environment.ProcessorCount将告诉您运行代码的计算机上存在多少个核心。

答案 3 :(得分:1)

检查Environment.ProcessorCount属性,它会返回一个整数,就HyperThreading而言,我不确定。

答案 4 :(得分:0)

StackOverflow question 188503拥有您需要的信息......

引用该问题的最佳答案:

System.Environment.ProcessorCount

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

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

答案 5 :(得分:0)

GetLogicalProcessorInformation足以满足HT方面的需求,但遗憾的是它仅适用于XP SP3,64位XP / Vista / Server 2003(我相信它在预览时略有损坏)

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