【发布时间】:2019-12-14 21:05:44
【问题描述】:
在 Delphi 中,我们需要知道用于并行化的 CPU 数量。到目前为止,我们一直使用GetNativeSystemInfo() 函数,该函数运行良好,也适用于具有超线程的服务器。
但是现在,我们有一个服务器(Intel Xeon Gold 6230),有 40 个物理处理器和 80 个超线程逻辑处理器,而GetNativeSystemInfo() 只显示 40 个 CPU。
我们做了一个使用 3 次调用的小测试程序:
-
GetNativeSystemInfo() -
GetLogicalProcessorInformation()(来自How to detect number of logical and physical processors efficiently?的代码) -
并查看注册表中的 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