繁体   English   中英

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

[英]How do I tell if the machine my program is running on uses hyperthreading? (C#)

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

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

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

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

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

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

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

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

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

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

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

StackOverflow问题188503具有您需要的信息...

引用该问题的最高答案:

System.Environment.ProcessorCount

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

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

GetLogicalProcessorInformation对于HT方面已足够,但可悲的是,它仅在XP SP3、64位XP / Vista / Server 2003中可用(并且我相信在Vista之前会有些许中断)

乔·达菲(Joe Duffy)将其包装在c#中,但尚未发布源代码,尽管马克·鲁西诺维奇(Mark Russinovich)已发布了他使用它创建的工具(Coreinfo),可能您可以对其进行反编译以查看代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM