4

在 Delphi 中,我们需要知道用于并行化的 CPU 数量。到目前为止,我们已经使用了该GetNativeSystemInfo()功能,该功能运行良好,也适用于具有超线程的服务器。

但是现在,我们有一个服务器(Intel Xeon Gold 6230),它有 40 个物理处理器和 80 个超线程逻辑处理器,并且GetNativeSystemInfo()只显示了 40 个 CPU。

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

  1. GetNativeSystemInfo()

  2. GetLogicalProcessorInformation()(来自如何有效检测逻辑和物理处理器数量的代码?

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

    计算机\HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor

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

图片

但对于 Intel Xeon,只有 Registry 为我们提供了 80 个 CPU:

图片

有谁知道为什么它不适用于英特尔服务器,或者知道一种确保获得最大 CPU 数量的方法?

4

2 回答 2

9

GetLogicalProcessorInformation文档中我发现了这部分:

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

所以尝试使用GetLogicalProcessorInformationEx.

于 2019-08-07T09:19:05.320 回答
2

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

不幸的是,我不能在这里粘贴完整的代码,因为它不符合 StackOverflow 的字数限制。

下面的示例用法:

uses
  NumCPULib;

var
  lcc, pcc: Int32;
begin
  // count logical cpus
 lcc := TNumCPULib.GetLogicalCPUCount();
  // count physical cpus
 pcc := TNumCPULib.GetPhysicalCPUCount();
end;
于 2019-08-07T10:46:16.417 回答