以可编程方式获取Windows上硬件线程数的可靠方法

ben*_*ben 8 c++ windows winapi multithreading

我很难找到一种可靠的方法来获取Windows上的硬件线程数量.我在具有双CPU Intel Xeon E5-2699 v3 @ 2.30GHz的计算机上运行Windows 7 Professional SP1 64位,共计36个内核和72个线程.我已经尝试了不同的方法来获取内核的数量,我发现其中只有两个似乎在32位或64位进程中准确工作.这是我的结果:

+------------------------------------------------+----------------+----------------+
|                    Methods                     | 32-bit process | 64-bit process |
+------------------------------------------------+----------------+----------------+
| GetSystemInfo->dwNumberOfProcessors            |             32 |             36 |
| GetNativeSystemInfo->dwNumberOfProcessors      |             36 |             36 |
| GetLogicalProcessorInformation                 |             36 |             36 |
| GetProcessAffinityMask.processAffinityMask     |             32 |             32 |
| GetProcessAffinityMask.systemAffinityMask      |             32 |             32 |
| omp_get_num_procs                              |             32 |             36 |
| getenv("NUMBER_OF_PROCESSORS")                 |             36 |             36 |
| GetActiveProcessorCount(ALL_PROCESSOR_GROUPS)  |             64 |             72 |
| GetMaximumProcessorCount(ALL_PROCESSOR_GROUPS) |             64 |             72 |
| boost::thread::hardware_concurrency()          |             32 |             36 |
| Performance counter API                        |             36 |             36 |
| WMI                                            |             72 |             72 |
| HARDWARE\DESCRIPTION\System\CentralProcessor   |             72 |             72 |
+------------------------------------------------+----------------+----------------+

我不解释为什么所有这些函数都返回不同的值.对我来说似乎只有两种可靠的方法是使用WMI(但相当复杂)或者只是在Windows注册表中读取以下密钥:HARDWARE\DESCRIPTION\System\CentralProcessor.

你怎么看?您确认WMI和注册表项方法是唯一可靠的方法吗?

提前致谢

Dav*_*nan 8

您需要的API函数是GetLogicalProcessorInformationEx.由于您拥有超过64个处理器,因此您的处理器已分组.GetLogicalProcessorInformation仅报告当前分配线程的处理器组中的处理器.你需要用来GetLogicalProcessorInformationEx克服这个限制.

文件说:

在具有超过64个逻辑处理器的系统上,GetLogicalProcessorInformation函数检索有关当前为其分配调用线程的处理器组中的处理器的逻辑处理器信息.使用GetLogicalProcessorInformationEx函数检索有关系统上所有处理器组中处理器的信息.