【问题标题】:How to get correct number of logical processors如何获得正确数量的逻辑处理器
【发布时间】:2019-12-14 21:05:44
【问题描述】:

在 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\HARDWARE\DESCRIPTION\System\CentralProcessor

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

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

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

【问题讨论】:

  • 我个人使用GetLogicalProcessorInformationEx,这可能是Fabrizio 给出的原因。尽管在您的机器的 BIOS 中禁用超线程并不完全令人惊讶,但考虑到超线程是无用的。您可能还需要了解处理器组SetThreadGroupAffinity,以及据我所知,没有尊重 NUMA 节点的 Delphi 内存管理器这一事实。
  • 在 MSDN 的文档中有一整章关于这个主题:Multiple Processors,尤其是Supporting Systems That Have More Than 64 Processors
  • 感谢您的帮助。这不是我们的服务器,并且超线程已打开。我们不使用 Workbench 中的 CPU,而是生成一个 Fortran 代码,该代码将使用我们告诉它执行的 CPU 数量。我们将研究 GetLogicalProcessorInformationEx

标签: delphi cpu hyperthreading system-information


【解决方案1】:

要查询大于 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;

【讨论】:

  • 恐怕有时会发生这种情况。人们通常不想批评,因为它会导致徒劳的讨论。有时还会出现报复性投票的反斜杠。有时人们只是没有时间。从我的角度来看,我会说这个答案并没有解决问题中的行为发生的原因。它并没有说明为什么这个库也不会遇到同样的问题。而且它也接近于成为仅对场外代码的链接的答案。一般来说,最好不要只提供链接答案。
  • @David Heffernan,感谢您的解释,您说得对,我的回答并没有真正回答为什么而只是倾向于提供解决方案。将使用正确的信息更新答案。
  • 我建议您将其转换为评论。
  • 感谢所有帮助。使用 NumCPULib4Pascal 库有效。
【解决方案2】:

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

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

所以尝试使用GetLogicalProcessorInformationEx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2017-09-18
    相关资源
    最近更新 更多