我有一些代码需要知道我的特定机器上有多少实际内核,以及是否启用了超线程。
有没有办法在C#中执行此操作?
更新:这些机器是XP和Vista的混合
更新:访问'Win32_Processor.NumberOfCores'或'Win32_Processor.NumberOfLogicalProcessors'会在其中一台机器上抛出异常(ManagmentException,并显示“Not Found”消息)
答案 0 :(得分:3)
在Vista及更高版本中,您可以通过PInvoke使用GetLogicalProcessorInformation来获取逻辑处理器单元的数量。
在Windows XP上,C#无法可靠地将超线程与其他多处理器/核心配置区分开来。有人发布的WMI解决方案将多核处理器归类为超线程。
在Vista之前,唯一可靠的方法是检查处理器的CPUID。要使用它,您可以创建可以从托管代码调用的本机DLL。以下英特尔代码sample将是一个很好的起点。
答案 1 :(得分:2)
至少对第一个问题的简单回答是: Environment.ProcessorCount 应该返回机器上的核心数。
答案 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),可能你可以反编译它以查看代码。