[英]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。 以下英特尔代码示例将是一个很好的起点。
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.