如何获得正确数量的逻辑处理器

时间:2019-08-07 09:08:51

标签: delphi cpu hyperthreading system-information

在Delphi中,我们需要知道用于并行化的CPU数量。到目前为止,我们已经使用了GetNativeSystemInfo()函数,该函数在带有超线程的服务器上也能正常工作。

但是现在,我们有一台服务器(Intel Xeon Gold 6230)具有40个物理处理器和80个具有超线程的逻辑处理器,而GetNativeSystemInfo()仅显示40个CPU。

我们制作了一个使用3个调用的小型测试程序:

  1. GetNativeSystemInfo()

  2. GetLogicalProcessorInformation()(来自How to detect number of logical and physical processors efficiently?的代码)

  3. 并查看注册表中的CPU数量:

    计算机\ HKEY_LOCAL_MACHINE \硬件\ DESCRIPTION \ System \ CentralProcessor

对于我们所有的服务器,这3个调用给出了相同数量的CPU:

image

但是对于Intel Xeon,只有注册表为我们提供了80个CPU:

image

有人知道为什么它不能在Intel服务器上运行,还是知道一种确保获得最大CPU数量的方法?

2 个答案:

答案 0 :(得分:9)

GetLogicalProcessorInformation文档中,我找到了这一部分:

  

在具有64个以上逻辑处理器的系统上,   GetLogicalProcessorInformation函数检索逻辑处理器   有关processor group中的处理器的信息,   当前已分配调用线程。使用   GetLogicalProcessorInformationEx函数来检索信息   关于系统上所有处理器组中的处理器的信息。

因此,请尝试使用GetLogicalProcessorInformationEx

答案 1 :(得分:2)

要查询大于64的逻辑处理器,您必须使用更新的GetLogicalProcessorInformationEx API,NumCPULib4Pascal库以易于使用的方式包装了该API。

不幸的是,我无法在此处粘贴完整的代码,因为它不适合StackOverflow的字数限制。

下面的示例用法:

uses
  NumCPULib;

var
  lcc, pcc: Int32;
begin
  // count logical cpus
 lcc := TNumCPULib.GetLogicalCPUCount();
  // count physical cpus
 pcc := TNumCPULib.GetPhysicalCPUCount();
end;